Browse Source

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.
s3-remote-cache-singleflight
Chris Lu 2 days ago
committed by GitHub
parent
commit
697b56003d
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 27
      weed/s3api/s3api_object_versioning.go

27
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}
}
}

Loading…
Cancel
Save