Skip to content

discovery 的 data 槽位仍是硬编 available —— 目前只靠 plugin-dev 的加载顺序约定兜住,不是构造上的保证 #4130

Description

@os-zhuang

按 Prime Directive #10 记录,#4089 / PR #4114 期间核对出的同类残留。当前无害,记下来是因为它靠的是一条约定而非构造保证。

现象

#4114 把两个 discovery builder 的 metadata 槽位改成读实现自己的 __serviceInfo(ADR-0076 D12)。同一个"kernel-provided (always available)"硬编块里还有一条 data,两边都仍是写死的 available

文件 当前写法
packages/runtime/src/http-dispatcher.ts data: svcAvailable(routes.data, 'kernel') —— 不传 svc,等价于无条件 available + handlerReady: true
packages/metadata-protocol/src/protocol.ts data: { enabled: true, status: 'available', route: '/api/v1/data', provider: 'objectql' }

而 plugin-dev 的 data 实现在 DEV_STUB_SELF_INFO 里被分类为最严重的一档(packages/plugins/plugin-dev/src/dev-plugin.ts):

'data': { status: 'stub', message: 'Dev stub — find() always returns [], insert() mints an id and stores nothing. Register ObjectQLPlugin for a real engine.' }

stubhandlerReady 默认 false。如果它进了槽位而 builder 仍报 available + handlerReady: true,那就是 D12 要消灭的那类过度声明 —— 而且发生在整个平台最核心的槽位上。

为什么现在打不中

data 只有一个 producer:ObjectQLPluginpackages/objectql/src/plugin.tsctx.registerService('data', this.ql))。plugin-dev 的 stub 注册循环只在 ctx.getService(svc) 抛错(槽位为空)时才填,而 plugin-dev 总是ObjectQLPlugin 作为子插件加载(dev-plugin.ts:523-525),所以在任何能构建 discovery 的栈里,data 槽位都已被真引擎占住,stub 进不去。

也就是说:这条硬编现在说的是真话,但真话来自 plugin-dev 的加载顺序约定,不是来自 builder 的计算。#4089 的教训正是这个 —— metadata 那两条硬编当年也曾各自"大致成立",直到内核给它注入了 fallback、MetadataPlugin 又给它接了 sys_metadata,两条硬编就同时开始撒谎,且方向相反。

什么时候会被打中

  • 出现第二个 data producer(例如某个自称 degraded 的只读 / 远端引擎实现);
  • 有人单独用 plugin-dev 而不带 ObjectQLPluginextraPlugins / 裁剪过的 dev 配置),槽位就会落到那个 find() => [] 的 stub 上,而 discovery 仍报 available + handlerReady: true

需要的决定

二选一,倾向第 1 条:

  1. data 也走同一条路:dispatcher 侧 resolveService('data') 后交给 svcAvailable(routes.data, 'kernel', dataSvc)(这一支已经会读 __serviceInfo),metadata-protocol 侧同样读 registeredServices.get('data')。改动很小,且把"真话"从约定变成构造保证 —— 与 fix(runtime,metadata-protocol): 两个 discovery builder 计算 metadata 槽位,不再互相矛盾 (#4089) #4114metadata 做的完全一致。需要注意的一点:dispatcher 的 /data domain 实际上是走 protocol / ObjectQL,不是走 data 服务,所以 handlerReady 该不该跟着自述走要单独想清楚(metadata 那边的结论是 不跟 —— 路由由 protocol 提供,槽位里放个 degraded 实现不会把它卸掉)。
  2. 保持硬编,但把这条不变量写成测试:一旦 data 槽位里出现带 __serviceInfo 的实现就失败,让"约定"至少有个守卫。比第 1 条便宜,但仍然是"declared ≠ enforced"的债,只是让它响一声。

关联:#4089#4058#4000#2462、ADR-0076 D12、PR #4114

Metadata

Metadata

Assignees

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