thzxx
68e4731788
fix(B-6 ③ + 测试介质): 陈旧实例拒绝提交覆盖 + SharedMemoryBackend 跨实例可见性
③ 陈旧实例的 checkpoint 会静默抹掉新实例的写入(P0)
修复前多个 KVStore 实例同时打开同一库时,snapshot/meta 是全库共享的,而每个
实例各有内存索引与 seq —— 落后实例的一次 checkpoint 会用它的旧索引覆盖介质:
A.open → A.put(x) ; B.open(读到 x) → B.put(y) → B.close()
→ A.checkpoint() // A 的索引里没有 y
→ 重开:x 在、**y 消失**,且 A.checkpoint() **没有报任何错**
修法:meta 增加 `owner`(实例 id),open() 时领取所有权;checkpoint 前比对
owner —— 不是自己即判为过期,抛 `STALE_INSTANCE` 并拒绝提交(而不是覆盖);
此后该实例的写入也显式失败(否则只会写进永远无法提交的 WAL)。
重新 open 即可恢复(陈旧状态不是永久的)。
**测试介质本身的缺陷(同源发现,影响此前的所有多实例验证)**
`SharedMemoryBackend` 每个实例各有一份私有拼接缓存,且只在**自己的**
write/append 时失效 → 实例 A 读过的键永远命中 A 的缓存,**看不到** B 之后的
写入。介质行为退化为"每个实例各有一份快照",于是所有"两实例共享介质"的
崩溃/多标签页用例都跑在错误的介质上(这正是上面那条 bug 起初查不出来的原因:
守卫读 owner 时拿到的是自己的旧值)。
修法:拼接缓存按库名**共享**(挂在注册表条目上),任何实例的 write/append/
delete 都清掉该库的共享缓存;删除用 `null` 哨兵,杜绝"删了还能读到旧值"。
同时保持既有 close 契约(close 后读返回 null、写删清空不抛错且不持久化,
跨实例持久化语义不变)—— `clearRegistry()` 换代,避免跨用例数据泄漏。
验证:tests/v080-kvstore-commit-point.test.ts 扩到 19 项(含 4 项陈旧实例 +
4 项介质可见性);全量 87 套件 / 1686 测试通过(含 Aria 10 万行生产负载);
typecheck(src+tests) 与 lint 零错误。
2026-09-15 00:34:45 +08:00
..
2026-09-14 21:03:06 +08:00
2026-09-15 00:00:08 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:43:21 +08:00
2026-08-14 22:53:46 +08:00
2026-07-26 15:00:01 +08:00
2026-09-15 00:15:41 +08:00
2026-09-14 23:22:26 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 15:00:01 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 16:40:11 +08:00
2026-09-14 22:29:51 +08:00
2026-08-10 13:56:04 +08:00
2026-09-15 00:15:41 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 15:00:01 +08:00
2026-09-14 21:03:06 +08:00
2026-08-14 22:53:46 +08:00
2026-08-13 15:31:16 +08:00
2026-08-10 13:56:04 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 22:29:51 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 16:40:11 +08:00
2026-08-10 14:11:44 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:08:20 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 22:03:56 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 23:22:26 +08:00
2026-08-13 10:30:39 +08:00
2026-08-13 10:57:26 +08:00
2026-08-13 11:14:42 +08:00
2026-08-13 15:31:16 +08:00
2026-09-14 23:38:58 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 22:02:30 +08:00
2026-09-14 22:29:51 +08:00
2026-09-15 00:34:45 +08:00
2026-09-15 00:00:08 +08:00
2026-09-14 21:53:46 +08:00
2026-09-15 00:15:41 +08:00
2026-09-14 23:22:26 +08:00
2026-09-14 22:29:51 +08:00
2026-09-15 00:00:08 +08:00
2026-09-14 21:03:06 +08:00