* fix(mount): reduce chunk fragmentation from random writes
Random writes via FUSE mount create many small partially-overlapping
chunks that bloat storage and slow reads. Two complementary fixes:
1. Fill gaps at seal time: when a partial writable chunk is sealed for
upload, read existing file data into the unwritten regions so
SaveContent uploads one complete chunk instead of many fragments.
No overhead for sequential writes (IsComplete short-circuits).
2. Merge on fsync: after CompactFileChunks, if total non-manifest
chunk data exceeds 2x the logical file size, re-read and re-upload
the entire file as properly-sized chunks. The filer's cleanupChunks
garbage-collects all superseded chunks.
* revert FillGaps: reading from volume servers during write path is too expensive
* test(mount): add tests for chunk merge condition
Extract shouldMergeChunks as a testable function and add tests covering:
- empty file, single chunk, non-overlapping chunks (no merge)
- exactly 2x boundary (no merge) vs just over 2x (merge)
- manifest chunks extend file size but don't count toward stored total
- input slices are not mutated (safe append)
- CompactFileChunks + condition: fully superseded, staggered overlaps,
75% overlap pattern, many 4K writes at 1K step
- randomized bloat detection (50 iterations)
- visible content preserved after compaction (100 iterations)
* fix(mount): cap merge buffer at file size for small files
Avoids allocating a full ChunkSizeLimit buffer when the file being
merged is smaller. Addresses PR review feedback.