修复自主构建收束用例的残留断言竞态
finalization 先把 response stream 标为 committed,之后才调用 remove_..._finalization_recovery_sidecars 清理 sidecar,两步之间有真实时间窗。 用例等 committed 的循环一旦命中前半步就退出,紧随其后的四条残留断言却零等待, 在 CI 负载下偶发读到尚未清理的 finalization journal。表现为只改文档的提交也会 挂、上一个提交却能过。 给 journal 断言补上与前面一致的轮询。它是该清理链最后删除的一项,等它消失即可 覆盖后面几条 handoff 残留断言,无需逐条加循环。 只改测试:先对外可见 committed、再清理内部 sidecar 的顺序本身是对的,崩溃恢复 要靠 journal 判断状态。
This commit is contained in:
@@ -584,13 +584,30 @@ async fn autonomous_supervisor_converged_final_reply_deserialize_commits_fallbac
|
||||
}
|
||||
assert_eq!(stream.status, "committed");
|
||||
assert_eq!(stream.accumulated_text, fallback);
|
||||
assert!(read_game_creator_agent_runtime_finalization_journal(
|
||||
// finalization 先把 response stream 标为 committed,之后才调
|
||||
// remove_..._finalization_recovery_sidecars 清理 sidecar,两步之间有真实时间窗。
|
||||
// 上面等 committed 的循环一旦命中前半步就会退出,因此这里必须同样轮询,否则在
|
||||
// CI 负载下会偶发读到尚未清理的残留。journal 是该清理链最后删除的一项,等它消失
|
||||
// 即可覆盖后面几条 handoff 残留断言。
|
||||
let mut finalization_residue = read_game_creator_agent_runtime_finalization_journal(
|
||||
&root,
|
||||
GAME_CREATOR_PROJECT_SUPERVISOR_AGENT_ID,
|
||||
RUN_ID,
|
||||
)
|
||||
.expect("read finalization residue")
|
||||
.is_none());
|
||||
.expect("read finalization residue");
|
||||
for _ in 0..250 {
|
||||
if finalization_residue.is_none() {
|
||||
break;
|
||||
}
|
||||
std::thread::sleep(Duration::from_millis(20));
|
||||
finalization_residue = read_game_creator_agent_runtime_finalization_journal(
|
||||
&root,
|
||||
GAME_CREATOR_PROJECT_SUPERVISOR_AGENT_ID,
|
||||
RUN_ID,
|
||||
)
|
||||
.expect("poll finalization residue");
|
||||
}
|
||||
assert!(finalization_residue.is_none());
|
||||
assert!(provider_retry::read_for_run_at(
|
||||
&root,
|
||||
GAME_CREATOR_PROJECT_SUPERVISOR_AGENT_ID,
|
||||
|
||||
Reference in New Issue
Block a user