会话搜索写栅栏保留¶
搜索写入器在其整个生命周期内记住了每一个已移除路径。这些计数器 为一次读取设置了栅栏,而该读取的源在首次提交前就已消失:原始数据库游标和已删除数据库游标都不存在,因此仅比较游标无法检测 该移除。对于没有剩余读取的路径,其计数器从未被释放。
修复仅跟踪活动读取。移除操作会将其捕获的生命周期标记为已移除, 并立即从映射中释放该路径。新读取获得一个全新的生命周期; 来自较旧读取的清理无法删除它。最终提交和显式丢弃 会释放所有权,而中间块提交会保留它。消费者错误、 不完整读取、抛出错误的报告器以及存储关闭会释放它们的栅栏。
复现¶
在已安装依赖项且 Node 版本提供
node:sqlite 的仓库根目录中:
ORCA_BACKGROUND_LAUNCH=1 node --max-old-space-size=128 docs/audits/session-search-write-fences/reproduce.mjs
脚本使用生产 SQLite 架构和
适配器,将实际写入器打包两次。基线是已发布提交
243f4431557471daa05636aed1a30be790485eda (#20551),其写入器与修复前
源码一致。修复后版本是工作树。只读取此命名的 Git 对象;
脚本不获取任何内容。结果包括两个源哈希和运行时详细信息。
在 1,000 次完整的索引/退役循环后:
| 来源 | 剩余文件行 | 保留的路径条目 | 接受了从未索引的过期提交 |
|---|---|---|---|
| 之前 | 0 | 1,000 | 否 |
| 之后 | 0 | 0 | 否 |
回归测试套件还会驱动实际的消费者/通道路径,检查 中间刷新所有权、失败/不完整读取、抛出错误的报告器、 新一代保护、幂等丢弃以及关闭:
ORCA_BACKGROUND_LAUNCH=1 node node_modules/vitest/vitest.mjs run --config config/vitest.config.ts src/main/ai-vault-search/session-search-write-lifetime.test.ts src/main/ai-vault-search/session-search-file-write.test.ts src/main/ai-vault-search/session-search-index-writer.test.ts src/main/ai-vault-search/session-search-index-consumer.test.ts
现有重试簿记可以在已移除读取完成时重新创建失败的 files 元数据行。其会话/消息保持缺失,并且它无法恢复
可搜索内容。此补丁保留了该状态策略。
这是扫描器子进程中的当前代码路径元数据。搜索写入器在
v1.4.198 中并不存在;此发现不能解释报告的 #19831/#19768 构建。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca