aboutsummaryrefslogtreecommitdiff
path: root/weed/admin/dash/admin_server.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/admin/dash/admin_server.go')
-rw-r--r--weed/admin/dash/admin_server.go41
1 files changed, 34 insertions, 7 deletions
diff --git a/weed/admin/dash/admin_server.go b/weed/admin/dash/admin_server.go
index eeeccf981..c62b9da07 100644
--- a/weed/admin/dash/admin_server.go
+++ b/weed/admin/dash/admin_server.go
@@ -30,6 +30,11 @@ import (
"github.com/seaweedfs/seaweedfs/weed/worker/tasks"
)
+const (
+ // DefaultBucketsPath is the default path for S3 buckets in the filer
+ DefaultBucketsPath = "/buckets"
+)
+
type AdminServer struct {
masterClient *wdclient.MasterClient
templateFS http.FileSystem
@@ -271,7 +276,7 @@ func (s *AdminServer) GetS3Buckets() ([]S3Bucket, error) {
err = s.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
// List buckets by looking at the /buckets directory
stream, err := client.ListEntries(context.Background(), &filer_pb.ListEntriesRequest{
- Directory: "/buckets",
+ Directory: DefaultBucketsPath,
Prefix: "",
StartFromFileName: "",
InclusiveStartFrom: false,
@@ -381,7 +386,7 @@ func (s *AdminServer) GetBucketDetails(bucketName string) (*BucketDetails, error
err := s.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
// Get bucket info
bucketResp, err := client.LookupDirectoryEntry(context.Background(), &filer_pb.LookupDirectoryEntryRequest{
- Directory: "/buckets",
+ Directory: DefaultBucketsPath,
Name: bucketName,
})
if err != nil {
@@ -506,14 +511,36 @@ func (s *AdminServer) CreateS3Bucket(bucketName string) error {
// DeleteS3Bucket deletes an S3 bucket and all its contents
func (s *AdminServer) DeleteS3Bucket(bucketName string) error {
+ // First, check if bucket has Object Lock enabled and if there are locked objects
+ ctx := context.Background()
+ err := s.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
+ return s3api.CheckBucketForLockedObjects(ctx, client, DefaultBucketsPath, bucketName)
+ })
+ if err != nil {
+ return err
+ }
+
+ // Delete the collection first (same as s3.bucket.delete shell command)
+ // This ensures volume data is cleaned up properly
+ err = s.WithMasterClient(func(client master_pb.SeaweedClient) error {
+ _, err := client.CollectionDelete(ctx, &master_pb.CollectionDeleteRequest{
+ Name: bucketName,
+ })
+ return err
+ })
+ if err != nil {
+ return fmt.Errorf("failed to delete collection: %w", err)
+ }
+
+ // Then delete bucket directory recursively from filer
+ // Use same parameters as s3.bucket.delete shell command and S3 API
return s.WithFilerClient(func(client filer_pb.SeaweedFilerClient) error {
- // Delete bucket directory recursively
- _, err := client.DeleteEntry(context.Background(), &filer_pb.DeleteEntryRequest{
- Directory: "/buckets",
+ _, err := client.DeleteEntry(ctx, &filer_pb.DeleteEntryRequest{
+ Directory: DefaultBucketsPath,
Name: bucketName,
- IsDeleteData: true,
+ IsDeleteData: false, // Collection already deleted, just remove metadata
IsRecursive: true,
- IgnoreRecursiveError: false,
+ IgnoreRecursiveError: true, // Same as S3 API and shell command
})
if err != nil {
return fmt.Errorf("failed to delete bucket: %w", err)