From f52bbe5d950f63eb10751f001e697caaa3920c05 Mon Sep 17 00:00:00 2001 From: clawbot <35+clawbot@noreply.example.org> Date: Tue, 3 Nov 2026 05:00:51 +0100 Subject: [PATCH] Say ZFS counts a new file's blocks up to seconds after the write (closes #152) `README.md` and a comment in `scan.go` said ZFS counts a new file's blocks only seconds after the write. The count can land in under a second, so both now say up to seconds after the write, as the comment on `diskSizeOf` already does. Model: opus-5-5 --- README.md | 6 +++--- TODO.md | 5 +++++ scan.go | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c1b0fe3..6b7e6cc 100644 --- a/README.md +++ b/README.md @@ -407,9 +407,9 @@ operands: is what makes a daily rescan cheap. - When such a file's size on disk differs from its recorded `disk_size`, `scan` updates `disk_size` alone. It still does not read the file, and counts it as - unchanged. ZFS, for example, counts a new file's blocks only seconds after the - write. A block is the unit in which a filesystem allocates disk space. A file - scanned within those seconds gets its real `disk_size` at the next scan. + unchanged. ZFS, for example, counts a new file's blocks up to seconds after + the write. A block is the unit in which a filesystem allocates disk space. A + file scanned within those seconds gets its real `disk_size` at the next scan. - `scan` hashes a file again when its size differs or its mtime is newer. The mtime is compared to the nanosecond, as finely as the filesystem records it. A same-size rewrite counts as a change whenever the filesystem gives it a later diff --git a/TODO.md b/TODO.md index 10b63b4..52806ed 100644 --- a/TODO.md +++ b/TODO.md @@ -29,6 +29,11 @@ Newest first. An entry ends with its date and its issue or branch, where those are known. +- `README.md` and a comment in `scan.go` no longer say ZFS counts a new file's + blocks only seconds after the write. The count can land in under a second. + Both now say up to seconds after the write, as the comment on `diskSizeOf` in + `scan_test.go` does (2026-11-03, https://git.eeqj.de/sneak/sfdupes/issues/152) + - The three disk size tests in `scan_test.go` no longer fail at random on ZFS. `unix.Sync` can return before ZFS has counted a file's blocks, and one ZFS commit can take a file through several sizes. The test that needs the size to diff --git a/scan.go b/scan.go index a6dbc0a..a823094 100644 --- a/scan.go +++ b/scan.go @@ -554,7 +554,7 @@ func (s *scanState) walkPhase(events <-chan walkEvent, roots []string) { // The space a file takes on disk can change while its size and // mtime stay the same. ZFS, for one, counts a new file's blocks - // only seconds after the write. + // up to seconds after the write. if old.diskSize != ev.rec.diskSize { s.diskSizes = append(s.diskSizes, ev.rec) }