summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-04-14 21:07:26 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2023-04-15 12:01:31 -0600
commit1e610d15567531a3653323d8c319e56f67072377 (patch)
tree18a59fe5fa7bd3a84f0d719ae14e6369eb0edbf0
parentb302df6a761fda3ba1ba60c6866eb39dbb36527a (diff)
btrfsutil: RebuiltTree: Clean up locking
-rw-r--r--lib/btrfsutil/rebuilt_tree.go18
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/btrfsutil/rebuilt_tree.go b/lib/btrfsutil/rebuilt_tree.go
index 0844511..fc36ebb 100644
--- a/lib/btrfsutil/rebuilt_tree.go
+++ b/lib/btrfsutil/rebuilt_tree.go
@@ -273,6 +273,9 @@ func (tree *RebuiltTree) isOwnerOK(owner btrfsprim.ObjID, gen btrfsprim.Generati
//
// When done with the map, call .RebuiltReleaseItems().
func (tree *RebuiltTree) RebuiltAcquireItems(ctx context.Context) *containers.SortedMap[btrfsprim.Key, ItemPtr] {
+ tree.mu.RLock()
+ defer tree.mu.RUnlock()
+
return tree.forrest.incItems.Acquire(ctx, tree.ID)
}
@@ -290,6 +293,9 @@ func (tree *RebuiltTree) RebuiltReleaseItems() {
//
// When done with the map, call .RebuiltReleasePotentialItems().
func (tree *RebuiltTree) RebuiltAcquirePotentialItems(ctx context.Context) *containers.SortedMap[btrfsprim.Key, ItemPtr] {
+ tree.mu.RLock()
+ defer tree.mu.RUnlock()
+
return tree.forrest.excItems.Acquire(ctx, tree.ID)
}
@@ -301,12 +307,12 @@ func (tree *RebuiltTree) RebuiltReleasePotentialItems() {
func (tree *RebuiltTree) uncachedIncItems(ctx context.Context) containers.SortedMap[btrfsprim.Key, ItemPtr] {
ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.index-inc-items", fmt.Sprintf("tree=%v", tree.ID))
- return tree.items(ctx, true)
+ return tree.uncachedItems(ctx, true)
}
func (tree *RebuiltTree) uncachedExcItems(ctx context.Context) containers.SortedMap[btrfsprim.Key, ItemPtr] {
ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.index-exc-items", fmt.Sprintf("tree=%v", tree.ID))
- return tree.items(ctx, false)
+ return tree.uncachedItems(ctx, false)
}
type rebuiltItemStats struct {
@@ -320,10 +326,7 @@ func (s rebuiltItemStats) String() string {
s.Leafs, s.NumItems, s.NumDups)
}
-func (tree *RebuiltTree) items(ctx context.Context, inc bool) containers.SortedMap[btrfsprim.Key, ItemPtr] {
- tree.mu.RLock()
- defer tree.mu.RUnlock()
-
+func (tree *RebuiltTree) uncachedItems(ctx context.Context, inc bool) containers.SortedMap[btrfsprim.Key, ItemPtr] {
var leafs []btrfsvol.LogicalAddr
for node, roots := range tree.acquireNodeIndex(ctx).nodeToRoots {
if tree.forrest.graph.Nodes[node].Level == 0 && maps.HaveAnyKeysInCommon(tree.Roots, roots) == inc {
@@ -416,6 +419,7 @@ func (s rebuiltRootStats) String() string {
func (tree *RebuiltTree) RebuiltAddRoot(ctx context.Context, rootNode btrfsvol.LogicalAddr) {
tree.mu.Lock()
defer tree.mu.Unlock()
+
ctx = dlog.WithField(ctx, "btrfs.util.rebuilt-tree.add-root", fmt.Sprintf("tree=%v rootNode=%v", tree.ID, rootNode))
dlog.Info(ctx, "adding root...")
@@ -485,8 +489,10 @@ func (tree *RebuiltTree) RebuiltLeafToRoots(ctx context.Context, leaf btrfsvol.L
panic(fmt.Errorf("should not happen: (tree=%v).RebuiltLeafToRoots(leaf=%v): not a leaf",
tree.ID, leaf))
}
+
tree.mu.RLock()
defer tree.mu.RUnlock()
+
ret := make(containers.Set[btrfsvol.LogicalAddr])
for root := range tree.acquireNodeIndex(ctx).nodeToRoots[leaf] {
if tree.Roots.Has(root) {