diff options
Diffstat (limited to 'weed/mount/meta_cache/meta_cache.go')
| -rw-r--r-- | weed/mount/meta_cache/meta_cache.go | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/weed/mount/meta_cache/meta_cache.go b/weed/mount/meta_cache/meta_cache.go index 9578aff72..0ed76e039 100644 --- a/weed/mount/meta_cache/meta_cache.go +++ b/weed/mount/meta_cache/meta_cache.go @@ -6,6 +6,8 @@ import ( "sync" "time" + "golang.org/x/sync/singleflight" + "github.com/seaweedfs/seaweedfs/weed/filer" "github.com/seaweedfs/seaweedfs/weed/filer/leveldb" "github.com/seaweedfs/seaweedfs/weed/glog" @@ -17,20 +19,24 @@ import ( // e.g. fill fileId field for chunks type MetaCache struct { - root util.FullPath - localStore filer.VirtualFilerStore + root util.FullPath + localStore filer.VirtualFilerStore + leveldbStore *leveldb.LevelDBStore // direct reference for batch operations sync.RWMutex uidGidMapper *UidGidMapper markCachedFn func(fullpath util.FullPath) isCachedFn func(fullpath util.FullPath) bool invalidateFunc func(fullpath util.FullPath, entry *filer_pb.Entry) + visitGroup singleflight.Group // deduplicates concurrent EnsureVisited calls for the same path } func NewMetaCache(dbFolder string, uidGidMapper *UidGidMapper, root util.FullPath, markCachedFn func(path util.FullPath), isCachedFn func(path util.FullPath) bool, invalidateFunc func(util.FullPath, *filer_pb.Entry)) *MetaCache { + leveldbStore, virtualStore := openMetaStore(dbFolder) return &MetaCache{ root: root, - localStore: openMetaStore(dbFolder), + localStore: virtualStore, + leveldbStore: leveldbStore, markCachedFn: markCachedFn, isCachedFn: isCachedFn, uidGidMapper: uidGidMapper, @@ -40,7 +46,7 @@ func NewMetaCache(dbFolder string, uidGidMapper *UidGidMapper, root util.FullPat } } -func openMetaStore(dbFolder string) filer.VirtualFilerStore { +func openMetaStore(dbFolder string) (*leveldb.LevelDBStore, filer.VirtualFilerStore) { os.RemoveAll(dbFolder) os.MkdirAll(dbFolder, 0755) @@ -54,7 +60,7 @@ func openMetaStore(dbFolder string) filer.VirtualFilerStore { glog.Fatalf("Failed to initialize metadata cache store for %s: %+v", store.GetName(), err) } - return filer.NewFilerStoreWrapper(store) + return store, filer.NewFilerStoreWrapper(store) } @@ -68,6 +74,12 @@ func (mc *MetaCache) doInsertEntry(ctx context.Context, entry *filer.Entry) erro return mc.localStore.InsertEntry(ctx, entry) } +// doBatchInsertEntries inserts multiple entries using LevelDB's batch write. +// This is more efficient than inserting entries one by one. +func (mc *MetaCache) doBatchInsertEntries(ctx context.Context, entries []*filer.Entry) error { + return mc.leveldbStore.BatchInsertEntries(ctx, entries) +} + func (mc *MetaCache) AtomicUpdateEntryFromFiler(ctx context.Context, oldPath util.FullPath, newEntry *filer.Entry) error { mc.Lock() defer mc.Unlock() |
