Fix for DeleteMultipleObjectsHandler wrongly deleting parent folders ()

What problem are we solving?
Fix: 

How are we solving the problem?
We check for the AllowEmptyFolders option prior to cascade
deleting parent folders in S3 DeleteMultipleObjectsHandler.

How is the PR tested?
We ran SeaweedFS in a Kubernetes Cluster with a joint Filer
and S3 server in one container, with leveldb2 as the filer storage,
and AllowEmptyFolders set to true.

When using the Distribution Registry as the S3 client, it calls the
DeleteMultipleObjectsHandler as part of the artifact upload process
(uploads to a temp location, then performs a copy and delete).
Without this fix, the deletion cascade deleted parent folder until
the entire contents of the bucket were gone.

With this fix, the existing content of the bucket remained, and the
newly uploaded content was added.

Checks
[ ] I have added unit tests if possible.
[ ] I will add related wiki document changes and link to this PR after merging.

Co-authored-by: Chris Lu <chrislusf@users.noreply.github.com>
This commit is contained in:
Warren Hodgkinson 2024-12-20 02:00:08 +00:00 committed by GitHub
parent 4d91ec359b
commit a1a76ccb8c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -3,12 +3,13 @@ package s3api
import (
"encoding/xml"
"fmt"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
"golang.org/x/exp/slices"
"io"
"net/http"
"strings"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
"golang.org/x/exp/slices"
"github.com/seaweedfs/seaweedfs/weed/filer"
"github.com/seaweedfs/seaweedfs/weed/s3api/s3err"
@ -157,6 +158,10 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h
}
}
if s3a.option.AllowEmptyFolder {
return nil
}
// purge empty folders, only checking folders with deletions
for len(directoriesWithDeletion) > 0 {
directoriesWithDeletion = s3a.doDeleteEmptyDirectories(client, directoriesWithDeletion)