Skip to content

[metadata-protocol] seed-loader:无 pass-2 时「引用解析不了 ⇒ 整条记录丢弃」计为 error 却一行日志都不打(#4729 判据的更深一格) #4997

Description

@xuyushun441-sys

发现于 #4729(把 seed-loader 里「计数为错、日志为 warn」的行对齐到 error)的同文件盘点。本条不在 #4729 的判据内(它盘的是 this.logger.warn 调用),所以只记录、不在那个 PR 里改。

现象

packages/metadata-protocol/src/seed-loader.ts,pass-1 引用解析、multiPass 关闭的分支:

} else {
  // Cannot resolve and no pass 2 will run — skip the whole record
  // (LOUD: counted + reported). Writing it anyway would either
  // carry the raw natural-key string into the FK column or, on
  // update, corrupt the existing row.
  pushError(
    `Cannot resolve reference: ${objectName}.${ref.field} = '${String(unresolvedItem)}' → ` +
      `${ref.targetObject}.${ref.targetField} not found`,
    unresolvedItem,
  );
  unresolvedRefError = true;
}

pushError 把错误推进 errors / allErrors(⇒ success: false),随后 unresolvedRefErrorerrored++continue —— 整条记录被丢弃,一行都没有种下去。但这里没有任何 logger 调用:注释写的 "LOUD" 只兑现了「计入结果对象」,控制台上一个字都没有。

为什么值得单开

#4729 的论点是「计数与日志级别应当一致」:结果对象里数得到、日志却停在没人读的 warn。这一处是同一条链的更深一格 —— 计数有、日志级别是「无」。对只看 boot 日志的运维/agent 来说,一次丢了 N 条记录的 seed 与一次干净的 seed 在控制台上完全一样(区别只在调用方是否检查了 result.success,而 packages/runtime 的若干 seed 调用点只是 await 之后继续)。

check:durability-log-level 把这种形态叫 silent-swallow,但那个门禁只扫 try/catch,而这里不是 catch,所以扫不到。

期望(待维护者确认)

未认领。

Metadata

Metadata

Assignees

No one assigned

    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