From 920678afb55a60fcb0d45d5b6f5b26ce0ea8dfde Mon Sep 17 00:00:00 2001 From: chrislu Date: Tue, 18 Nov 2025 11:48:30 -0800 Subject: [PATCH] Consolidate nil entry checks in GetObjectHandler --- weed/s3api/s3api_object_handlers.go | 46 +++++++++-------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/weed/s3api/s3api_object_handlers.go b/weed/s3api/s3api_object_handlers.go index 6dd760859..9d5369aae 100644 --- a/weed/s3api/s3api_object_handlers.go +++ b/weed/s3api/s3api_object_handlers.go @@ -347,20 +347,14 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) if versionId != "" { // Request for specific version - must look in .versions directory - glog.V(3).Infof("GetObject: requesting specific version %s for %s%s", versionId, bucket, object) - entry, err = s3a.getSpecificObjectVersion(bucket, object, versionId) - if err != nil { - glog.Errorf("Failed to get specific version %s: %v", versionId, err) - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) - return - } - // Safety check: entry must be valid after successful retrieval - if entry == nil { - glog.Errorf("GetObject: getSpecificObjectVersion returned nil entry without error for version %s", versionId) - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) - return - } - targetVersionId = versionId + glog.V(3).Infof("GetObject: requesting specific version %s for %s%s", versionId, bucket, object) + entry, err = s3a.getSpecificObjectVersion(bucket, object, versionId) + if err != nil { + glog.Errorf("Failed to get specific version %s: %v", versionId, err) + s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) + return + } + targetVersionId = versionId } else { // Request for latest version - OPTIMIZATION: // Check if .versions/ directory exists quickly (no retries) to decide path @@ -398,21 +392,15 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) } } else { // Transient error checking .versions/, fall back to getLatestObjectVersion with retries - glog.V(2).Infof("GetObject: 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("GetObject: 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 - if entry == nil { - glog.Errorf("GetObject: entry is nil after versioned lookup for %s%s", bucket, object) + glog.V(2).Infof("GetObject: 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("GetObject: Failed to get latest version for %s%s: %v", bucket, object, err) s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) return } - // Extract version ID if not already set + } + // Extract version ID if not already set if targetVersionId == "" { if entry.Extended != nil { if versionIdBytes, exists := entry.Extended[s3_constants.ExtVersionIdKey]; exists { @@ -459,12 +447,6 @@ func (s3a *S3ApiServer) GetObjectHandler(w http.ResponseWriter, r *http.Request) if versioningConfigured { // For versioned objects, reuse the already-fetched entry objectEntryForSSE = entry - // Safety check - this should never happen as versioned path handles errors above - if objectEntryForSSE == nil { - glog.Errorf("GetObjectHandler: unexpected nil entry for versioned object %s/%s", bucket, object) - s3err.WriteErrorResponse(w, r, s3err.ErrNoSuchKey) - return - } } else { // For non-versioned objects, try to reuse entry from conditional header check if result.Entry != nil {