fix(P0): 生产矩阵审计暴露 2 个崩溃恢复丢数据 bug — ① FileManager 页面 id 崩溃回退(allocatePageIds 后 saveMeta 前中断 → nextPageId 回退 → 恢复期页面复用被 compaction 误删,kv 2万行+加密崩溃丢75%):init 以现存最大页面 id+1 为准;② LSM.flush 剩余数据与 compaction 并发写 meta(产物 saveMeta 被覆盖成孤儿 → 优雅关闭重开丢75%):剩余落盘挂链串行。新增 13 组合矩阵审计(后端×特性×功能全量验收)
This commit is contained in:
@@ -11,6 +11,19 @@ All notable changes to MetonaSqlark will be documented in this file.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **页面 id 崩溃回退导致静默丢数据(P0)** — FileManager `allocatePageIds` 在分配页面后、
|
||||
`saveMeta` 持久化 nextPageId 前崩溃 → `__aria_meta` 停留在旧水位 → 恢复时页面 id 复用
|
||||
(覆盖崩溃前旧页面)→ 恢复期 compaction 按 meta.pageIds 删除"旧"SSTable 时误删被复用的
|
||||
新数据页面 → 崩溃恢复后静默丢 75%(kv 后端 2 万行 + 加密 + 双索引场景复现 5228/20000)。
|
||||
修复:`init` 以"现存最大页面 id + 1"为准(单调不回退,绝不复用已存在页面)
|
||||
- **LSM.flush 剩余数据与 compaction 并发写 meta(P0)** — `flush()` 对 immutable/memtable
|
||||
的剩余落盘直接 await(不在链上),与链上 compaction 并发写 SSTable meta:compaction 产物
|
||||
`saveMeta` 后,memtable flush 的 `saveMeta` 读到中间态列表(含 compaction 产物)→ 覆盖产物
|
||||
引用 → compaction 产物变孤儿 → 主表/索引数据静默丢失(kv 后端优雅关闭后重开丢 75%)。
|
||||
修复:剩余落盘挂链串行(memtable flush 在 compaction 之后),meta 无竞态
|
||||
- **生产矩阵审计**(13 个组合全量验收):后端(opfs/kv/memory)× 特性(页面化/加密/压缩/
|
||||
WAL 开关/同步模式)× 功能(CRUD/双索引/事务/主键变更/级联删除/崩溃恢复)——
|
||||
新增 `tests/engine/aria-matrix-audit.test.ts`,暴露并修复上述 2 个 P0
|
||||
- **二级索引范围扫描漏读尾部数据(P0)** — SSTable 索引块记录的是"块内最后一个 key"
|
||||
(builder 约定),读端 `locateBlockLE` 却按块首 key 语义二分:范围查询 endKey 落在
|
||||
某块尾部时,下一块(尾 key 越界但首 key 仍在范围内)被排除 → 二级索引条件查询
|
||||
|
||||
Reference in New Issue
Block a user