aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2020-12-12 16:19:29 -0800
committerChris Lu <chris.lu@gmail.com>2020-12-12 16:19:29 -0800
commit5c465293e91f4ffd1aedad0f5b85fb7620fbbed6 (patch)
treec60be5fad0a341b756c3a7a4e0dcfd587c0331a4
parent14910d035c5e744976eab6be3bb4fa006ea89619 (diff)
downloadseaweedfs-5c465293e91f4ffd1aedad0f5b85fb7620fbbed6.tar.xz
seaweedfs-5c465293e91f4ffd1aedad0f5b85fb7620fbbed6.zip
correctly determine whether a folder is empty
avoid edge cases that deleting the folder if previous 32 directories are all empty early terminate if one file is found
-rw-r--r--weed/s3api/s3api_objects_list_handlers.go28
1 files changed, 17 insertions, 11 deletions
diff --git a/weed/s3api/s3api_objects_list_handlers.go b/weed/s3api/s3api_objects_list_handlers.go
index eea06a08a..dce2fd6b0 100644
--- a/weed/s3api/s3api_objects_list_handlers.go
+++ b/weed/s3api/s3api_objects_list_handlers.go
@@ -4,6 +4,7 @@ import (
"context"
"encoding/xml"
"fmt"
+ "github.com/chrislusf/seaweedfs/weed/glog"
"io"
"net/http"
"net/url"
@@ -311,16 +312,21 @@ func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerCli
// println("+ isDirectoryAllEmpty", dir, name)
var fileCounter int
var subDirs []string
- currentDir := parentDir+"/"+name
- err = filer_pb.SeaweedList(filerClient, currentDir, "", func(entry *filer_pb.Entry, isLast bool) error {
- if entry.IsDirectory {
- subDirs = append(subDirs, entry.Name)
- } else {
- println("existing file", currentDir, entry.Name)
- fileCounter++
- }
- return nil
- }, "",false, 32)
+ currentDir := parentDir + "/" + name
+ var startFrom string
+ var isExhausted bool
+ for fileCounter == 0 && !isExhausted {
+ err = filer_pb.SeaweedList(filerClient, currentDir, "", func(entry *filer_pb.Entry, isLast bool) error {
+ if entry.IsDirectory {
+ subDirs = append(subDirs, entry.Name)
+ } else {
+ fileCounter++
+ }
+ startFrom = entry.Name
+ isExhausted = isExhausted || isLast
+ return nil
+ }, startFrom, false, 8)
+ }
if err != nil {
return false, err
@@ -340,7 +346,7 @@ func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerCli
}
}
- println("deleting empty", currentDir)
+ glog.V(1).Infof("deleting empty folder %s", currentDir)
if err = doDeleteEntry(filerClient, parentDir, name, true, true); err != nil {
return
}