more efficient recursion

This commit is contained in:
Chris Lu 2020-12-12 13:25:19 -08:00
parent 316d1b4e69
commit f930c713fc

View file

@ -263,14 +263,10 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d
} }
} else { } else {
var isEmpty bool var isEmpty bool
if isEmpty, err = s3a.isDirectoryAllEmpty(client, dir+"/"+entry.Name); err != nil { if isEmpty, err = s3a.isDirectoryAllEmpty(client, dir, entry.Name); err != nil {
return return
} }
if isEmpty { if !isEmpty {
if err = doDeleteEntry(client, dir, entry.Name, true, true); err != nil {
return
}
} else {
eachEntryFn(dir, entry) eachEntryFn(dir, entry)
counter++ counter++
} }
@ -311,14 +307,43 @@ func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string,
return return
} }
func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerClient, dir string) (isEmpty bool, err error) { func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerClient, parentDir, name string) (isEmpty bool, err error) {
// println("+ isDirectoryAllEmpty", dir) // println("+ isDirectoryAllEmpty", dir, name)
subCounter, _, _, subErr := s3a.doListFilerEntries(filerClient, dir, "", 32, "", "/", func(dir string, entry *filer_pb.Entry) { var fileCounter int
}) var subDirs []string
if subErr != nil { currentDir := parentDir+"/"+name
err = fmt.Errorf("isDirectoryAllEmpty: %v", subErr) 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)
if err != nil {
return false, err
} }
isEmpty = subCounter <= 0
// println("- isDirectoryAllEmpty", dir, isEmpty) if fileCounter > 0 {
return return false, nil
}
for _, subDir := range subDirs {
isSubEmpty, subErr := s3a.isDirectoryAllEmpty(filerClient, currentDir, subDir)
if subErr != nil {
return false, subErr
}
if !isSubEmpty {
return false, nil
}
}
println("deleting empty", currentDir)
if err = doDeleteEntry(filerClient, parentDir, name, true, true); err != nil {
return
}
return true, nil
} }