From 0ccdb937bba225ac6c170e6f5f1d8a3065ff56a7 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sat, 16 Oct 2021 23:33:45 -0700 Subject: [PATCH] mount: fix renaming a deep directory with unvisited directories --- weed/filesys/dir.go | 2 +- weed/filesys/dir_rename.go | 2 +- weed/filesys/meta_cache/meta_cache.go | 9 ++++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/weed/filesys/dir.go b/weed/filesys/dir.go index 9a791e013..d2d58fda5 100644 --- a/weed/filesys/dir.go +++ b/weed/filesys/dir.go @@ -352,7 +352,7 @@ func (dir *Dir) ReadDirAll(ctx context.Context) (ret []fuse.Dirent, err error) { glog.Errorf("dir ReadDirAll %s: %v", dirPath, err) return nil, fuse.EIO } - listErr := dir.wfs.metaCache.ListDirectoryEntries(context.Background(), dirPath, "", false, int64(math.MaxInt32), func(entry *filer.Entry) bool { + listErr := dir.wfs.metaCache.ListDirectoryEntries(context.Background(), dir.wfs, dirPath, "", false, int64(math.MaxInt32), func(entry *filer.Entry) bool { processEachEntryFn(entry, false) return true }) diff --git a/weed/filesys/dir_rename.go b/weed/filesys/dir_rename.go index dd76577b0..ff65bccd2 100644 --- a/weed/filesys/dir_rename.go +++ b/weed/filesys/dir_rename.go @@ -131,7 +131,7 @@ func (dir *Dir) moveFolderSubEntries(ctx context.Context, oldParent util.FullPat glog.V(1).Infof("moving folder %s => %s", currentDirPath, newDirPath) var moveErr error - listErr := dir.wfs.metaCache.ListDirectoryEntries(ctx, currentDirPath, "", false, int64(math.MaxInt32), func(item *filer.Entry) bool { + listErr := dir.wfs.metaCache.ListDirectoryEntries(ctx, dir.wfs, currentDirPath, "", false, int64(math.MaxInt32), func(item *filer.Entry) bool { moveErr = dir.moveEntry(ctx, currentDirPath, item, newDirPath, item.Name()) if moveErr != nil { return false diff --git a/weed/filesys/meta_cache/meta_cache.go b/weed/filesys/meta_cache/meta_cache.go index 69d1655ee..6630a7739 100644 --- a/weed/filesys/meta_cache/meta_cache.go +++ b/weed/filesys/meta_cache/meta_cache.go @@ -2,10 +2,10 @@ package meta_cache import ( "context" - "fmt" "github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/filer/leveldb" "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" "github.com/chrislusf/seaweedfs/weed/util/bounded_tree" "os" @@ -117,12 +117,15 @@ func (mc *MetaCache) DeleteEntry(ctx context.Context, fp util.FullPath) (err err return mc.localStore.DeleteEntry(ctx, fp) } -func (mc *MetaCache) ListDirectoryEntries(ctx context.Context, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc filer.ListEachEntryFunc) error { +func (mc *MetaCache) ListDirectoryEntries(ctx context.Context, client filer_pb.FilerClient, dirPath util.FullPath, startFileName string, includeStartFile bool, limit int64, eachEntryFunc filer.ListEachEntryFunc) error { //mc.RLock() //defer mc.RUnlock() if !mc.visitedBoundary.HasVisited(dirPath) { - return fmt.Errorf("unsynchronized dir: %v", dirPath) + glog.V(2).Infof("visit unsynchronized dir: %v", dirPath) + // this should not happen often + // unless, e.g., moving a deep directory + EnsureVisited(mc, client, dirPath) } _, err := mc.localStore.ListDirectoryEntries(ctx, dirPath, startFileName, includeStartFile, limit, func(entry *filer.Entry) bool {