Repository navigation
loadMetaFromDb 用 /no such table/i 正则判「良性首启」,其余 sys_metadata 读失败吞成 console.warn + loaded:0 —— isMissingTableError 的手抄第二份 #5841
Description
Activity
分诊:
pm:queue+domain:engine-core。落点锚定:
packages/metadata-protocol/src/protocol.ts⇒ 域表packages/metadata*一行 ⇒domain:engine-core。不是按标题词汇("驱动"/"DB")猜的——正则本体与它要改问的谓词都在这一个文件里。过时前提核验(
origin/main9a15446,逐条实读):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 各一遍):无影子单。近邻三条均非重复,但同文件/同方法,派发时必须串行:
- getMetaItemLayered 的 overlay 读用裸 catch:sys_metadata 读失败时三层视图把「读不到」画成「没有 overlay」 #5707(
domain:engine-core,已pm:dispatched)—— 同文件另一处 catch,正文已声明本单不在其范围; - loadMetaFromDb object branch reads
record.packageIdfrom a snake_case row — always undefined, every object overlay registers under the 'sys_metadata' sentinel at boot #4636(pm:queue+domain:engine-core)—— 同一个loadMetaFromDb方法的record.packageId分支,不同的限; - getEffectiveLock 的 overlay 读用裸 catch,sys_metadata 读失败时保护闸门 fail-open(_lock 落成 'none',写/删被放行) #5706 / getMetaItem 的 overlay 读用裸 catch 把「sys_metadata 不可达」吞成「该项不存在」—— GET /meta/:type/:name 在存储故障时回一个无 code 的 400「not found」 #5532(PR fix(metadata-protocol): 元数据存储读不到不再被讲成「这一项不存在」 (#5532) #5705)/
DatabaseLoader把存储读故障吞成空结果 —— ADR-0110 D3 的 miss/outage 之分在复数读路径上不成立 #5108 / [metadata-protocol] SysMetadataRepository 的 nextEventSeq()/nextItemVersion() 同样把读失败当「表还没建」,静默从 1 重新发号 —— #4825 在 canonical 路径上的同形缺陷 #4867 / fix(analytics,rest)!: read-scope 拒收改判 READ_SCOPE_COMPILE_FAILED/500,路由的 message 正则名单完全退休 #5808 —— 同族先例,非重复。
常设裁决核验:落点不在
driver-memory/driver-mongodb,#5499 冻结不适用。本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
认领: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
复核通过,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
做 #5707(
getMetaItemLayeredoverlay 裸 catch)时,在同文件读到的同族点。不在那单范围内(#5707 的文件面限定为getMetaItemLayered的一处 catch),按 Prime Directive #10 单独记在这里,unassigned。严重度不自评,交 PM 分诊。位置
packages/metadata-protocol/src/protocol.ts,loadMetaFromDb的外层 catch(以内容定位):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」的世界服务,是否有已知的下游误判。isMissingTableError」(同文件已 import);第 2 点是否要升级为返回诊断字段或抛出,需要先量清消费方——别把两件事绑成一次改动。关联
#5707 / #5532(PR #5705)/ #5706(同文件同家族)、#5108、#4867、#5808(message 正则名单退休的先例)。同文件另有 #4636(
loadMetaFromDb的 object 分支读record.packageId恒 undefined)—— 不同的限、不是本单的父单,但两单落同一个方法,派发时注意串行。Generated by Claude Code