Browse Source

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
pull/1681/head
Chris Lu 4 years ago
parent
commit
5c465293e9
  1. 28
      weed/s3api/s3api_objects_list_handlers.go

28
weed/s3api/s3api_objects_list_handlers.go

@ -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"
@ -311,16 +312,21 @@ func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerCli
// println("+ isDirectoryAllEmpty", dir, name) // println("+ isDirectoryAllEmpty", dir, name)
var fileCounter int var fileCounter int
var subDirs []string 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 { 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
} }

Loading…
Cancel
Save