diff options
-rw-r--r-- | cmd/btrfs-rec/inspect_scanforextents.go | 2 | ||||
-rw-r--r-- | lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go | 22 |
2 files changed, 20 insertions, 4 deletions
diff --git a/cmd/btrfs-rec/inspect_scanforextents.go b/cmd/btrfs-rec/inspect_scanforextents.go index 30df82d..698b3b6 100644 --- a/cmd/btrfs-rec/inspect_scanforextents.go +++ b/cmd/btrfs-rec/inspect_scanforextents.go @@ -25,11 +25,13 @@ func init() { RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() + dlog.Infof(ctx, "Reading %q...", args[0]) bgs, err := scanforextents.ReadNodeScanResults(fs, args[0]) if err != nil { return err } runtime.GC() + dlog.Infof(ctx, "... done reading %q", args[0]) if err := scanforextents.ScanForExtents(ctx, fs, bgs); err != nil { return err diff --git a/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go b/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go index 1537fb5..39113d8 100644 --- a/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go +++ b/lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go @@ -6,6 +6,7 @@ package scanforextents import ( "context" + "runtime" "sync" "github.com/datawire/dlib/dgroup" @@ -27,6 +28,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockGroups *BlockGroupTr dlog.Info(ctx, "No unmapped checksums") return nil } + runtime.GC() devs := fs.LV.PhysicalVolumes() gaps := ListPhysicalGaps(fs) @@ -38,6 +40,7 @@ func ScanForExtents(ctx context.Context, fs *btrfs.FS, blockGroups *BlockGroupTr InBlockGroups: blockGroups, } + dlog.Info(ctx, "Scanning devices...") grp := dgroup.NewGroup(ctx, dgroup.GroupConfig{}) for devID := range gaps { dev := devs[devID] @@ -103,7 +106,7 @@ func (em *ExtentMappings) init() error { return em.initErr } -func (em *ExtentMappings) considerMapping(dev *btrfs.Device, laddr btrfsvol.LogicalAddr, paddr btrfsvol.QualifiedPhysicalAddr) (btrfsvol.Mapping, bool) { +func (em *ExtentMappings) considerMapping(ctx context.Context, dev *btrfs.Device, laddr btrfsvol.LogicalAddr, paddr btrfsvol.QualifiedPhysicalAddr) (btrfsvol.Mapping, bool) { blockgroup := LookupBlockGroup(em.InBlockGroups, laddr, csumBlockSize) if blockgroup == nil { return btrfsvol.Mapping{ @@ -130,10 +133,16 @@ func (em *ExtentMappings) considerMapping(dev *btrfs.Device, laddr btrfsvol.Logi } for offset := btrfsvol.AddrDelta(0); offset <= mapping.Size; offset += csumBlockSize { + if err := ctx.Err(); err != nil { + return btrfsvol.Mapping{}, false + } expCSum, err := LookupCSum(em.InFS, em.alg, mapping.LAddr.Add(offset)) if err != nil { continue } + if err := ctx.Err(); err != nil { + return btrfsvol.Mapping{}, false + } actCSum, err := ChecksumPhysical(dev, em.alg, mapping.PAddr.Addr.Add(offset)) if err != nil { return btrfsvol.Mapping{}, false @@ -173,12 +182,13 @@ func (em *ExtentMappings) ScanOneDev(ctx context.Context, dev *btrfs.Device, gap sumSize := em.alg.Size() lastProgress := -1 + potentialMappings := 0 return WalkGapsOneDev(ctx, dev, gaps, csumBlockSize, func(curBlock, totalBlocks int64) { pct := int(100 * float64(curBlock) / float64(totalBlocks)) if pct != lastProgress || curBlock == totalBlocks { - dlog.Infof(ctx, "... dev[%q] scanned %v%%", - dev.Name(), pct) + dlog.Infof(ctx, "... dev[%q] scanned %v%% (constructed %v potential mappings)", + dev.Name(), pct, potentialMappings) lastProgress = pct } }, @@ -198,14 +208,18 @@ func (em *ExtentMappings) ScanOneDev(ctx context.Context, dev *btrfs.Device, gap if err := ctx.Err(); err != nil { return err } - mapping, ok := em.considerMapping(dev, laddr, btrfsvol.QualifiedPhysicalAddr{ + mapping, ok := em.considerMapping(ctx, dev, laddr, btrfsvol.QualifiedPhysicalAddr{ Dev: devID, Addr: paddr, }) + if err := ctx.Err(); err != nil { + return err + } if !ok { continue } em.addMapping(shortSum, mapping) + potentialMappings++ } return nil |