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
This commit is contained in:
Chris Lu 2020-12-12 16:19:29 -08:00
parent 14910d035c
commit 5c465293e9

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"encoding/xml" "encoding/xml"
"fmt" "fmt"
"github.com/chrislusf/seaweedfs/weed/glog"
"io" "io"
"net/http" "net/http"
"net/url" "net/url"
@ -312,15 +313,20 @@ func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerCli
var fileCounter int var fileCounter int
var subDirs []string var subDirs []string
currentDir := parentDir + "/" + name 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 { err = filer_pb.SeaweedList(filerClient, currentDir, "", func(entry *filer_pb.Entry, isLast bool) error {
if entry.IsDirectory { if entry.IsDirectory {
subDirs = append(subDirs, entry.Name) subDirs = append(subDirs, entry.Name)
} else { } else {
println("existing file", currentDir, entry.Name)
fileCounter++ fileCounter++
} }
startFrom = entry.Name
isExhausted = isExhausted || isLast
return nil return nil
}, "",false, 32) }, startFrom, false, 8)
}
if err != nil { if err != nil {
return false, err 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 { if err = doDeleteEntry(filerClient, parentDir, name, true, true); err != nil {
return return
} }