发现于合并队列构建 31016396703(Test Core 3/3)对 PR #5508 的整批判红。该 PR 零包源码改动,失败与其无关 —— 这是队列级 flaky,按 pm-dispatch 队列健康职责立单。查重:mongodb-memory-server / mongodb-binaries rename 两轮检索无既有单。
签名(日志原文)
stdout | src/mongodb-driver.test.ts
Downloading MongoDB "8.2.6": 100% (122.6mb / 122.6mb)
stdout | src/mongodb-filter-boolean-identity.test.ts
Downloading MongoDB "8.2.6": 100% (122.6mb / 122.6mb)
⎯⎯ Unhandled Rejection ⎯⎯
Error: ENOENT: no such file or directory, rename
'/home/runner/.cache/mongodb-binaries/mongodb-linux-x86_64-ubuntu2404-8.2.6.tgz.downloading'
-> '/home/runner/.cache/mongodb-binaries/mongodb-linux-x86_64-ubuntu2404-8.2.6.tgz'
❯ MongoBinaryDownload.js:413 (mongodb-memory-server-core@11.2.0)
Test Files 14 passed (14)
Tests 319 passed | 8 skipped (327)
Errors 1 error
ELIFECYCLE Test failed.
机制
src/mongodb-driver.test.ts 与 src/mongodb-filter-boolean-identity.test.ts 各自触发 mongodb-memory-server 的二进制下载,vitest 并行 worker 下两个下载同时写同一个缓存路径:都下到 100% 后,赢家先 rename 掉 .tgz.downloading,输家的 rename 报 ENOENT → unhandled rejection → 全部测试绿仍 exit 1。
两个叠加缺陷:
- 下载无单飞(single-flight):两个套件各自
MongoMemoryServer.create(),包级没有 globalSetup 预下载或跨 worker 锁;缓存命中时无事,冷缓存(队列 runner 常态)必然竞态。
- boolean-identity 套件的优雅降级只接了一半:它捕获了「起不来就跳过」(日志里
Skipping boolean identity suite — timed out after 120s 的兜底是工作的,8 条跳过),但没有接住下载 promise 的 rejection —— 跳过路径生效的同时,悬空的下载错误仍以 unhandled rejection 炸掉整个 run。修复至少要把这半边接住:降级即降级,不能一边跳过一边 exit 1。
修复方向(实施者定,列作参考)
- vitest
globalSetup 单次预下载二进制(或 MONGOMS_DOWNLOAD_DIR 按 worker 隔离 / runner 层缓存预热),消除并发下载;
- boolean-identity 套件的 skip 兜底同时
catch 下载 promise;
- 上游
mongodb-memory-server-core@11.2.0 的已知形态,若有 upstream fix 可评估升级。
影响
- 队列过去 24h 有 10 次失败构建(triage bot 统计),本签名至少贡献本次;冷缓存 runner 上可复现概率高。
- 对各车道 PM:凡队列红中出现本签名(
ENOENT ... mongodb-binaries ... rename + 全测试绿),按 notes 2 原样重投,不要改 PR;本单修复合入后同签名再现才需重新诊断。
现场:PR #5508(受害者,已重投)。
发现于合并队列构建 31016396703(Test Core 3/3)对 PR #5508 的整批判红。该 PR 零包源码改动,失败与其无关 —— 这是队列级 flaky,按 pm-dispatch 队列健康职责立单。查重:
mongodb-memory-server/mongodb-binaries rename两轮检索无既有单。签名(日志原文)
机制
src/mongodb-driver.test.ts与src/mongodb-filter-boolean-identity.test.ts各自触发mongodb-memory-server的二进制下载,vitest 并行 worker 下两个下载同时写同一个缓存路径:都下到 100% 后,赢家先 rename 掉.tgz.downloading,输家的 rename 报 ENOENT → unhandled rejection → 全部测试绿仍 exit 1。两个叠加缺陷:
MongoMemoryServer.create(),包级没有 globalSetup 预下载或跨 worker 锁;缓存命中时无事,冷缓存(队列 runner 常态)必然竞态。Skipping boolean identity suite — timed out after 120s的兜底是工作的,8 条跳过),但没有接住下载 promise 的 rejection —— 跳过路径生效的同时,悬空的下载错误仍以 unhandled rejection 炸掉整个 run。修复至少要把这半边接住:降级即降级,不能一边跳过一边 exit 1。修复方向(实施者定,列作参考)
globalSetup单次预下载二进制(或MONGOMS_DOWNLOAD_DIR按 worker 隔离 / runner 层缓存预热),消除并发下载;catch下载 promise;mongodb-memory-server-core@11.2.0的已知形态,若有 upstream fix 可评估升级。影响
ENOENT ... mongodb-binaries ... rename+ 全测试绿),按 notes 2 原样重投,不要改 PR;本单修复合入后同签名再现才需重新诊断。现场:PR #5508(受害者,已重投)。