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"
"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
}