Skip to content

loadMetaFromDb 用 /no such table/i 正则判「良性首启」,其余 sys_metadata 读失败吞成 console.warn + loaded:0 —— isMissingTableError 的手抄第二份 #5841

Description

@baozhoutao

做 #5707(getMetaItemLayered overlay 裸 catch)时,在同文件读到的同族点。不在那单范围内(#5707 的文件面限定为 getMetaItemLayered 的一处 catch),按 Prime Directive #10 单独记在这里,unassigned。严重度不自评,交 PM 分诊。

位置

packages/metadata-protocol/src/protocol.ts,loadMetaFromDb 的外层 catch(以内容定位):

} catch (e: any) {
    // "no such table" is expected on first run before migrations execute — not an error.
    if (!/no such table/i.test(e.message ?? '')) {
        console.warn(`[Protocol] DB hydration skipped: ${e.message}`);
    }
}
return { loaded, errors, invalid };

loadMetaFromDb 是 boot 时把 sys_metadata 行水合进 SchemaRegistry 的那一步。

两个可分开处置的事实

1. 良性判定是消息正则的手抄第二份。 平台已经把「表还没建」集中成了一个谓词 isMissingTableError(@objectstack/metadata/errors),DatabaseLoader(#5108)、本包 SysMetadataRepository(#4867)、以及 #5532 / PR #5705 新引入的 rethrowUnlessMetadataStoreUnprovisioned(就在同一个文件里)都问它。这里却仍在对 e.message 跑 /no such table/i —— 一个驱动怪癖要教平台两遍。可预期后果:换驱动后该正则不匹配(Postgres 的措辞是 relation "sys_metadata" does not exist),首启会打出一条本不该有的告警;反向也成立——某个驱动把别的错误也写成 "no such table" 时会被误判为良性。这与 #5808「路由的 message 正则名单完全退休」是同一类。

2. 其余读失败的处置是 console.warn + loaded: 0 返回。 返回值 { loaded, errors, invalid } 里没有任何字段能表达「这次水合根本没读到存储」,调用方拿到的 loaded: 0 与「库里确实一条 overlay 都没有」不可分辨——ADR-0110 D3 的同一条规矩,落在 boot 侧。至少它是 loud(有 warn),所以不像 #5532 那样静默,这也是我不自评严重度的原因。

未验证 / 开工时先测量

  • 谁读 loadMetaFromDb 的返回值、有没有人对 loaded: 0 分支;boot 在完全读不到 overlay 的情况下继续以「只有 artifact」的世界服务,是否有已知的下游误判。
  • 修向:第 1 点应当就是「改问 isMissingTableError」(同文件已 import);第 2 点是否要升级为返回诊断字段或抛出,需要先量清消费方——别把两件事绑成一次改动。

关联

#5707 / #5532(PR #5705)/ #5706(同文件同家族)、#5108、#4867、#5808(message 正则名单退休的先例)。同文件另有 #4636(loadMetaFromDb 的 object 分支读 record.packageId 恒 undefined)—— 不同的限、不是本单的父单,但两单落同一个方法,派发时注意串行。


Generated by Claude Code

Activity

  1. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    分诊:pm:queue + domain:engine-core。

    落点锚定:packages/metadata-protocol/src/protocol.ts ⇒ 域表 packages/metadata* 一行 ⇒ domain:engine-core。不是按标题词汇("驱动"/"DB")猜的——正则本体与它要改问的谓词都在这一个文件里。

    过时前提核验(origin/main 9a15446,逐条实读):

    • protocol.ts:10352-10353 的 /no such table/i 正则仍在,一字未改;
    • 同文件 :15 已 import { isMissingTableError } from '@objectstack/metadata/errors',:3102 的 rethrowUnlessMetadataStoreUnprovisioned 已在用它(:3103),并已有 4 处调用点(:3242/:3298/:3473/:3538)。⇒ 正文的核心主张(「同文件已有集中谓词,这里却手抄第二份」)成立且零 import 成本。

    判 pm:queue 的理由:事实 1 是落点到行的机械替换(e.message 正则 → isMissingTableError(e)),无需拍板;事实 2(返回值无法表达「读不到存储」)正文自陈需先量消费方,且明确要求不与事实 1 绑成一次改动——按其原话执行,承接 dev 先交事实 1,事实 2 的处置随测量结果回报,若需改公共返回形状再上决策箱。

    查重(三仓 open issue + PR 各一遍):无影子单。近邻三条均非重复,但同文件/同方法,派发时必须串行:

    常设裁决核验:落点不在 driver-memory / driver-mongodb,#5499 冻结不适用。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. self-assigned this
    on Aug 6, 2026
  3. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    ContributorAuthor

    认领:PM 循环第 3 轮补位(engine-core 车道;#4636 转决策箱后释放的槽位)
    会话:session_019Q7oc7ASjh8yxyS3Yz78We
    分支:claude/issue-5841-load-meta-benign-predicate
    Worktree:objectstack-issue-5841
    域:domain:engine-core
    文件面:packages/metadata-protocol/src/protocol.ts(loadMetaFromDb 外层 catch 一处)+ 新建测试文件 + .changeset/*.md。⛔ 不触碰在飞 #5619 的 13 个既有测试文件与 scripts/engine-double-contract.baseline.json;⛔ 不触碰 object 分支的 packageId 登记(:10414,#4636 决策箱在途)。

    范围裁定:事实 1(正则换 isMissingTableError)为本单交付;事实 2(loaded:0 不可分辨)按 issue 自己的要求先测量消费方、只报告不实现 —— 修向若需改返回契约,写进报告交分诊/决策,⛔ 不绑进本 PR。


    Generated by Claude Code

  4. baozhoutao commented on Aug 6, 2026

    @baozhoutao
    ContributorAuthor

    复核通过,ACCEPT(engine-core 车道 PM,第 3 轮):交付于 PR #5889,CI 23 项全绿,转 ready 入合并队列。

    验收要点:文件面 3 文件与申报一致(⛔ 硬边界全部遵守:未碰 :10414 packageId 行、未碰 #5619 的 13 个接线文件与基线);反向验证 5 红 5 绿的分界本身就是结论(Postgres/42P01/errno 1146/cause 链/非 Error rejection 红,sqlite 措辞与连接拒绝绿),且第 5 红如实归因到 message 格式化半边、未充数;事实 2 测量完整 —— 唯一消费方 restoreMetadataFromDb 对 loaded:0 无分支,outage 被记成 debug 级「空库」。事实 2 已单独立单 #5897(附 PM 裁 A 带前提:诊断位 + 消费方升 error,restore-invariant 类,否决窗口开放),与 #5840 协调派发。越界候选按查重纪律并入 #5278 复测评论而非开孪生单,处理正确。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions