Repository navigation
fix(automation): publish scheduler pause state atomically - #4357
Conversation
|
Co-authored-by: ScriptedAlchemy <25274700+ScriptedAlchemy@users.noreply.github.com>
3809057 to
47c61f2
Compare
ScriptedAlchemy
left a comment
There was a problem hiding this comment.
Pushed 2119d79 to close the behavioral coverage gap for #4208. Production readers overlap 64 pause/unpause publications, and failures injected through the existing publication primitive must preserve committed pause bytes, report the error and remove staging files. Corrupt JSON must retain the typed Config error. No deadline, budget or production fault hook changed. Pinned rustfmt, whitespace and commitlint pass; native execution is with CI.
ScriptedAlchemy
left a comment
There was a problem hiding this comment.
Pushed the durability follow-up. Scheduler pause publication now creates missing profile/dashboard ancestors through PrivateStoreIo::create_dir_all_durable before atomic replacement. The canonical Windows replacement path uses the existing validated Unicode/long-path encoding with MoveFileExW(REPLACE_EXISTING | WRITE_THROUGH); no cross-volume copy fallback is allowed. Rebuildable accelerator writes keep their existing non-durable behavior. Added ancestor-barrier failure/retry and private hierarchy regressions plus Windows held-reader, delete-sharing denial, staging cleanup, long-path, embedded-NUL and no-replace checks. Pinned rustfmt, diff checks, and commitlint pass; native/Windows execution awaits CI.
Reuse the ingest probe's WAL restart alignment before settling each retention fixture. Preserve the64-message window and1.2x scaling bound, and assert that neither measured tick includes periodic checkpoint work. Warm-up retention remains free to settle and checkpoint its backlog.
Open existing sidecars through the shared no-follow capability path and acquire the same exclusive lock. This removes repeated durable directory setup from existing-lock reads while preserving first-creation and writer publication barriers. Use the canonical namespace-sync fault injector to prove settled reads avoid namespace publication. Cover first-creation and writer failures, parent aliases, final symlink refusal, and cross-process inode exclusion.
Persist scheduler pause changes through the private filesystem authority so readers observe complete control states and a successful save follows namespace durability barriers. Create missing dashboard ancestors durably before atomic publication, retain typed corruption errors, and preserve staging cleanup and prior state on pre-publication failure.
Windows publication uses the shared write-through MoveFileExW authority for replacement and no-replace operations. Open readers allow deletion sharing, so existing readers cannot prevent replacement. Coverage includes denied-delete cleanup, long Unicode paths, invalid NUL paths, and no-replace semantics. Rebuildable accelerator writes retain their lighter path.
Ready pull requests retain master's native Windows workspace build and the required
Test Windowscheck name. Manual native tests can select macOS or Windows and explicit Bazel target patterns. Draft pull requests skip heavy builds. Codex exact-session lookup fixtures force retained continuation across date buckets independently of filesystem entry ordering.Validation:
1afb526432ec3bc7dcd8c099fd16f6440d67bdd4merges master12e828ec84. The only manual conflict was inprivate-fs/tests/framed_log.rs: retain all Windows publication tests and master's Linux barrier-observation regression, including exact member/unrelated barrier counts, byte readback, and missing-member refusal. Scheduler production source is unchanged.00f74eaf-d255-45b2-97c8-3cb4aa794f86). The Windows-only atomic-publication target compiled with zero Linux cases; this is not Windows runtime evidence.df6f87e4-2961-46bb-8e9f-3c24a4bbeeb5). The wrapper initially expected one test; the corrected count check against the Bazel log confirmed five. Rustc/TestRunner were remote, local fallback disabled, priority 10, minimal output downloads. Frozen pnpm install, whitespace, and the commit hook passed. The normal push passed a fresh ancestry guard. Full hosted CI on the updated head remains required before merge.Historical evidence:
55d45866e895dcf5b400d4379a0a7d584a307c01only moves the new scheduler test imports to module scope afterc98ee67d71. All five scheduler-control tests passed remotely, with no ignored cases (427 unrelated tests filtered): atomic read/write, missing ancestors, ancestor sync failure, concurrent readers, and failed staging. Invocation:5c9b7ce9-821a-434d-8355-d99295bc751e. Rust compilation and tests used remote workers with local fallback disabled; the Bazel formatting action passed locally in a sandbox (d098d60f-4866-458c-bf63-7b00bec8f103). Whitespace and commitlint passed. Required hosted CI must pass on this updated head before merge.c98ee67d71, hosted Linux fleet and aggregate, Clippy, shipped CLI, native Windows workspace build, repository gates, dashboard, feature gates, and benchmark checks passed. Optional manual macOS and stock-host jobs were skipped by workflow policy. CI run: https://github.com/ScriptedAlchemy/tracedecay/actions/runs/39810344331.614e3e3461, full remote agent-host and sessions unit suites passed: 579 and 622 tests, with one pre-existing ignored agent-host test and no filtered cases; invocation66c68ac0-1a6a-43d8-8661-be00fdbda6e1.20e215fee7passed all 47 tests across the three filesystem targets, with none filtered: https://github.com/ScriptedAlchemy/tracedecay/actions/runs/39718197724/job/119635047155. The platform publication source is unchanged. Physical power-loss recovery has not been exercised.Fixes #4208.
Daemon admission correction at
69e260430c0e9c7afe0664e9ba03cf160ea561a7:Ledger read correction at
d76b2899e98668ce5dec6f3d824d603b5144ea24(preserves daemon fix69e260430c):