Skip to content

driver-mongodb 测试:两个套件并发下载 MongoDB 二进制,mongodb-memory-server 的 rename 竞态让全绿测试 exit 1(队列 flaky) #5517

Description

@os-zhuang

发现于合并队列构建 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.tssrc/mongodb-filter-boolean-identity.test.ts 各自触发 mongodb-memory-server 的二进制下载,vitest 并行 worker 下两个下载同时写同一个缓存路径:都下到 100% 后,赢家先 rename 掉 .tgz.downloading,输家的 rename 报 ENOENT → unhandled rejection → 全部测试绿仍 exit 1

两个叠加缺陷:

  1. 下载无单飞(single-flight):两个套件各自 MongoMemoryServer.create(),包级没有 globalSetup 预下载或跨 worker 锁;缓存命中时无事,冷缓存(队列 runner 常态)必然竞态。
  2. 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(受害者,已重投)。

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions