io: phase 2.5 — writer thread + bounded ring + active-cluster buffer
WritebackFile now offloads all File I/O to a dedicated writer thread. Muxer's Write/Seek/sync_all push into a bounded byte ring; the writer drains the ring and runs the syscalls. - Commands: Write(Vec<u8>), Seek(SeekFrom), SyncAll(oneshot), Finish(oneshot). One ring carries all four; ordering preserved. - ActiveClusterBuffer mirrors the last ACTIVE_CLUSTER_WINDOW_BYTES written. Seek-back within window → in-memory patch + re-emit (no forced drain). Seek-back outside window → real drain+seek. Wins for MKV: cluster size patches almost always land inside the active window; only the end-of-mux Cues + segment header backpatch fall outside. - Ring capacity RING_CAPACITY_BYTES = 128 MiB. Backpressure on full blocks the muxer (correct semantics for archival workflows). - All syscalls in writer thread wrapped in bounded_syscall(60s) so a wedged NFS doesn't pin the thread forever. - Drop drains via Finish + joins the writer thread; sync_all blocks until ring drained AND underlying fsync completes.
This commit is contained in: