Skip to content

fix(knowledgeBase): resolve coordinator AB-BA deadlock, implement progress heartbeat and dynamic DB proxy - #489

Merged
lioensky merged 2 commits into
lioensky:mainfrom
infinite-vector:fix/kb-coordinator-deadlock-and-db-proxy
Oct 7, 2026
Merged

lioensky merged 2 commits into
lioensky:mainfrom
infinite-vector:fix/kb-coordinator-deadlock-and-db-proxy

Conversation

@infinite-vector

@infinite-vector infinite-vector commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

一、动机与背景 (Motivation)

在高并发读写与知识库摄取场景下,原架构存在两处隐患:

  1. AB-BA 循环等待死锁:后台执行 _flushBatch 摄取时持有 isProcessing=true,随后调用 applyChunkDelta 申请索引发布;而 applyChunkDelta 内部无脑调用 getOrLoad 被挂在 recoveryTail 队尾,队首的懒加载读请求正在等待 isProcessing 释放,导致读写互相阻塞自旋,直至 1800000ms(30分钟)硬超时假死;
  2. 数据库连接句柄悬空:DreamWaveEngine 等模块在构造期静态缓存 this.db = kb.db。当 SqliteHealthManager 执行连接重绑定并关闭旧连接后,外围组件调用抛出 The database connection is not open。

二、架构重构与关键方案 (Key Architecture Changes)

  1. 内存差分直通发布快道(Surgical In-Memory Bypass):在 indexRepository.js 中,已驻留内存的索引差分更新直接调用 Rust 原生 RwLock 写锁发布(2ms 内原子完成),绕过协调器与恢复队列排队;同时将 _executeLoadIndex 正式抽离为类成员方法,清晰解耦调度与数据加载;
  2. 进展心跳导数自适应熔断(Progress Liveliness Tracking):在 KnowledgeBaseManager.js 与 ingestionPipeline.js 引入 touchActivity() 心跳机制;databaseCoordinator.js 在保留 30 分钟最终防线的同时,仅在连续 120 秒无实质进展时精准熔断,且放宽测试注入粒度;
  3. 全域动态数据库代理访问(Dynamic DB Proxying):将 DreamWaveEngine.js 重构为 get db() { return this.kb?.db || null; } 动态代理属性,天然免疫连接重连与句柄失效;
  4. Postel 宽进严出防御契约:applyChunkDelta 增加对无操作(noop)与空日记名的幂等安全放行。

三、测试与验证 (Verification)

• 破坏性与混沌压测:通过 30 题红队破坏测试、50 题全景已有功能测试与 100 题大考(涵盖死锁交叉风暴、时钟跳变、TOCTOU 竞态、单点恢复崩溃自愈等Nova单测),经过对应的调整与补丁,实现 100% 全量绿灯通关;

• 零回归验证:已有 diaryIndexAtomicDelta、tagConsistencyIncrementalIndex、tagIndexGenerationalBaseline 与 associativeDiscoveryRiverMemo 全量通过,node --check 静态 AST 编译零报错。


这样改应该没啥问题,我重启后跑了一小会儿没发现问题。希望不会给一些浪潮数据库底层设计意图给改掉了。

二编:跑了一会儿,发现了个计时器逻辑小问题。已修复。

@lioensky
lioensky merged commit 9541bed into lioensky:main Oct 7, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants