- subprocess_verify_tcp: reports pending adds, clean after sync (TCP) - subprocess_sync_delete: server-side deletion via --allow-delete + --delete - subprocess_sync_dry_run: shows would-add without writing any files - subprocess_hdf5_sync_cold_copy: cold copy of 2 HDF5 datasets via serve-hdf5 - ServeAllServer::start_with_delete() helper for --allow-delete servers - ServeHdf5Server helper for serve-hdf5 subprocess tests - CHANGELOG: document QUIC stream/close race fix in v0.1.0 ### Fixed section 660 tests, 0 failures. Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
5.8 KiB
5.8 KiB
Changelog
All notable changes to this project are documented in this file.
Format follows Keep a Changelog. Versioning follows Semantic Versioning.
[0.1.0] — 2026-04-06
Initial release of the ClawSync workspace.
Added
Core primitives (clawsync-core)
- BLAKE3 + xxHash3-64 checksums with Rayon-parallel batch hashing
- FastCDC content-defined chunking (variable-length, insertion-stable)
- SIMD-accelerated CDC via Gear hash (NEON/SSE2; opt-in
simd-cdcfeature) - zstd and lz4 streaming compression wrappers
- Fixed-block delta encoding (copy/insert operations, apply, size accounting)
Wire protocol (clawsync-transport)
- Length-prefixed rkyv framing over TCP, QUIC (quinn/rustls), mmap ring-buffer, and stdin/stdout pipes
SyncMessageenum with 22 variants (append-only; discriminants stable)SyncPeerabstraction unifying TCP / QUIC / Mmap / Stream behind a single send/recv interfacePipeWriteHalf/PipeReadHalffor W=16 split-pipeline pushStreamPeer::from_child/from_stdiofor SSH and pipe transports- QUIC with self-signed TLS 1.3 (dev) or custom
QuicConfig(production)
ClawOnion VFD (clawhdf5-onion)
- Pure-Rust HDF5 versioning sidecar: diff-based commits, full-state snapshots, branch fork/merge
- zstd + TDT float compression per page (codec negotiable per-file)
- GC policies: KeepLastN, KeepTagged, KeepSince, KeepRevisions + epoch-based O(N) gc()
- Merkle tree over revision layers for O(log N) sync-diff walks
- Rateless IBLT sketches for sub-linear pre-flight revision set comparison
VersionedFilehigh-level API: open/create/commit/branch/merge/snapshot/export- Golden file format freeze test (4417-byte canonical representation)
revision_page_entriesfor zero-copy page metadata access
Sync engine (clawsync-onion, clawsync-hdf5)
- IBLT-based push pre-flight: 30× wire savings at N=1K+ revisions vs flat manifest
- W=16 pipelined push: 13–15× faster than stop-and-wait at 1–5 ms simulated RTT
SyncSelector: filter by branch, revision ceiling, or "all"- HDF5 dataset-granular sync: only modified datasets transferred per file
- Dataset-level differ, patcher, and manifest with
want_delete/allow_deleteguards
Agent library (clawsync-agent)
SyncBackendtrait: pluggable push/pull transportTcpSyncBackend: push/pull over TCP with W=16 IBLT pipelineQuicSyncBackend: push/pull over QUIC (TLS 1.3, self-signed for dev)SshSyncBackend: push/pull over SSH pipe — spawnsclawsync serve --stdioon demand, no pre-running daemon required; overridable viaCLAWSYNC_SSH_COMMANDOnionMemory: autonomous flush → sync lifecycle with WALSyncScheduler: debounced background sync with configurable interval
General file sync (clawsync-fs)
- CDC-based delta for any file type: only missing FastCDC chunks transferred
FsSyncClient/FsSyncServer: 2-RTT push protocol with W=16 pipeliningFsSyncPullClient/FsSyncPullServer: reverse (server→client) directionFsManifest: parallel BLAKE3 walk via rayon;.clawsync.statenanosecond-mtime cacheFsDiffer: Added/Modified/Removed/Unchanged classificationFsDelta: chunk-level need computation and reconstruction with BLAKE3 integrity check- mtime preservation on synced files (±2 s tolerance for FAT/NFS)
--bwlimit <KBPS>token-bucket rate limiter--dry-run/--verbose/--delete/--exclude <glob>optionsfs_status()+FsStatusReport: local-only A/M/D change detection vs.clawsync.state
CLI (clawsync-cli)
push/pull— revision sync for.onionHDF5 sidecarsserve— TCP/QUIC server for push/pull;--stdiofor SSH pipesync/serve-fs— general file sync (any type, CDC delta)pull-fs— reverse file sync (fetch from remote to local)hdf5-sync/serve-hdf5— dataset-granular HDF5 syncwatch— OS FS event watcher (kqueue/inotify) with debounce + auto-reconnectserve-all— single-port universal server dispatching all three protocol typeslist-revisions,rollback,gc,export-revision,snapshot,branch— local onion managementdiff <rev1> [<rev2>]— page-level diff between revisions;--porcelainfor machine outputstatus— local A/M/D report vs.clawsync.statecache (no network)verify— 1-RTT dry-run diff against remote without transferring data- SSH transport on all network commands:
user@host:pathsyntax spawns remote binary on demand --quicflag for QUIC transport on all network commands
Performance (Apple Silicon, cargo bench)
| Operation | Measured | Target |
|---|---|---|
| Commit 1 page (4 KB) | 5.42 µs | — |
| Reconstruct rev=100 (no snapshot) | 68 µs | ≤ 1 ms |
| Reconstruct rev=200 (with snapshot) | 8.1 µs | ≤ 5 ms |
| BLAKE3 (Rayon, 1 MB) | 10.3 GiB/s | ≥ 5 GB/s |
| Branch fork | 3.4 µs | ≤ 100 µs |
| GC 500 revisions | 20.6 µs | ≤ 2 s |
| WAN push W=16 vs W=1 @ 1 ms RTT | 13.5× faster | — |
| WAN push W=16 vs W=1 @ 5 ms RTT | 14.8× faster | — |
| Pre-flight (IBLT) vs rsync at 1 GB | ~4 ms vs ~2 s | 500× faster |
Fixed
- QUIC stream/close race on push:
PipeWriteHalf::shutdown()calledclose_and_drain()immediately after the client sentSyncComplete, which could race the in-flight unidirectional QUIC stream before the server read it. AddedPipeWriteHalf::shutdown_push()— used bycmd_push— that callswait_for_peer_close()instead, keeping the connection alive until the server acknowledges receipt and closes its side.
Notes
- MSRV: Rust 1.85 (Rust 2024 edition)
#![forbid(unsafe_code)]on all clawsync-* cratesSyncMessagediscriminants are stable and append-only; never insert or reorder variants- Publish blocked on upstream
clawhdf5workspace reaching crates.io; publish order documented in README