fix(catalog-gate): private scratch dir per regeneration, so concurrent runs stop failing each other (Closes #6058) - #6059
Conversation
…er (control, fails on master) Two tests on master's code, before the fix, so CI shows them failing: 8 threads released together through a Barrier into check_emitted_at, and the emitted line that never says where the catalog was regenerated. Refs #6058 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on master's code in CI (Refs #6058) Control run 37202843986 on 9cebc39: the_emitted_line_names_the_regeneration_and_its_removal FAILED as expected, but concurrent_regenerations_do_not_remove_each_other passed: one round of 8 threads finished before any two overlapped. A regression test that passes on the bug is not a control. Each thread now regenerates 25 times back to back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d fixed path generate_emitted wrote into $TMPDIR/t27-catalog-emitted, removed and recreated by every run: two runs at once removed each other's output and the loser reported emitted-unreadable for a catalog that is fine. Each run now creates its own directory (pid plus a process-wide counter, create_dir so an existing one is never adopted or removed) and removes it when the comparison is done. The emitted line names that directory and says it is gone; the old "generated into" text was overwritten on every path. Adds the third test (a directory is private and removed by its owner), which needs the new type and so cannot run as a control. Closes #6058 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR DashboardGenerated at: 2026-10-04 13:16:21 UTC
Summary
Seal Status
|
|
Control on master's code, built and tested by Bootstrap Test Ratchet on GitHub's runners:
The fix |
PR DashboardGenerated at: 2026-10-04 13:42:01 UTC
Summary
Seal Status
|
|
Fix head
|
Closes #6058
What
generate_emittedinbootstrap/src/catalog_gate.rsregenerated the numeric catalog into one fixed$TMPDIR/t27-catalog-emitted, removed and recreated by every run. Two runs at once removed each other's output, and the loser reportedemitted-unreadablefor a catalog that is fine (a false Phase 7 failure, seen 2026-10-04 with two concurrentt27c suiteruns).create_dir, so an existing directory is never adopted or removed. AScratchguard removes it after the comparison.emittedline names that directory and says it is removed. The oldgenerated into ...text was overwritten on every path and never reached the report.Proof, built and run on GitHub's runners (not on a workstation)
The branch has two commits, pushed one at a time on purpose:
9cebc3968(control): two of the new tests on master's code, unfixed. They are expected to FAIL in Bootstrap Test Ratchet:concurrent_regenerations_do_not_remove_each_other(8 threads through aBarrier) andthe_emitted_line_names_the_regeneration_and_its_removal.16cf34854(fix): the same tests plusa_regenerated_directory_is_private_and_removed_by_its_owner, which needs the new type and so cannot be a control. Expected to pass, with no test newly failing against the baseline.The run links for both heads are added to this PR as comments once they finish.
Boundary
bootstrap/src/catalog_gate.rsonly.bootstrap/is the owner's to merge.🤖 Generated with Claude Code