From 697b56003dde030fd46cc8a85cdeca417947ab8a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 16 Dec 2025 09:53:29 -0800 Subject: [PATCH] s3: reduce ObjectVersion memory by not retaining full Entry (#7786) s3: fix fallback owner lookup to use specific version Address review feedback: the fallback logic was incorrectly using getLatestObjectVersion which returns the wrong owner when different versions have different owners. Fix by using getSpecificObjectVersion with the version.VersionId to fetch the correct entry for the specific version being processed. This also simplifies the code by removing the separate null version handling since getSpecificObjectVersion already handles that case. --- weed/s3api/s3api_object_versioning.go | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/weed/s3api/s3api_object_versioning.go b/weed/s3api/s3api_object_versioning.go index ac652c3f1..c82f797f1 100644 --- a/weed/s3api/s3api_object_versioning.go +++ b/weed/s3api/s3api_object_versioning.go @@ -1064,26 +1064,13 @@ func (s3a *S3ApiServer) getObjectOwnerFromVersion(version *ObjectVersion, bucket return CanonicalUser{ID: version.OwnerID, DisplayName: ownerDisplayName} } - // Fallback: try to get owner from the current version of the object - // This handles cases where older versions might not have owner metadata - if version.VersionId == "null" { - // For null version, check the regular object file - bucketDir := s3a.option.BucketsPath + "/" + bucket - if entry, err := s3a.getEntry(bucketDir, objectKey); err == nil && entry.Extended != nil { - if ownerBytes, exists := entry.Extended[s3_constants.ExtAmzOwnerKey]; exists { - ownerId := string(ownerBytes) - ownerDisplayName := s3a.iam.GetAccountNameById(ownerId) - return CanonicalUser{ID: ownerId, DisplayName: ownerDisplayName} - } - } - } else { - // For versioned objects, try to get from latest version metadata - if latestVersion, err := s3a.getLatestObjectVersion(bucket, objectKey); err == nil && latestVersion.Extended != nil { - if ownerBytes, exists := latestVersion.Extended[s3_constants.ExtAmzOwnerKey]; exists { - ownerId := string(ownerBytes) - ownerDisplayName := s3a.iam.GetAccountNameById(ownerId) - return CanonicalUser{ID: ownerId, DisplayName: ownerDisplayName} - } + // Fallback: fetch the specific version entry to get the owner + // This handles cases where OwnerID wasn't populated during listing + if specificVersionEntry, err := s3a.getSpecificObjectVersion(bucket, objectKey, version.VersionId); err == nil && specificVersionEntry.Extended != nil { + if ownerBytes, exists := specificVersionEntry.Extended[s3_constants.ExtAmzOwnerKey]; exists { + ownerId := string(ownerBytes) + ownerDisplayName := s3a.iam.GetAccountNameById(ownerId) + return CanonicalUser{ID: ownerId, DisplayName: ownerDisplayName} } }