Browse Source

skip retry if object is not found

pull/7481/head
chrislu 3 weeks ago
parent
commit
8e379d1415
  1. 16
      weed/s3api/s3api_object_handlers.go

16
weed/s3api/s3api_object_handlers.go

@ -1273,7 +1273,8 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request
// Request for latest version - OPTIMIZATION: // Request for latest version - OPTIMIZATION:
// Check if .versions/ directory exists quickly (no retries) to decide path // Check if .versions/ directory exists quickly (no retries) to decide path
// - If .versions/ exists: real versions available, use getLatestObjectVersion // - If .versions/ exists: real versions available, use getLatestObjectVersion
// - If .versions/ doesn't exist: only null version at regular path, use it directly
// - If .versions/ doesn't exist (ErrNotFound): only null version at regular path, use it directly
// - If transient error: fall back to getLatestObjectVersion which has retry logic
bucketDir := s3a.option.BucketsPath + "/" + bucket bucketDir := s3a.option.BucketsPath + "/" + bucket
normalizedObject := removeDuplicateSlashes(object) normalizedObject := removeDuplicateSlashes(object)
versionsDir := normalizedObject + s3_constants.VersionsFolder versionsDir := normalizedObject + s3_constants.VersionsFolder
@ -1290,8 +1291,8 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
return return
} }
} else {
// .versions/ doesn't exist, check regular path for null version
} else if errors.Is(versionsErr, filer_pb.ErrNotFound) {
// .versions/ doesn't exist (confirmed not found), check regular path for null version
regularEntry, regularErr := s3a.getEntry(bucketDir, normalizedObject) regularEntry, regularErr := s3a.getEntry(bucketDir, normalizedObject)
if regularErr == nil && regularEntry != nil { if regularErr == nil && regularEntry != nil {
// Found object at regular path - this is the null version // Found object at regular path - this is the null version
@ -1303,6 +1304,15 @@ func (s3a *S3ApiServer) HeadObjectHandler(w http.ResponseWriter, r *http.Request
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
return return
} }
} else {
// Transient error checking .versions/, fall back to getLatestObjectVersion with retries
glog.V(2).Infof("HeadObject: transient error checking .versions for %s%s: %v, falling back to getLatestObjectVersion", bucket, object, versionsErr)
entry, err = s3a.getLatestObjectVersion(bucket, object)
if err != nil {
glog.Errorf("HeadObject: Failed to get latest version for %s%s: %v", bucket, object, err)
s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey)
return
}
} }
// Safety check: entry must be valid after successful retrieval // Safety check: entry must be valid after successful retrieval
if entry == nil { if entry == nil {

Loading…
Cancel
Save