fix(P0): SSTable rangeScan 尾块漏读 — 索引块记录块尾 key 但二分按块首语义定位,endKey 落在块尾时下一块被排除导致二级索引查询丢数据(5万行丢106~771条);endBlockIdx 多扫一块 + 4 个 sstable 边界回归 + 重建二级索引大数据量回归(含崩溃恢复)。附带:checkpoint 同步 flush 二级索引 LSM(P1)、kv 后端页面化 + SharedMemoryBackend chunk 化、生产负载验证测试
This commit is contained in:
@@ -11,6 +11,19 @@ All notable changes to MetonaSqlark will be documented in this file.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **二级索引范围扫描漏读尾部数据(P0)** — SSTable 索引块记录的是"块内最后一个 key"
|
||||
(builder 约定),读端 `locateBlockLE` 却按块首 key 语义二分:范围查询 endKey 落在
|
||||
某块尾部时,下一块(尾 key 越界但首 key 仍在范围内)被排除 → 二级索引条件查询
|
||||
静默丢数据(5 万行写入查 `tag='t5'` 丢 106~771 条,主表全扫描完整)。
|
||||
修复:rangeScan 的 endBlockIdx 多扫一个块(条目级过滤兜底,不丢不错);
|
||||
新增 4 个 SSTable 边界回归(跨前缀尾部/精确块尾/超出全量/多前缀一致性)
|
||||
+ 重建 3 个二级索引大数据量回归(5 万行/高频小批量/多索引列,含崩溃恢复)
|
||||
- **checkpoint 未落盘二级索引(P1)** — checkpoint 只 flush 主 LSM,截断 WAL 后崩溃时
|
||||
索引 memtable 未落盘、WAL 为空跳过重建 → 二级索引静默丢失最后一批条目。
|
||||
checkpoint 的 flushAll 同步 flush 全部二级索引 LSM
|
||||
- **kv 后端页面化缺失** — `pageStorage` 默认只对 opfs 生效;kv 后端整 value SSTable
|
||||
(4MB)超过 1MB 页面缓存时每次读取全量重载。kv 后端同样启用页面化,
|
||||
读放大消除;SharedMemoryBackend 改为 chunk 列表(append O(1))+ 惰性拼接缓存
|
||||
- **MemoryEngine 级联环无限递归(P0)** — A→B→A 循环引用 + CASCADE 删除导致栈溢出
|
||||
(RangeError: Maximum call stack size exceeded)—— MemoryEngine.cascadeDelete 无环路保护,
|
||||
AriaEngine 已有 visited 保护(v0.4.1),Memory 侧缺失。新增 visited 集合(表:主键),
|
||||
|
||||
Reference in New Issue
Block a user