diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-02 16:02:42 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-30 10:06:00 -0600 |
commit | 72b20c1d798551bfa2bb46f5521553144b45c09f (patch) | |
tree | b317447fe966f42ab1480cd755506d35b98e0516 /lib/btrfsutil | |
parent | e62b128e088346e891b8b2a5e6458cf77abc9d02 (diff) |
btrfstree: Rethink the API, but leave the old API in place
Diffstat (limited to 'lib/btrfsutil')
-rw-r--r-- | lib/btrfsutil/old_rebuilt_forrest.go | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/lib/btrfsutil/old_rebuilt_forrest.go b/lib/btrfsutil/old_rebuilt_forrest.go index d17aa4a..e853be7 100644 --- a/lib/btrfsutil/old_rebuilt_forrest.go +++ b/lib/btrfsutil/old_rebuilt_forrest.go @@ -166,7 +166,7 @@ func (bt *OldRebuiltForrest) rawTreeWalk(ctx context.Context, treeID btrfsprim.O cacheEntry.RootErr = err return } - root, err := btrfstree.LookupTreeRoot(ctx, bt, *sb, treeID) + root, err := btrfstree.OldLookupTreeRoot(ctx, bt.TreeSearch, *sb, treeID) if err != nil { cacheEntry.RootErr = err return @@ -263,20 +263,21 @@ func (bt *OldRebuiltForrest) readNode(nodeInfo nodeInfo) *btrfstree.Node { // TreeLookup implements btrfstree.TreeOperator. func (bt *OldRebuiltForrest) TreeLookup(treeID btrfsprim.ObjID, key btrfsprim.Key) (btrfstree.Item, error) { - return bt.RebuiltTree(bt.ctx, treeID).treeLookup(bt.ctx, key) + return bt.RebuiltTree(bt.ctx, treeID).TreeLookup(bt.ctx, key) } -func (tree oldRebuiltTree) treeLookup(ctx context.Context, key btrfsprim.Key) (btrfstree.Item, error) { - return tree.treeSearch(ctx, btrfstree.SearchExactKey(key)) +// TreeLookup implements btrfstree.Tree. +func (tree oldRebuiltTree) TreeLookup(ctx context.Context, key btrfsprim.Key) (btrfstree.Item, error) { + return tree.TreeSearch(ctx, btrfstree.SearchExactKey(key)) } // TreeSearch implements btrfstree.TreeOperator. func (bt *OldRebuiltForrest) TreeSearch(treeID btrfsprim.ObjID, searcher btrfstree.TreeSearcher) (btrfstree.Item, error) { - return bt.RebuiltTree(bt.ctx, treeID).treeSearch(bt.ctx, searcher) + return bt.RebuiltTree(bt.ctx, treeID).TreeSearch(bt.ctx, searcher) } // TreeSearch implements btrfstree.Tree. -func (tree oldRebuiltTree) treeSearch(_ context.Context, searcher btrfstree.TreeSearcher) (btrfstree.Item, error) { +func (tree oldRebuiltTree) TreeSearch(_ context.Context, searcher btrfstree.TreeSearcher) (btrfstree.Item, error) { if tree.RootErr != nil { return btrfstree.Item{}, tree.RootErr } @@ -299,6 +300,26 @@ func (tree oldRebuiltTree) treeSearch(_ context.Context, searcher btrfstree.Tree return item, nil } +// TreeRange implements btrfstree.Tree. +func (tree oldRebuiltTree) TreeRange(_ context.Context, handleFn func(btrfstree.Item) bool) error { + if tree.RootErr != nil { + return tree.RootErr + } + + var node *btrfstree.Node + tree.Items.Range( + func(rbnode *containers.RBNode[oldRebuiltTreeValue]) bool { + if node == nil || node.Head.Addr != rbnode.Value.Node.LAddr { + tree.forrest.inner.ReleaseNode(node) + node = tree.forrest.readNode(rbnode.Value.Node) + } + return handleFn(node.BodyLeaf[rbnode.Value.Slot]) + }) + tree.forrest.inner.ReleaseNode(node) + + return tree.addErrs(func(btrfsprim.Key, uint32) int { return 0 }, nil) +} + // TreeSearchAll implements btrfstree.TreeOperator. func (bt *OldRebuiltForrest) TreeSearchAll(treeID btrfsprim.ObjID, searcher btrfstree.TreeSearcher) ([]btrfstree.Item, error) { tree := bt.RebuiltTree(bt.ctx, treeID) @@ -307,7 +328,7 @@ func (bt *OldRebuiltForrest) TreeSearchAll(treeID btrfsprim.ObjID, searcher btrf } var ret []btrfstree.Item - err := tree.treeSubrange(bt.ctx, 1, searcher, func(item btrfstree.Item) bool { + err := tree.TreeSubrange(bt.ctx, 1, searcher, func(item btrfstree.Item) bool { item.Body = item.Body.CloneItem() ret = append(ret, item) return true @@ -316,7 +337,8 @@ func (bt *OldRebuiltForrest) TreeSearchAll(treeID btrfsprim.ObjID, searcher btrf return ret, err } -func (tree oldRebuiltTree) treeSubrange(_ context.Context, min int, searcher btrfstree.TreeSearcher, handleFn func(btrfstree.Item) bool) error { +// TreeSubrange implements btrfstree.Tree. +func (tree oldRebuiltTree) TreeSubrange(_ context.Context, min int, searcher btrfstree.TreeSearcher, handleFn func(btrfstree.Item) bool) error { var node *btrfstree.Node var cnt int tree.Items.Subrange( @@ -355,10 +377,12 @@ func (bt *OldRebuiltForrest) TreeWalk(ctx context.Context, treeID btrfsprim.ObjI }) return } - tree.treeWalk(ctx, cbs) + tree.TreeWalk(ctx, cbs) } -func (tree oldRebuiltTree) treeWalk(ctx context.Context, cbs btrfstree.TreeWalkHandler) { +// TreeWalk implements btrfstree.Tree. It doesn't actually visit +// nodes or keypointers (just items). +func (tree oldRebuiltTree) TreeWalk(ctx context.Context, cbs btrfstree.TreeWalkHandler) { if cbs.Item == nil && cbs.BadItem == nil { return } @@ -439,7 +463,7 @@ func (tree oldRebuiltTree) TreeCheckOwner(ctx context.Context, failOpen bool, ow return nil //nolint:nilerr // fail open } } - parentIDItem, err := uuidTree.treeLookup(ctx, btrfsitem.UUIDToKey(tree.ParentUUID)) + parentIDItem, err := uuidTree.TreeLookup(ctx, btrfsitem.UUIDToKey(tree.ParentUUID)) if err != nil { if failOpen { return nil |