Repository navigation
test(#3269): e2e-native-opencode 断言改为等待 shutdown flush 落盘,消除固定睡眠竞态 - #3271
Conversation
📦 Built Package ArtifactBranch: Option A — Install this exact build (recommended)npm install -g billion-context@0.0.3771-pr.3271.d05fc12This exact version is immutable and reproducible. The rolling Option B — Download artifact
tar xzf billion-context-pr3271.tgz
npm install -g packageInstall instructions are refreshed on each push. |
(ai: vllm/qwen3.8-27b) 查重: 不重复。 按失败签名( 审核已开始,先报进展:
|
(ai: vllm/qwen3.8-27b) Review 结论(结构化八问)
机制核实(对照 master 源码逐条验证过,PR 描述全部属实)
CI 状态与那条红灯head 验证证据
一个可选观察(非阻塞,不建议本 PR 做)超时分支可以更快:若所有记录的 proxy pid 已死且仍无非空 blocks,可立即失败而非等满 20s——因为每条优雅路径都 flush 先于 exit,「进程全死 + 无块」意味着永远不会再有块出现。属锦上添花,留给后续小 PR 或忽略。 判定:可合。 建议对主 CI 分片 rerun-failed-jobs(其红与本 diff 无关,#3274 跟踪根因);rerun 转绿后合并即可。 |
|
ci失败 |
(ai: vllm/qwen3.8-27b) 这条红不是本 PR 的问题,已经定位清楚:
我刚触发了 rerun-failed-jobs(attempt 2 已排队),只重跑那一条失败分片。转绿后即可合并——本 PR 本身审核结论是可合。 |
📦 Merged Build PublishedThis merge to master was published as npm install -g billion-context@0.0.458-master.30741ab # this exact build
npm install -g billion-context@master # always the newest merged build
|
Closes #3269
是什么问题
e2e-native-opencode车道测试 3(compress 折叠)在同提交上偶发红→绿:rerun-failed-jobs 后整条车道转绿——同一代码红→绿,非确定性失败。
什么原因导致的
断言在 proxy 优雅关闭的 flush 完成之前读了盘。因果链:
persist.debounceMs/BILI_PERSIST_DEBOUNCE_MS,kernelStateStore.scheduleSave用 unref 定时器)。opencode 客户端在 fold run 最后一次状态变更后 <500ms 就退出,所以 fold 产生的块几乎总是靠优雅关闭时的 flush 才落盘:SIGTERM →server.close等连接排空 →flushAllSessions()→process.exit(0)(src/server.ts:1269-1290,flush 先于 exit)。stopProxiesGracefully发完 SIGTERM 只固定睡 500ms 就读盘。优雅关闭路径耗时无上界(负载下:信号投递、事件循环饥饿、连接排空、fsync、WAL checkpoint),一旦 >500ms 就读到折前旧文件 → "got 1 sessions"(文件在、blocks 空)。已排除:fake upstream 脚本竞态(红跑中 compress 工具结果已重放进历史 + bili.log 有执行日志,说明内存态折叠成功);persona fork(permitlist 只含 dsh);stale writer 覆盖(#405/#2401 单调计数守卫挡回写)。
怎么修复的
把固定 500ms 睡眠换成有界轮询:新增
waitForPersistedBlocks(ctx, timeoutMs),每 100ms 检查一次直到「至少一个会话文件带非空 blocks」或 20s 期限。关键设计:proxy 进程死亡本身不算成功——crash 的 proxy 未 flush 而死必须响亮失败;超时报错附带诊断(存活 proxy pid、各会话文件内容摘要、bili.log 尾部),让下次真出问题能直接定位而不是裸断言。产品侧无需改动:行为符合设计(文档化的丢失窗口只有 SIGKILL/断电时 ≤1 个去抖窗口)。
验证
ACP_TEST_E2E_OC_NATIVE=1 node --import tsx --test tests/e2e/e2e-native-opencode.test.ts(opencode 1.14.46 / v1 lane)→ 4/4 pass。npm run typecheck干净。行为变更披露
仅测试基础设施改动,无运行时行为变化。唯一语义变化:该断言从「SIGTERM 后固定 500ms 快照」变为「最多等 20s 直到落盘后置条件成立」——这是把对关闭耗时的错误假设换成正确等待,不是放宽断言强度(成功判据仍是「有非空 blocks」,且更严格地要求它真正落盘而非进程已死)。
配置面
不涉及(无新 env/config/CLI flag)。