From 47f66c084291040fb11212956df9033bf263a892 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 3 Feb 2023 19:06:22 -0700 Subject: btrfssum: Split shortsum.go in to several files --- lib/btrfs/btrfssum/sumrun.go | 58 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 lib/btrfs/btrfssum/sumrun.go (limited to 'lib/btrfs/btrfssum/sumrun.go') diff --git a/lib/btrfs/btrfssum/sumrun.go b/lib/btrfs/btrfssum/sumrun.go new file mode 100644 index 0000000..1000e7a --- /dev/null +++ b/lib/btrfs/btrfssum/sumrun.go @@ -0,0 +1,58 @@ +// Copyright (C) 2022-2023 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package btrfssum + +import ( + "context" + "io" + + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" +) + +type SumRun[Addr btrfsvol.IntAddr[Addr]] struct { + // How big a ShortSum is in this Run. + ChecksumSize int `json:",omitempty"` + // Base address where this run starts. + Addr Addr `json:",omitempty"` + // All of the ShortSums in this run, concatenated together. + Sums ShortSum +} + +func (run SumRun[Addr]) NumSums() int { + return len(run.Sums) / run.ChecksumSize +} + +func (run SumRun[Addr]) Size() btrfsvol.AddrDelta { + return btrfsvol.AddrDelta(run.NumSums()) * BlockSize +} + +// Get implements diskio.Sequence[int, ShortSum] +func (run SumRun[Addr]) Get(sumIdx int64) (ShortSum, error) { + if sumIdx < 0 || int(sumIdx) >= run.NumSums() { + return "", io.EOF + } + off := int(sumIdx) * run.ChecksumSize + return run.Sums[off : off+run.ChecksumSize], nil +} + +func (run SumRun[Addr]) SumForAddr(addr Addr) (ShortSum, bool) { + if addr < run.Addr || addr >= run.Addr.Add(run.Size()) { + return "", false + } + off := int((addr-run.Addr)/BlockSize) * run.ChecksumSize + return run.Sums[off : off+run.ChecksumSize], true +} + +func (run SumRun[Addr]) Walk(ctx context.Context, fn func(Addr, ShortSum) error) error { + for addr, off := run.Addr, 0; off < len(run.Sums); addr, off = addr+BlockSize, off+run.ChecksumSize { + if err := ctx.Err(); err != nil { + return err + } + if err := fn(addr, run.Sums[off:off+run.ChecksumSize]); err != nil { + return err + } + } + return nil +} -- cgit v1.2.3-2-g168b From ef60daef395b20b67042c011f5b2a1131049e275 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 3 Feb 2023 19:50:35 -0700 Subject: rebuildmappings: Optimize the KMP search --- lib/btrfs/btrfssum/sumrun.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'lib/btrfs/btrfssum/sumrun.go') diff --git a/lib/btrfs/btrfssum/sumrun.go b/lib/btrfs/btrfssum/sumrun.go index 1000e7a..bc2db3f 100644 --- a/lib/btrfs/btrfssum/sumrun.go +++ b/lib/btrfs/btrfssum/sumrun.go @@ -6,9 +6,9 @@ package btrfssum import ( "context" - "io" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" + "git.lukeshu.com/btrfs-progs-ng/lib/diskio" ) type SumRun[Addr btrfsvol.IntAddr[Addr]] struct { @@ -20,21 +20,21 @@ type SumRun[Addr btrfsvol.IntAddr[Addr]] struct { Sums ShortSum } -func (run SumRun[Addr]) NumSums() int { +var _ diskio.Sequence[int, ShortSum] = SumRun[btrfsvol.LogicalAddr]{} + +// SeqLen implements diskio.Sequence[int, ShortSum]. +func (run SumRun[Addr]) SeqLen() int { return len(run.Sums) / run.ChecksumSize } func (run SumRun[Addr]) Size() btrfsvol.AddrDelta { - return btrfsvol.AddrDelta(run.NumSums()) * BlockSize + return btrfsvol.AddrDelta(run.SeqLen()) * BlockSize } -// Get implements diskio.Sequence[int, ShortSum] -func (run SumRun[Addr]) Get(sumIdx int64) (ShortSum, error) { - if sumIdx < 0 || int(sumIdx) >= run.NumSums() { - return "", io.EOF - } - off := int(sumIdx) * run.ChecksumSize - return run.Sums[off : off+run.ChecksumSize], nil +// SeqGet implements diskio.Sequence[int, ShortSum]. +func (run SumRun[Addr]) SeqGet(sumIdx int) ShortSum { + off := sumIdx * run.ChecksumSize + return run.Sums[off : off+run.ChecksumSize] } func (run SumRun[Addr]) SumForAddr(addr Addr) (ShortSum, bool) { -- cgit v1.2.3-2-g168b