diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-02 17:29:44 -0700 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2023-03-02 17:29:44 -0700 |
commit | abff94282174a8f14aec482d2e4992de5915c837 (patch) | |
tree | 90113b4c4dac91ea5ad6f4342b45a9b9b2988007 /lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go | |
parent | 2098ac287002f090a02baf82fd5dda1bc3753e25 (diff) | |
parent | 301a28a093372f1182253d021659425070ae8747 (diff) |
Merge branch 'lukeshu/rebuild-nodes-take6'
Diffstat (limited to 'lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go')
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go index dc78c2e..bc36485 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuild.go @@ -56,6 +56,7 @@ type rebuilder struct { Key containers.Optional[btrfsprim.Key] } treeQueue containers.Set[btrfsprim.ObjID] + retryItemQueue map[btrfsprim.ObjID]containers.Set[keyAndTree] addedItemQueue containers.Set[keyAndTree] settledItemQueue containers.Set[keyAndTree] augmentQueue map[btrfsprim.ObjID]*treeAugmentQueue @@ -98,6 +99,7 @@ func (o *rebuilder) Rebuild(ctx context.Context) error { ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.step", "rebuild") // Initialize + o.retryItemQueue = make(map[btrfsprim.ObjID]containers.Set[keyAndTree]) o.addedItemQueue = make(containers.Set[keyAndTree]) o.settledItemQueue = make(containers.Set[keyAndTree]) o.augmentQueue = make(map[btrfsprim.ObjID]*treeAugmentQueue) @@ -133,7 +135,7 @@ func (o *rebuilder) Rebuild(ctx context.Context) error { } runtime.GC() - // Apply augments (drain o.augmentQueue, fill o.addedItemQueue). + // Apply augments (drain o.augmentQueue (and maybe o.retryItemQueue), fill o.addedItemQueue). if err := o.processAugmentQueue(ctx); err != nil { return err } @@ -286,6 +288,7 @@ func (o *rebuilder) processSettledItemQueue(ctx context.Context) error { Key: item.Key, Body: item.Body, }) + item.Body.Free() if item.ItemType == btrfsitem.ROOT_ITEM_KEY { o.treeQueue.Insert(item.ObjectID) } @@ -300,7 +303,7 @@ func (o *rebuilder) processSettledItemQueue(ctx context.Context) error { return grp.Wait() } -// processAugmentQueue drains o.augmentQueue, filling o.addedItemQueue. +// processAugmentQueue drains o.augmentQueue (and maybe o.retryItemQueue), filling o.addedItemQueue. func (o *rebuilder) processAugmentQueue(ctx context.Context) error { ctx = dlog.WithField(ctx, "btrfsinspect.rebuild-nodes.rebuild.substep", "apply-augments") @@ -342,9 +345,12 @@ func (o *rebuilder) processAugmentQueue(ctx context.Context) error { return nil } -func (o *rebuilder) enqueueRetry() { +func (o *rebuilder) enqueueRetry(ifTreeID btrfsprim.ObjID) { if o.curKey.Key.OK { - o.settledItemQueue.Insert(keyAndTree{ + if o.retryItemQueue[ifTreeID] == nil { + o.retryItemQueue[ifTreeID] = make(containers.Set[keyAndTree]) + } + o.retryItemQueue[ifTreeID].Insert(keyAndTree{ TreeID: o.curKey.TreeID, Key: o.curKey.Key.Val, }) |