PUT /v1/objects/bucket-name/object-name
(w http.ResponseWriter, r *http.Request)
| 1018 | |
| 1019 | // PUT /v1/objects/bucket-name/object-name |
| 1020 | func (t *target) httpobjput(w http.ResponseWriter, r *http.Request) { |
| 1021 | apireq := apiReqAlloc(2, apc.URLPathObjects.L, true /*dpq*/) |
| 1022 | defer apiReqFree(apireq) |
| 1023 | if err := t.parseReq(w, r, apireq); err != nil { |
| 1024 | return |
| 1025 | } |
| 1026 | |
| 1027 | // prep and check |
| 1028 | var ( |
| 1029 | config = cmn.GCO.Get() |
| 1030 | objName = apireq.items[1] |
| 1031 | started = time.Now() |
| 1032 | t2tput = isT2TPut(r.Header) |
| 1033 | ) |
| 1034 | if apireq.dpq.ptime == "" { |
| 1035 | if !t2tput { |
| 1036 | t.writeErrf(w, r, "%s: %s(obj) is expected to be redirected or replicated", t.si, r.Method) |
| 1037 | return |
| 1038 | } |
| 1039 | } else if redelta := ptLatency(started.UnixNano(), apireq.dpq.ptime); redelta != 0 { |
| 1040 | t.statsT.Add(stats.PutRedirLatency, redelta) |
| 1041 | } |
| 1042 | if cs := fs.GetCapStatus(); cs.Err != nil || cs.PctMax > int32(config.Space.CleanupWM) { |
| 1043 | cs = t.OOS(nil) |
| 1044 | if cs.OOS { |
| 1045 | // fail this write |
| 1046 | t.writeErr(w, r, cs.Err, http.StatusInsufficientStorage) |
| 1047 | return |
| 1048 | } |
| 1049 | } |
| 1050 | |
| 1051 | // init |
| 1052 | lom := cluster.AllocLOM(objName) |
| 1053 | defer cluster.FreeLOM(lom) |
| 1054 | if err := lom.InitBck(apireq.bck.Bucket()); err != nil { |
| 1055 | if cmn.IsErrRemoteBckNotFound(err) { |
| 1056 | t.BMDVersionFixup(r) |
| 1057 | err = lom.InitBck(apireq.bck.Bucket()) |
| 1058 | } |
| 1059 | if err != nil { |
| 1060 | t.writeErr(w, r, err) |
| 1061 | return |
| 1062 | } |
| 1063 | } |
| 1064 | |
| 1065 | // load (maybe) |
| 1066 | var ( |
| 1067 | errdb error |
| 1068 | skipVC = cmn.Features.IsSet(feat.SkipVC) || cos.IsParseBool(apireq.dpq.skipVC) // apc.QparamSkipVC |
| 1069 | ) |
| 1070 | if skipVC { |
| 1071 | errdb = lom.AllowDisconnectedBackend(false) |
| 1072 | } else if lom.Load(true, false) == nil { |
| 1073 | errdb = lom.AllowDisconnectedBackend(true) |
| 1074 | } |
| 1075 | if errdb != nil { |
| 1076 | t.writeErr(w, r, errdb) |
| 1077 | return |
no test coverage detected