Skip to content

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

Closed

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. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  3. self-assigned this
    on Aug 6, 2026
  4. 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

  5. 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

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions