From 5c465293e91f4ffd1aedad0f5b85fb7620fbbed6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 12 Dec 2020 16:19:29 -0800 Subject: [PATCH] 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 --- weed/s3api/s3api_objects_list_handlers.go | 28 ++++++++++++++--------- 1 file 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 }