fix(lib-jj-helpers): pipeline lock takeover の二重Acquiredレース解消 - #273
Conversation
…再検証を追加 — 二重Acquiredレースの解消 concurrent_stale_takeover_only_one_wins が cargo test --workspace 並列実行下でflakyだったのは、 takeover 時の remove_file が無条件で、先着プロセスが作った fresh lock を後発側が検証なしに 消してしまい両方Acquiredになりうる残余レースが実際に再現したため。remove直前に現在のcontentを 再読込しstale時点のsnapshotと比較、一致する場合のみ削除するよう変更。10回連続テストで再現しないことを確認。
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthrough既存ロックの鮮度判定を内容ベースに分離し、stale takeover 前後のロック内容を比較する処理と、その競合ケースを検証する回帰テストを追加した。 Changesパイプラインロック競合処理
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🤖 PR Monitor 分析 (GitHub Actions バックストップ)
Applicable Findings (Critical / High / Major)該当なし (レビュー指摘 0 件) Applicable Findings (Medium 以下)該当なし Filtered (not applicable)該当なし 次のアクション
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
🤖 PR Monitor 分析 (GitHub Actions バックストップ)
Applicable Findings (Critical / High / Major)該当なし (レビュー指摘 0 件) Applicable Findings (Medium 以下)該当なし Filtered (not applicable)該当なし 次のアクション
|
* docs(todo): PR #273 post-merge feedback採用6件 (順位301-306) - 301: TOCTOU (remove+create_new) パターン検出 lint rule (exclusive lock実装限定) - 302: deterministic concurrency test テンプレート記録 - 303: advisory lock の TOCTOU window 許容可否 明示コメント設計チェックリスト - 304: quality gate混入時の jj split + jj rebase 復旧パターン記録 - 305: metrics violation の pre-existing 判定基準明文化 - 306: quality gate isolation機構見送りのnegative result記録 * fix(review): apply CodeRabbit fixes for #274 Resolved findings: - [Major] docs/todo13.md:1241 コメントの有無では TOCTOU 対策を検出できません。 - [Major] docs/todo13.md:1317 pre-existing override の監査証跡を完了基準に追加してください。 - [Major] docs/todo13.md:1337 **復旧 convention は isolation の代替ではありません。** `jj split`/`jj rebase` は混入後の復旧策であり、混在した変更に対する gate 実行を予防しな… * fix(review): CodeRabbit Major 3件対応 — 順位301/304/305/306 の完了基準・記録内容を修正 (PR #274) - 301: comment-presence のみのlint検出をpattern検出(読込→比較→remove_fileの出現順序)へ強化、 negative fixture (コメントのみ実装が検出されること)を追加、271.mdで既に却下された類似案との 関連を明記 - 305: pre-existing override監査証跡に基準時点/現時点の計測差分を追加要件化 - 304/306: 'recoveryはisolationの代替' という誤った表現を修正。304に混在gate結果の無効化・ 再実行手順を追加、306に予防機能欠如という残存リスクと再検討条件を明記 - 本文中の順位N直接参照(ADR-033違反)を3箇所修正 (スペースなし表記のため既存grepで未検出だった分含む)
Summary
PR #271 で導入した pipeline lock の stale takeover ロジック (
pipeline_lock.rs) に、cargo test --workspaceの並列実行下で顕在化する flaky なレース条件があったため修正します。PR #272 (docs のみの想定) の quality gate 実行中にconcurrent_stale_takeover_only_one_winsが偶発的に失敗し発覚しました。原因
takeover_stale_lockのremove_fileが無条件実行だったため、以下の interleaving で 2 プロセスともAcquiredになり得ました:remove_file→ 成功 (stale lock 削除)create_new→ 成功 (A の fresh lock 作成、A = Acquired)remove_file→ A が作った fresh lock を検証なしに削除create_new→ 成功 (B の lock 作成、B も Acquired)修正
remove_file実行直前に、stale と判定した時点の生 content (stale_snapshot) と現在の content を再比較し、一致する場合のみ削除するように変更しました。他プロセスが同じ隙間で先に takeover 済み (content が変化済み) なら削除をスキップし、後続のcreate_newが自然にAlreadyExistsで失敗してBusyに落ちます。read_fresh_lockのロジックをis_fresh_contentに分離し、生 content を直接受け取れるようにして再利用concurrent_stale_takeover_only_one_wins(実スレッドレース) を 10 回連続実行して再発しないことを確認takeover_stale_lock_skips_remove_when_snapshot_is_stale(決定論的な regression test) が追加され、レース条件に頼らずこの修正を直接検証Test plan
cargo test --workspacegreen (全 crate)cargo clippy --workspace --all-targets -- -D warningswarnings なしconcurrent_stale_takeover_only_one_winsを 10 回連続実行し flaky でないことを確認Summary by CodeRabbit