MCPcopy
hub / github.com/NVIDIA/aistore / headObject

Method headObject

ais/target.go:1197–1306  ·  view source on GitHub ↗

headObject is main function to head the object. It doesn't check request origin, so it must be done by the caller (if necessary).

(w http.ResponseWriter, r *http.Request, query url.Values, bck *cluster.Bck, lom *cluster.LOM)

Source from the content-addressed store, hash-verified

1195// headObject is main function to head the object. It doesn't check request origin,
1196// so it must be done by the caller (if necessary).
1197func (t *target) headObject(w http.ResponseWriter, r *http.Request, query url.Values, bck *cluster.Bck, lom *cluster.LOM) {
1198 var (
1199 mustBeLocal int
1200 invalidHandler = t.writeErr
1201 hdr = w.Header()
1202 silent = cos.IsParseBool(query.Get(apc.QparamSilent))
1203 exists = true
1204 hasEC bool
1205 )
1206 if silent {
1207 invalidHandler = t.writeErrSilent
1208 }
1209 if tmp := query.Get(apc.QparamHeadObj); tmp != "" {
1210 mustBeLocal, _ = strconv.Atoi(tmp)
1211 }
1212 if err := lom.InitBck(bck.Bucket()); err != nil {
1213 invalidHandler(w, r, err)
1214 return
1215 }
1216 err := lom.Load(true /*cache it*/, false /*locked*/)
1217 if err == nil {
1218 if mustBeLocal > 0 {
1219 return
1220 }
1221 } else {
1222 if !cmn.IsObjNotExist(err) {
1223 invalidHandler(w, r, err)
1224 return
1225 }
1226 exists = false
1227 if (mustBeLocal == apc.HeadObjAvoidRemote && lom.HasCopies()) ||
1228 mustBeLocal == apc.HeadObjAvoidRemoteCheckAllMps {
1229 exists = lom.RestoreToLocation()
1230 }
1231 }
1232 if !exists && (mustBeLocal > 0 || lom.Bck().IsAIS()) {
1233 err := cmn.NewErrNotFound("%s: object %s", t.si, lom.FullName())
1234 invalidHandler(w, r, err, http.StatusNotFound)
1235 return
1236 }
1237
1238 // props
1239 op := cmn.ObjectProps{Name: lom.ObjName, Bck: *lom.Bucket(), Present: exists}
1240 if lom.Bck().IsAIS() {
1241 op.ObjAttrs = *lom.ObjAttrs()
1242 } else if exists {
1243 op.ObjAttrs = *lom.ObjAttrs()
1244 } else {
1245 // cold HEAD
1246 objAttrs, errCode, err := t.Backend(lom.Bck()).HeadObj(context.Background(), lom)
1247 if err != nil {
1248 invalidHandler(w, r, cmn.NewErrFailedTo(t, "HEAD", lom, err), errCode)
1249 return
1250 }
1251 op.ObjAttrs = *objAttrs
1252 }
1253 if exists {
1254 op.DaemonID = t.Snode().ID()

Callers 3

httpobjheadMethod · 0.95
headObjS3Method · 0.95
headObjectETLMethod · 0.95

Calls 15

BackendMethod · 0.95
IsParseBoolFunction · 0.92
IsObjNotExistFunction · 0.92
NewErrNotFoundFunction · 0.92
NewErrFailedToFunction · 0.92
ObjectMetadataFunction · 0.92
ToHeaderFunction · 0.92
IterFieldsFunction · 0.92
PropToHeaderFunction · 0.92
FuncFunction · 0.92
AssertfFunction · 0.92
AssertNoErrFunction · 0.92

Tested by

no test coverage detected