From 3d1f710485fe51f105ee6de61a6a932afa87cbd7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 20 Jan 2026 18:08:40 -0800 Subject: [PATCH] remove the .versions directory when all versions are deleted --- weed/s3api/s3api_object_versioning.go | 29 ++++++++++++++++----------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/weed/s3api/s3api_object_versioning.go b/weed/s3api/s3api_object_versioning.go index 44367b5de..b8695f7e6 100644 --- a/weed/s3api/s3api_object_versioning.go +++ b/weed/s3api/s3api_object_versioning.go @@ -1030,20 +1030,25 @@ func (s3a *S3ApiServer) updateLatestVersionAfterDeletion(bucket, object string) setCachedListMetadata(versionsEntry, latestVersionEntry) glog.V(2).Infof("updateLatestVersionAfterDeletion: new latest version for %s/%s is %s", bucket, object, latestVersionId) + // Update the .versions directory entry with new latest version metadata + err = s3a.mkFile(bucketDir, versionsObjectPath, versionsEntry.Chunks, func(updatedEntry *filer_pb.Entry) { + updatedEntry.Extended = versionsEntry.Extended + updatedEntry.Attributes = versionsEntry.Attributes + updatedEntry.Chunks = versionsEntry.Chunks + }) + if err != nil { + return fmt.Errorf("failed to update .versions directory metadata: %v", err) + } } else { - // No versions left, remove all cached metadata - clearCachedListMetadata(versionsEntry.Extended) - glog.V(2).Infof("updateLatestVersionAfterDeletion: no versions left for %s/%s", bucket, object) - } + // No versions left - delete the .versions metadata file entirely + // This prevents clients from seeing an empty .versions file + glog.V(2).Infof("updateLatestVersionAfterDeletion: no versions left for %s/%s, deleting .versions metadata file", bucket, object) - // Update the .versions directory entry - err = s3a.mkFile(bucketDir, versionsObjectPath, versionsEntry.Chunks, func(updatedEntry *filer_pb.Entry) { - updatedEntry.Extended = versionsEntry.Extended - updatedEntry.Attributes = versionsEntry.Attributes - updatedEntry.Chunks = versionsEntry.Chunks - }) - if err != nil { - return fmt.Errorf("failed to update .versions directory metadata: %v", err) + err = s3a.rm(bucketDir, versionsObjectPath, true, false) + if err != nil { + glog.Warningf("updateLatestVersionAfterDeletion: failed to delete .versions metadata file for %s/%s: %v", bucket, object, err) + // Don't return error - the versions are already deleted, this is just cleanup + } } return nil