Skip to content

loadMetaFromDb 的返回值无法表达「没读到存储」—— restoreMetadataFromDb 把 outage 记成 debug 级 "No persisted metadata found",boot 照常报告健康(ADR-0110 D3 的 boot 侧) #5897

Description

@baozhoutao

来自 #5841 的事实 2(该单按范围裁定只交付事实 1,事实 2 测量后立单)。测量证据与修向分析见 PR #5889 报告,此处摘录并附 PM 裁决。未指派;标签交分诊。

事实(#5841 的 dev 实测,origin/main)

loadMetaFromDb 的返回值 { loaded, errors, invalid } 没有任何字段能表达「这次水合根本没读到存储」。其返回值的唯一生产消费方是 packages/objectql/src/plugin.ts:1140restoreMetadataFromDb,且没有任何调用方对 loaded: 0 做分支处置 —— 唯一分支是选哪条日志:读不到存储的 boot 在 kernel 日志里被写成 debug 级的 "No persisted metadata found in database"。

下游后果(plugin.ts Phase 2 自己的注释已写明):registry.getObject 返回空 → unknown-$select guard / hooks / relationships silently degrade;没读到的 overlay 对象既不建表也不桥接,kernel 照常 ready。自托管运维在 boot 期只有日志一个信号,而这个信号是 debug 级的「库是空的」。

修向(dev 的四案分析,原文见 #5841 报告)

PM 裁决(第三档:带前提,否决窗口开放)

裁 A,前提两条(实施 dev 开工先核,任一不成立即报 fork、⛔ 不许静默改道):

  1. loadMetaFromDb 返回值的消费方仍然只有 restoreMetadataFromDb 一个(loadMetaFromDb 用 /no such table/i 正则判「良性首启」,其余 sys_metadata 读失败吞成 console.warn + loaded:0 —— isMissingTableError 的手抄第二份 #5841 测量时如此);
  2. ProtocolWithDbRestore 是 objectql 内部接口声明,不在 packages/spec 公开契约面上(若实测它已进 spec,转 domain:spec 座位)。

依据:ADR-0110 D3(outage ≠ miss)已是本仓在 DatabaseLoader(#5108)、listForIndex(#5089)、协议 overlay 读(#5532/#5705/#5843)的既定方向,A 是同一条规矩的 boot 侧落地 —— 属 restore-invariant,不占维护者决策位;B 过重(boot 应 degrade loudly 而非 die),C 属 workaround(两个相反事实一个名字),D 违背 D3。

协调

Refs #5841 / PR #5889#5840、ADR-0110 D3、#5108#5089#5532

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions