Skip to content

datasource-autoconnect 的联邦查询测试在本地必现失败:ext_note 读到 6~12 行而非 2 行(CI 绿,需第二台机器复核) #4083

Description

@os-zhuang

按 Prime Directive #10 记录。在 #4062 / #4082 两次任务里都撞到,与那两条改动无关,故单独开。

现象

pnpm --filter @objectstack/runtime exec vitest run src/datasource-autoconnect.test.ts
FAIL  src/datasource-autoconnect.test.ts > ADR-0062 declared-datasource auto-connect
      > makes the federated object queryable through the engine with zero app code

AssertionError: expected [ 'first', 'first', 'first', …(3) ] to deeply equal [ 'first', 'second' ]

测试(packages/runtime/src/datasource-autoconnect.test.ts:118)往外部数据源驱动里 bulkCreate 2 行,然后 engine.find('ext_note')

  • 单独跑整个文件:读到 6 行 —— 同样的 2 行各出现 3 次;
  • -t "makes the federated object queryable" 只跑这一条(其余 skip):读到 12 行。

行数随运行方式变化,但从来不是 2。

已排除

复现于 b3a23185dc4d02c53aa53 三个 main 快照(容器:Linux 6.18.5,Node 见 CI 同版本)。

但 CI 是绿的

Test Core 在 main 和 PR 上都通过,而且跑整包 pnpm --filter @objectstack/runtime test 时这条偶尔能过(观察到 1 次通过 / 3 次失败)。所以它要么对执行环境敏感,要么是概率性的 —— 单独跑必现只是把概率拉满。

值得看的方向

行数是 2 的整数倍(6 = 3×2,12 = 6×2),像是同一份数据被多个 driver 实例/多次连接重复读出,而不是数据被写了多次。测试里一次 boot 会建 3 个 memory driver(默认 driver + autoconn_ext + decorative),三者都是 driver: 'memory';如果联邦读把绑到 autoconn_ext 的对象在多个实例上各查了一遍、或者多次 connectDeclared 复用了同一个 store,就正好是这个形状。InMemoryDriver 本身没有模块级共享 store(都是实例字段),所以更可能在 DatasourceConnectionService.connectDeclared / 引擎的联邦读那一侧。

需要的动作:找一台非本容器的机器跑一次上面的命令。如果也复现,那 CI 绿只是运气,这条测试保护的 ADR-0062 D1 验收其实没在保护;如果不复现,则值得查清楚是什么环境差异让它必现 —— 那个差异本身可能就是 bug 的触发条件。

关联:#4062#4082、ADR-0062 D1/D5。

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