From 309cb32416b365a0f329b6ec1cf3efb66fdefb24 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 6 Jun 2026 18:02:33 -0700 Subject: [PATCH] s3: list directory key objects in versioned bucket version listings (#9842) ListObjectVersions gated explicit directory objects on Mime == FolderMimeType, but an SDK PutObject of "dir/" carries a default Content-Type (e.g. application/octet-stream), so those directory keys were dropped from the version listing while ListObjectsV2 - which keys off IsDirectoryKeyObject (any non-empty mime) - still showed them. Use the same IsDirectoryKeyObject check so the two listings agree. The directory test's storage-class assertion compared an ObjectStorageClass constant against ObjectVersion.StorageClass (ObjectVersionStorageClass); the values matched but the SDK enum types did not, so it only surfaced once the directories started appearing. Use the matching constant. --- test/s3/versioning/s3_directory_versioning_test.go | 2 +- weed/s3api/s3api_object_versioning.go | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/test/s3/versioning/s3_directory_versioning_test.go b/test/s3/versioning/s3_directory_versioning_test.go index 7126c70b0..9138eac7e 100644 --- a/test/s3/versioning/s3_directory_versioning_test.go +++ b/test/s3/versioning/s3_directory_versioning_test.go @@ -122,7 +122,7 @@ func TestListObjectVersionsIncludesDirectories(t *testing.T) { assert.Equal(t, int64(0), *version.Size, "Directory %s should have size 0", expectedDir) assert.True(t, *version.IsLatest, "Directory %s should be marked as latest", expectedDir) assert.Equal(t, "\"d41d8cd98f00b204e9800998ecf8427e\"", *version.ETag, "Directory %s should have MD5 of empty string as ETag", expectedDir) - assert.Equal(t, types.ObjectStorageClassStandard, version.StorageClass, "Directory %s should have STANDARD storage class", expectedDir) + assert.Equal(t, types.ObjectVersionStorageClassStandard, version.StorageClass, "Directory %s should have STANDARD storage class", expectedDir) break } } diff --git a/weed/s3api/s3api_object_versioning.go b/weed/s3api/s3api_object_versioning.go index a1f0f4d83..53ae975f1 100644 --- a/weed/s3api/s3api_object_versioning.go +++ b/weed/s3api/s3api_object_versioning.go @@ -802,8 +802,11 @@ func (vc *versionCollector) collectVersions(currentPath, relativePath string) er // processDirectory handles directory entries func (vc *versionCollector) processDirectory(currentPath, entryPath string, entry *filer_pb.Entry) error { - // Handle explicit S3 directory object - if entry.Attributes.Mime == s3_constants.FolderMimeType { + // Handle explicit S3 directory object. Match ListObjectsV2's + // IsDirectoryKeyObject (any non-empty mime), not just FolderMimeType: + // an SDK PutObject of "dir/" carries a default Content-Type, so the two + // listings must agree on what counts as a directory key. + if entry.IsDirectoryKeyObject() { vc.processExplicitDirectory(entryPath, entry) }