From c8c3f8b5f1b7a7f61c4fc1dda99062cedff66841 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 29 Aug 2022 21:07:25 -0600 Subject: wip --- lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuildnodes.go | 2 -- lib/btrfsprogs/btrfsinspect/rebuildnodes/s1_uuidmap.go | 5 ++++- .../btrfsinspect/rebuildnodes/s2_lostandfound.go | 14 +++++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuildnodes.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuildnodes.go index e5ae5e4..c02600d 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuildnodes.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/rebuildnodes.go @@ -35,12 +35,10 @@ func RebuildNodes(ctx context.Context, fs *btrfs.FS, nodeScanResults btrfsinspec uuidMap: uuidMap, } - dlog.Info(ctx, "Identifying lost+found nodes...") foundRoots, err := lostAndFoundNodes(ctx, nfs, nodeScanResults) if err != nil { return nil, err } - dlog.Infof(ctx, "... identified %d lost+found nodes", len(foundRoots)) dlog.Info(ctx, "Initializing nodes to re-build...") rebuiltNodes, err := reInitBrokenNodes(ctx, nfs, nodeScanResults, foundRoots) diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/s1_uuidmap.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/s1_uuidmap.go index ba090fb..b29c201 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/s1_uuidmap.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/s1_uuidmap.go @@ -99,7 +99,10 @@ func buildUUIDMap(ctx context.Context, fs *btrfs.FS, scanResults btrfsinspect.Sc progress() } } - progress() + + if done != total { + panic("should not happen") + } missing := make(map[btrfsprim.ObjID]struct{}) for treeID := range seenTreeIDs { diff --git a/lib/btrfsprogs/btrfsinspect/rebuildnodes/s2_lostandfound.go b/lib/btrfsprogs/btrfsinspect/rebuildnodes/s2_lostandfound.go index 8da8588..2448033 100644 --- a/lib/btrfsprogs/btrfsinspect/rebuildnodes/s2_lostandfound.go +++ b/lib/btrfsprogs/btrfsinspect/rebuildnodes/s2_lostandfound.go @@ -19,7 +19,11 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/diskio" ) +// lostAndFoundNodes returns the set of nodes don't have another node +// claiming it as a child. func lostAndFoundNodes(ctx context.Context, fs _FS, nodeScanResults btrfsinspect.ScanDevicesResult) (map[btrfsvol.LogicalAddr]struct{}, error) { + dlog.Info(ctx, "Identifying lost+found nodes...") + lastPct := -1 total := countNodes(nodeScanResults) progress := func(done int) { @@ -62,6 +66,9 @@ func lostAndFoundNodes(ctx context.Context, fs _FS, nodeScanResults btrfsinspect } } } + if len(attachedNodes)+len(orphanedNodes) != total { + panic("should not happen") + } dlog.Infof(ctx, "... (finished processing %v attached nodes, proceeding to process %v lost nodes, for a total of %v)", len(attachedNodes), len(orphanedNodes), len(attachedNodes)+len(orphanedNodes)) @@ -73,7 +80,7 @@ func lostAndFoundNodes(ctx context.Context, fs _FS, nodeScanResults btrfsinspect orphanedRoots[node] = struct{}{} } done := len(attachedNodes) - for potentialRoot := range orphanedRoots { + for potentialRoot := range orphanedNodes { done++ progress(done) if orphanedNodes[potentialRoot] > 1 { @@ -101,5 +108,10 @@ func lostAndFoundNodes(ctx context.Context, fs _FS, nodeScanResults btrfsinspect ) } + if done != total { + panic("should not happen") + } + + dlog.Infof(ctx, "... identified %d lost+found nodes", len(orphanedRoots)) return orphanedRoots, nil } -- cgit v1.2.3-2-g168b