Skip to content

CI: Test Core stalls mid-suite with frozen log output — three occurrences in one day, each costing a manual diagnosis + rerun #4250

Description

@os-zhuang

现象

Test Core 进入一种输出冻结但 job 不结束的状态:日志停在某个测试文件,之后既没有新行、也没有失败,job 一直挂在 in_progress,直到有人取消或 timeout 兜底。

一天之内命中三次,分属不同 PR、不同停摆位置:

时间 Run / Job 最后一条输出所在文件 处置
~11:34Z run 30539038818 / job 90859196790 metadata-validation-sweep.test.ts 人工取消 + rerun
(同日早些) metadata-validation-sweep.test.ts 附近 人工取消 + rerun
16:34Z run 30562022449 / job 90937246030 src/protocol-unknown-query-param.test.ts 人工取消 + rerun

第三次的取证比较硬:两次相隔 9 分钟的 get_job_logs 返回逐字节相同的内容 —— 同一 flush 时间戳 16:42:31.7491868Z、同一末行、original_length 同为 19071。累计静默 22 分钟、总运行 30 分钟。取消后 rerun 的 attempt 2 用 11 分 41 秒正常通过,同一 commit、同一套件、零改动。

为什么值得单独立项

  1. 它不是慢,是停。 正常 11-12 分钟,停摆时静默 20+ 分钟且日志长度不再增长 —— 两者可以用「flush 时间戳 + original_length 是否推进」机械区分,不需要猜。
  2. chore(ci): nightly rerun-safety gate, job timeouts, compiled-tests-in-dist guard #4156 的 job timeout 只兜底,不止损。 有 timeout 意味着不会挂 6 小时,但每次仍然是:等到超时(或人工发现)→ 判断是不是自己 diff 的锅 → 取消 → rerun → 再等一轮。三次事故 = 三次人工诊断。
  3. 它把「CI 红」的信噪比压低了。 停摆表现为「一直没结论」,与「测试真的很慢」在 UI 上无法区分,所以默认反应是继续等 —— 这正是最贵的反应。

值得查的方向(未验证,仅按现象排序)

  • 两个停摆点(metadata-validation-sweepprotocol-unknown-query-param)都是起真实 ObjectQL engine / 大量 registry 注册的用例,日志里最后可见的都是引擎初始化序列(ObjectQL Engine Instance CreatedDriver connectedinitialization complete 反复多次)。怀疑与每用例新建引擎实例后未释放的句柄(driver 连接 / 定时器)有关 —— 句柄不释放会让 vitest 的进程池在收尾时等待而非退出。
  • 若确实是句柄泄漏,--reporter=verbose 配合 detectOpenHandles 一类的排查,或给 suite 级别加 teardown 断言,比继续加 timeout 更能根治。
  • 另一个可能是 CI runner 侧的 I/O 卡顿,但同一 commit rerun 就好、且三次分属不同 runner,指向套件的可能性更大。

建议的最小动作

不要求立刻根治。最低成本的改进是让停摆自己说话:给 Test Core 一个显著短于当前兜底值的 timeout(比如正常时长的 2-3 倍),这样它会以「超时失败」而不是「一直在跑」的形式呈现 —— 把一次需要人工判读日志时间戳的诊断,变成一条明确的红。

相关

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions