Skip to content

ChunkerFixed: do not take a short read for EOF (1.4-maint) - #10563

Merged
ThomasWaldmann merged 2 commits into
borgbackup:1.4-maintfrom
ThomasWaldmann:fixed-chunker-short-read-14
Oct 29, 2026
Merged

ThomasWaldmann merged 2 commits into
borgbackup:1.4-maintfrom
ThomasWaldmann:fixed-chunker-short-read-14

Conversation

@ThomasWaldmann

@ThomasWaldmann ThomasWaldmann commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

ChunkerFixed.chunkify() took any short read (got < wanted) for EOF and stopped. Reads from a pipe or FIFO often return less than requested, so borg create --read-special --chunker-params fixed,... could silently archive only a truncated part of a FIFO's content. On macOS, 3 MiB written into a pipe came out as only 64 KiB of chunks.

After a short read, the chunker now keeps reading until the block is full or a read returns no data (real EOF). Filling the block also keeps the chunk boundaries at fixed offsets, so dedup is not affected.

Master fixed this as part of #10166 (in chunkers/reader.pyx). That code was rewritten on master, so this is a separate fix for 1.4-maint, not a cherry-pick.

Tests: the new test_chunkify_short_reads uses a file object that returns at most 100 bytes per read, with and without a header block. It fails without the fix and passes with it.

Note: the posix_fadvise() / ESPIPE fix for the same scenario is not part of this PR (it was pushed after the merge), see #10569.

🤖 Generated with Claude Code

blockify() stopped reading the whole input as soon as a read returned less
than the requested block size. A short read is not EOF though, e.g. when
reading from a pipe: "borg create --read-special" with the fixed chunker
archived only the first 64 KiB of a FIFO's content (seen on macOS) and
silently dropped the rest.

Now keep reading until the block is complete or a read returns nothing.
Filling the block also keeps the chunk boundaries at fixed offsets.

master is not affected any more, see borgbackup#10166.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.09%. Comparing base (302c7b2) to head (6498b37).
⚠️ Report is 11 commits behind head on 1.4-maint.

Additional details and impacted files
@@              Coverage Diff              @@
##           1.4-maint   #10563      +/-   ##
=============================================
- Coverage      82.11%   82.09%   -0.02%     
=============================================
  Files             38       38              
  Lines          11480    11485       +5     
  Branches        1808     1810       +2     
=============================================
+ Hits            9427     9429       +2     
- Misses          1467     1469       +2     
- Partials         586      587       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

Same behaviour and same read calls, just one loop instead of a first
read followed by a loop for the rest of the block.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ThomasWaldmann
ThomasWaldmann merged commit 9c02e7e into borgbackup:1.4-maint Oct 29, 2026
13 of 15 checks passed
@ThomasWaldmann
ThomasWaldmann deleted the fixed-chunker-short-read-14 branch October 29, 2026 20:51
@github-actions

Copy link
Copy Markdown

Successfully created backport PR for 1.2-maint:

ThomasWaldmann added a commit that referenced this pull request Oct 29, 2026
chunkify() stopped reading the whole input as soon as a read returned less
than the requested block size. A short read is not EOF though, e.g. when
reading from a pipe: "borg create --read-special" with the fixed chunker
archived only the first 64 KiB of a FIFO's content (seen on macOS) and
silently dropped the rest.

Now keep reading until the block is complete or a read returns nothing.
Filling the block also keeps the chunk boundaries at fixed offsets.

Port of #10563 from 1.4-maint. master is not affected any more, see #10166.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant