Skip to content

ObjectQLPlugin未在启动时自动从数据库(sys_metadata)恢复对象元数据,导致冷启动后自定义对象丢失 #1072

@hotlong

Description

@hotlong

问题

当前在ObjectStack Cloud与其他基于ObjectQL的环境下,用户通过API/控制台新增自定义对象(object/schema),调用协议层(protocol.saveMetaItem)时,能成功将元数据写入sys_metadata表,但内核冷启动时不会自动从数据库恢复这些对象元数据,导致kernel重启或冷启动后,用户自定义对象消失,仅有默认sample objects。此问题影响所有runtime(单租户/多租户/Microkernel Cloud),属于框架级严重持久化缺陷。

复现步骤

  1. 在控制台或API添加自定义object schema(如leads、invoice等),保存后在UI可见。
  2. 等待kernel冷启动或重新部署(云环境如Vercel休眠/TSX dev热点重启等)。
  3. 再次访问,同租户下自定义对象schema消失,仅有默认sample objects。
  4. 查看数据库数据,sys_metadata表中实际对象元数据仍在,说明协议层保存正常,只是启动未自动加载。

期望行为

  • 内核每次启动时(ObjectQLPlugin.start/Kernel bootstrap),自动从sys_metadata表批量恢复所有type=object/view/app等元数据,注册到SchemaRegistry,实现持久化→内存的完整闭环,无需业务/宿主项目手动干预。
  • 恢复后能自动触发schema sync,确保所有动态注册对象具备表结构。
  • 避免sample objects覆盖租户实际对象。

修改需求清单

  1. ❗在ObjectQLPlugin.start()生命周期中:
    • driver.init()后、syncRegisteredSchemas()前,显式调用protocol.loadMetaFromDb()(已实现于protocol.ts,需通过ctx.getService('protocol')调用)。
    • 成功后根据loaded数量可log统计,并对新注册object自动schema sync(调用现有syncRegisteredSchemas)。
  2. 保持兼容:如无数据库(内存模式)不抛异常,降级为只使用内存样例对象。
  3. 更新CHANGELOG,标记为修复元数据持久化的严重bug。

影响评估

  • 影响所有使用ObjectQL的多租户/云/本地环境。
  • 用户新增object长期丢失,严重影响可信度与低代码使用体验。

相关代码片段与关键调用链

  • protocol.saveMetaItem() → 正确写入sys_metadata
  • protocol.loadMetaFromDb() → 已实现但未自动调用
  • ObjectQLPlugin.start() → 缺失调用

Metadata

Metadata

Labels

bugSomething isn't working

Type

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions