summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-04-02 22:05:13 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-04-04 14:08:38 -0600
commitbd186dc2fcf4c54d6152d6e3c25775abf77bf1ca (patch)
treec00d9da512a6a5f9503bb6711654dabcd6805c23
parentfe3b3fdcace149b3514df716ea5de363a0c2e0cb (diff)
btrfsutil: Move the shared cache definitions from rebuilt_forrest.go to rebuilt_tree.go
-rw-r--r--lib/btrfsutil/rebuilt_forrest.go25
-rw-r--r--lib/btrfsutil/rebuilt_tree.go31
2 files changed, 35 insertions, 21 deletions
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