summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2022-07-15 23:34:57 -0600
committerLuke Shumaker <lukeshu@lukeshu.com>2022-07-15 23:34:57 -0600
commitcd74edc4b8704686bf31ca96547977bdf3232662 (patch)
treec3c63961a67f9f98600c3cbca8070f576f2c964f /lib
parent0057ac685125aea5cf06dfd8eeaa7c7d52e64dfa (diff)
status
Diffstat (limited to 'lib')
-rw-r--r--lib/btrfsprogs/btrfsinspect/scanforextents/scanforextents.go22
1 files changed, 18 insertions, 4 deletions
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