Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
2fca1d3
chore(deps): pin xet-core to 40f95307
XciD May 28, 2026
23d3b81
feat(xet): add range_upload over pre-snapshotted dirty ranges
XciD May 28, 2026
6964e1d
feat(inode): add SparseWriteState with coverage map
XciD May 28, 2026
118bf4f
feat(vfs): add sparse_writes config + per-inode I/O lock
XciD May 28, 2026
5cf732b
feat(vfs): install sparse_write in open_advanced_write
XciD May 28, 2026
3b80ddc
feat(vfs): fill sparse holes from CAS and cache into staging
XciD May 28, 2026
2271825
feat(vfs): track writes in sparse_write under io_lock
XciD May 28, 2026
daceb10
feat(vfs): wire sparse_write through setattr
XciD May 28, 2026
36f13d2
feat(flush): sparse upload via range_upload + apply_commit_sparse
XciD May 28, 2026
6de58f8
feat(setup): add --sparse-writes flag (implies --advanced-writes)
XciD May 28, 2026
b242229
docs(inode): note that sparse_write outlives a poll-rotation
XciD May 28, 2026
90649da
test(vfs): invariant tests for sparse-write path
XciD May 28, 2026
40a1459
test+ci: wire fsx_paranoid CAS round-trip into the fsx job
XciD May 28, 2026
d875f45
fix(vfs): close 3 codex findings on sparse_write
XciD May 28, 2026
3abcaa1
test(vfs): harden sparse reopen + hash-drift regression tests
XciD May 28, 2026
942ddfb
fix(vfs): close sparse-write review findings (data loss, lock content…
XciD May 29, 2026
d76f756
fix(vfs): address re-review findings on the sparse-write fixes
XciD May 29, 2026
d0d6cb6
refactor(vfs): simplify sparse-write code (dedup, drop redundant state)
XciD May 29, 2026
20aef41
fix(vfs): rebuild stale sparse state on hash drift in setattr
XciD May 29, 2026
d9fff67
fix(vfs): cache hole-fills on read-only sparse handles, harden fsx_pa…
XciD May 29, 2026
f478a78
fix(vfs): isolate flush-batch failures and harden setattr sparse-install
XciD Jun 1, 2026
de8d73f
test(vfs): regression + smoke tests for flush isolation and sparse edges
XciD Jun 1, 2026
247a56e
fix(vfs): address codex findings on the sparse-write fixes
XciD Jun 1, 2026
e90f056
fix(vfs): drop sparse-install staging file on non-xet drift EIO
XciD Jun 1, 2026
34698b6
fix(vfs): avoid debiting GC budget on the EIO drift rollback
XciD Jun 1, 2026
f54af0e
fix(vfs): clamp sparse hole-fill cache writes to live inode size
XciD Jun 1, 2026
8201ac5
fix(vfs): take io_lock in setattr to serialize against fill_sparse_holes
XciD Jun 1, 2026
a9991b8
fix(vfs): always take io_lock on the advanced-writes pwrite path
XciD Jun 1, 2026
f4e106e
docs(vfs): clarify io_lock scope in write() and lock-order header
XciD Jun 1, 2026
f27e337
test(xet): pin plan_original_ranges boundary for drift-gap snapshot
XciD Jun 1, 2026
03f1eae
fix(vfs): only stamp commit clocks on a generation match
XciD Jun 1, 2026
7436c2c
fix(vfs): preserve sparse Pass A successes on Pass B failure
XciD Jun 1, 2026
9ba81cc
fix(vfs): drop per-inode lock map entries on inode eviction
XciD Jun 1, 2026
9ad3331
fix(vfs): hold io_lock around sparse-staging O_TRUNC + set_len
XciD Jun 1, 2026
5ce6813
fix(vfs): zero-byte pwrite past EOF must be a no-op
XciD Jun 1, 2026
142f178
fix(vfs): warn on stuck punched staging during drift-to-non-xet
XciD Jun 1, 2026
287f8b6
test(vfs): regression tests for the review-pass fixes
XciD Jun 1, 2026
a55d931
refactor(vfs): drop defensive code for unreachable Xet → non-Xet rota…
XciD Jun 1, 2026
aac3a53
refactor(vfs): drop now-dead gap-tracking branch in setattr
XciD Jun 1, 2026
12b32d4
test(xet): drop drift-gap-boundary test, premise removed in setattr r…
XciD Jun 1, 2026
1f622cd
refactor(vfs): simplify SparseWriteState API and dedup setattr branches
XciD Jun 1, 2026
3f4cb3f
refactor(flush): inline snapshots_result intermediate
XciD Jun 1, 2026
70b3c00
test(vfs): add concurrent sparse-write stress harness
XciD Jun 1, 2026
f4d4203
fix(vfs): eliminate user-visible EIO from sparse-open drift races
XciD Jun 1, 2026
6f34724
test(vfs): add remote rotations to the stress harness + update drift …
XciD Jun 1, 2026
e56d288
bench(vfs): delta-weight-sync style benchmark for sparse-write vs ful…
XciD Jun 1, 2026
f75a957
debug(bench): instrument range_upload args + post-seed file size check
XciD Jun 1, 2026
836c3ce
debug(vfs): trace every write op to find the source of bench size drift
XciD Jun 1, 2026
31ad291
fix(vfs): use authoritative on-disk size, not XetFileInfo.file_size
XciD Jun 1, 2026
69e0c05
bench(vfs): align with the realistic delta-weight-sync workflow
XciD Jun 2, 2026
c0408c2
bench(vfs): fix clippy needless_range_loop
XciD Jun 2, 2026
8557225
perf(vfs): small-file fallback for sparse-writes
XciD Jun 2, 2026
de94317
perf(flush): fast-path full-coverage sparse items to upload_files
XciD Jun 2, 2026
dc026c8
bench(vfs): add cold-cache delta bench to expose sparse-write wire sa…
XciD Jun 2, 2026
70b53e2
fix(flush): route fast-path full-coverage commits through apply_commit
XciD Jun 2, 2026
769c473
fix(vfs): use EAGAIN sentinel for sparse-write drift and align setatt…
XciD Jun 2, 2026
efe1f61
fix(vfs): improve sparse-write diagnostics and document setattr io_lo…
XciD Jun 2, 2026
977e50d
fix(tests): override sparse min-size threshold so small-file tests/be…
XciD Jun 2, 2026
12e86ac
fix(tests): pass HF_MOUNT_SPARSE_MIN_BYTES via Command::env instead o…
XciD Jun 2, 2026
2020215
test(vfs): same-inode concurrent sparse-write stress harness
XciD Jun 2, 2026
e19f714
test(vfs): same-inode verified-integrity stress with byte-level oracle
XciD Jun 2, 2026
dadc1df
test(vfs): instrument verified-integrity stress with op/CAS counters
XciD Jun 2, 2026
2dec5ce
test: real-CAS multi-worker sparse-write stress + fail loud on missed…
XciD Jun 2, 2026
bf8f82d
test+nfs: backport sparse-write invariant tests from PR #41
XciD Jun 2, 2026
f94088b
test(real-cas): make slot size and intermediate fsync configurable
XciD Jun 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,14 @@ jobs:
timeout-minutes: 10
run: cargo test --release --test fsx -- --test-threads=1 --nocapture

- name: fsx paranoid (CAS round-trip per mutation, --sparse-writes)
timeout-minutes: 15
run: cargo test --release --test fsx_paranoid -- --test-threads=1 --nocapture

- name: sparse concurrent real-CAS (multi-worker same-inode, --sparse-writes)
timeout-minutes: 15
run: cargo test --release --test sparse_concurrent_real -- --test-threads=1 --nocapture

xfstests:
name: xfstests (filesystem exerciser)
runs-on:
Expand Down
122 changes: 24 additions & 98 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ categories = ["filesystem", "command-line-utilities"]

[dependencies]
# xet-core crates
xet-client = { git = "https://github.com/huggingface/xet-core.git", branch = "main" }
xet-core-structures = { git = "https://github.com/huggingface/xet-core.git", branch = "main" }
xet-data = { git = "https://github.com/huggingface/xet-core.git", branch = "main" }
xet-runtime = { git = "https://github.com/huggingface/xet-core.git", branch = "main" }
xet-client = { git = "https://github.com/huggingface/xet-core.git", rev = "40f9530753e48f9517b5ad09e2339df7059d8de4" }
xet-core-structures = { git = "https://github.com/huggingface/xet-core.git", rev = "40f9530753e48f9517b5ad09e2339df7059d8de4" }
xet-data = { git = "https://github.com/huggingface/xet-core.git", rev = "40f9530753e48f9517b5ad09e2339df7059d8de4" }
xet-runtime = { git = "https://github.com/huggingface/xet-core.git", rev = "40f9530753e48f9517b5ad09e2339df7059d8de4" }

# External crates
async-trait = "0.1"
Expand Down
9 changes: 9 additions & 0 deletions src/nfs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -816,6 +816,15 @@ fn errno_to_nfs(e: i32) -> nfsstat3 {
libc::ENOTEMPTY => nfsstat3::NFS3ERR_NOTEMPTY,
libc::EBADF => nfsstat3::NFS3ERR_STALE,
libc::ENOSPC => nfsstat3::NFS3ERR_NOSPC,
// EAGAIN is used internally as the sparse-write drift sentinel
// (`open_advanced_write` returns it when poll rotates xet_hash
// between snapshot and install). The internal retry loop in
// `open()` normally upgrades a final EAGAIN to EIO so userspace
// never sees it, but map it defensively here to NFS3ERR_JUKEBOX
// (the conventional retryable-busy code) so a future code path
// that leaks EAGAIN doesn't degrade to NFS3ERR_IO on an NFS
// export.
libc::EAGAIN => nfsstat3::NFS3ERR_JUKEBOX,
_ => nfsstat3::NFS3ERR_IO,
}
}
Expand Down
Loading