diff options
| author | Chris Lu <chris.lu@gmail.com> | 2020-12-12 03:38:34 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2020-12-12 03:38:34 -0800 |
| commit | 03637d6f57e34be281e778c5e9fa3e3096331c2d (patch) | |
| tree | b0886d138559f24f182240001925d4205e240289 | |
| parent | 37075a414dcff0769f06ee0f3268d7f338ffba63 (diff) | |
| download | seaweedfs-03637d6f57e34be281e778c5e9fa3e3096331c2d.tar.xz seaweedfs-03637d6f57e34be281e778c5e9fa3e3096331c2d.zip | |
s3: move "delete-directory-if-empty" to read time
move "delete-directory-if-empty" to read time instead of entry deletion time
the listing speed for a s3 bucket folder will slow down if it has many sub folders
related to https://github.com/chrislusf/seaweedfs/commit/0d345ac97d941bef0991c0cb08632ccf08c0ee83
fix https://github.com/chrislusf/seaweedfs/issues/1647
fix https://github.com/chrislusf/seaweedfs/issues/1670
| -rw-r--r-- | weed/filer/filer_delete_entry.go | 29 | ||||
| -rw-r--r-- | weed/s3api/s3api_objects_list_handlers.go | 27 |
2 files changed, 25 insertions, 31 deletions
diff --git a/weed/filer/filer_delete_entry.go b/weed/filer/filer_delete_entry.go index b4f4e46ff..da92c4f4b 100644 --- a/weed/filer/filer_delete_entry.go +++ b/weed/filer/filer_delete_entry.go @@ -3,8 +3,6 @@ package filer import ( "context" "fmt" - "strings" - "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" @@ -60,11 +58,6 @@ func (f *Filer) DeleteEntryMetaAndData(ctx context.Context, p util.FullPath, isR collectionName := entry.Name() f.doDeleteCollection(collectionName) f.deleteBucket(collectionName) - } else { - parent, _ := p.DirAndName() - if err := f.removeEmptyParentFolder(ctx, util.FullPath(parent)); err != nil { - glog.Errorf("clean up empty folders for %s : %v", p, err) - } } return nil @@ -159,25 +152,3 @@ func (f *Filer) maybeDeleteHardLinks(hardLinkIds []HardLinkId) { } } } - -func (f *Filer) removeEmptyParentFolder(ctx context.Context, dir util.FullPath) error { - if !strings.HasPrefix(string(dir), f.DirBucketsPath) { - return nil - } - parent, _ := dir.DirAndName() - if parent == f.DirBucketsPath { - // should not delete bucket itself - return nil - } - entries, err := f.ListDirectoryEntries(ctx, dir, "", false, 1, "") - if err != nil { - return err - } - if len(entries) > 0 { - return nil - } - if err := f.Store.DeleteEntry(ctx, dir); err != nil { - return err - } - return f.removeEmptyParentFolder(ctx, util.FullPath(parent)) -} diff --git a/weed/s3api/s3api_objects_list_handlers.go b/weed/s3api/s3api_objects_list_handlers.go index 40583f478..5804f0d44 100644 --- a/weed/s3api/s3api_objects_list_handlers.go +++ b/weed/s3api/s3api_objects_list_handlers.go @@ -246,8 +246,8 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d if entry.IsDirectory { // println("ListEntries", dir, "dir:", entry.Name) if entry.Name != ".uploads" { // FIXME no need to apply to all directories. this extra also affects maxKeys - eachEntryFn(dir, entry) if delimiter != "/" { + eachEntryFn(dir, entry) // println("doListFilerEntries2 dir", dir+"/"+entry.Name, "maxKeys", maxKeys-counter) subCounter, subIsTruncated, subNextMarker, subErr := s3a.doListFilerEntries(client, dir+"/"+entry.Name, "", maxKeys-counter, "", delimiter, eachEntryFn) if subErr != nil { @@ -262,7 +262,18 @@ func (s3a *S3ApiServer) doListFilerEntries(client filer_pb.SeaweedFilerClient, d return } } else { - counter++ + var isEmpty bool + if isEmpty, err = s3a.isDirectoryAllEmpty(client, dir+"/"+entry.Name); err != nil { + return + } + if isEmpty { + if err = doDeleteEntry(client, dir, entry.Name, true, true); err != nil { + return + } + } else { + eachEntryFn(dir, entry) + counter++ + } } } } else { @@ -299,3 +310,15 @@ func getListObjectsV1Args(values url.Values) (prefix, marker, delimiter string, } return } + +func (s3a *S3ApiServer) isDirectoryAllEmpty(filerClient filer_pb.SeaweedFilerClient, dir string) (isEmpty bool, err error) { + // println("+ isDirectoryAllEmpty", dir) + subCounter, _, _, subErr := s3a.doListFilerEntries(filerClient, dir, "", 32, "", "/", func(dir string, entry *filer_pb.Entry) { + }) + if subErr != nil { + err = fmt.Errorf("isDirectoryAllEmpty: %v", subErr) + } + isEmpty = subCounter <= 0 + // println("- isDirectoryAllEmpty", dir, isEmpty) + return +} |
