From bd186dc2fcf4c54d6152d6e3c25775abf77bf1ca Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 2 Apr 2023 22:05:13 -0600 Subject: btrfsutil: Move the shared cache definitions from rebuilt_forrest.go to rebuilt_tree.go --- lib/btrfsutil/rebuilt_forrest.go | 25 ++++++------------------- lib/btrfsutil/rebuilt_tree.go | 31 +++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 21 deletions(-) (limited to 'lib/btrfsutil') diff --git a/lib/btrfsutil/rebuilt_forrest.go b/lib/btrfsutil/rebuilt_forrest.go index d6e1fbb..7f239c3 100644 --- a/lib/btrfsutil/rebuilt_forrest.go +++ b/lib/btrfsutil/rebuilt_forrest.go @@ -16,7 +16,6 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" "git.lukeshu.com/btrfs-progs-ng/lib/containers" "git.lukeshu.com/btrfs-progs-ng/lib/slices" - "git.lukeshu.com/btrfs-progs-ng/lib/textui" ) type RebuiltForrestCallbacks interface { @@ -142,11 +141,10 @@ type RebuiltForrest struct { // mutable - treesMu nestedMutex - trees map[btrfsprim.ObjID]*RebuiltTree // must hold .treesMu to access - leafs containers.Cache[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]] - incItems containers.Cache[btrfsprim.ObjID, itemIndex] - excItems containers.Cache[btrfsprim.ObjID, itemIndex] + treesMu nestedMutex + trees map[btrfsprim.ObjID]*RebuiltTree // must hold .treesMu to access + + rebuiltSharedCache } // NewRebuiltForrest returns a new RebuiltForrest instance. The @@ -161,19 +159,8 @@ func NewRebuiltForrest(file btrfstree.NodeSource, sb btrfstree.Superblock, graph trees: make(map[btrfsprim.ObjID]*RebuiltTree), } - ret.leafs = containers.NewARCache[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]](textui.Tunable(8), - containers.SourceFunc[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]]( - func(ctx context.Context, treeID btrfsprim.ObjID, leafs *map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]) { - *leafs = ret.trees[treeID].uncachedLeafToRoots(ctx) - })) - ret.incItems = containers.NewARCache[btrfsprim.ObjID, itemIndex](textui.Tunable(8), - containers.SourceFunc[btrfsprim.ObjID, itemIndex](func(ctx context.Context, treeID btrfsprim.ObjID, incItems *itemIndex) { - *incItems = ret.trees[treeID].uncachedIncItems(ctx) - })) - ret.excItems = containers.NewARCache[btrfsprim.ObjID, itemIndex](textui.Tunable(8), - containers.SourceFunc[btrfsprim.ObjID, itemIndex](func(ctx context.Context, treeID btrfsprim.ObjID, excItems *itemIndex) { - *excItems = ret.trees[treeID].uncachedExcItems(ctx) - })) + ret.rebuiltSharedCache = makeRebuiltSharedCache(ret) + if ret.cb == nil { ret.cb = noopRebuiltForrestCallbacks{ forrest: ret, diff --git a/lib/btrfsutil/rebuilt_tree.go b/lib/btrfsutil/rebuilt_tree.go index 836873e..19b53ce 100644 --- a/lib/btrfsutil/rebuilt_tree.go +++ b/lib/btrfsutil/rebuilt_tree.go @@ -42,6 +42,35 @@ type RebuiltTree struct { // 3. tree.RebuiltAcquirePotentialItems() = tree.forrest.excItems.Acquire(tree.ID) } +type rebuiltSharedCache struct { + leafs containers.Cache[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]] + incItems containers.Cache[btrfsprim.ObjID, containers.SortedMap[btrfsprim.Key, ItemPtr]] + excItems containers.Cache[btrfsprim.ObjID, containers.SortedMap[btrfsprim.Key, ItemPtr]] +} + +func makeRebuiltSharedCache(forrest *RebuiltForrest) rebuiltSharedCache { + var ret rebuiltSharedCache + ret.leafs = containers.NewARCache[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]]( + textui.Tunable(8), + containers.SourceFunc[btrfsprim.ObjID, map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]]( + func(ctx context.Context, treeID btrfsprim.ObjID, leafs *map[btrfsvol.LogicalAddr]containers.Set[btrfsvol.LogicalAddr]) { + *leafs = forrest.trees[treeID].uncachedLeafToRoots(ctx) + })) + ret.incItems = containers.NewARCache[btrfsprim.ObjID, containers.SortedMap[btrfsprim.Key, ItemPtr]]( + textui.Tunable(8), + containers.SourceFunc[btrfsprim.ObjID, containers.SortedMap[btrfsprim.Key, ItemPtr]]( + func(ctx context.Context, treeID btrfsprim.ObjID, incItems *containers.SortedMap[btrfsprim.Key, ItemPtr]) { + *incItems = forrest.trees[treeID].uncachedIncItems(ctx) + })) + ret.excItems = containers.NewARCache[btrfsprim.ObjID, containers.SortedMap[btrfsprim.Key, ItemPtr]]( + textui.Tunable(8), + containers.SourceFunc[btrfsprim.ObjID, containers.SortedMap[btrfsprim.Key, ItemPtr]]( + func(ctx context.Context, treeID btrfsprim.ObjID, excItems *containers.SortedMap[btrfsprim.Key, ItemPtr]) { + *excItems = forrest.trees[treeID].uncachedExcItems(ctx) + })) + return ret +} + // evictable member 1: .acquireLeafToRoots() /////////////////////////////////////////////////////////////////////////// // acquireLeafToRoots returns all leafs (lvl=0) in the filesystem that @@ -181,8 +210,6 @@ func (tree *RebuiltTree) uncachedExcItems(ctx context.Context) containers.Sorted return tree.items(ctx, false) } -type itemIndex = containers.SortedMap[btrfsprim.Key, ItemPtr] - type itemStats struct { Leafs textui.Portion[int] NumItems int -- cgit v1.2.3-2-g168b