fix(P2): v0.6.3 原子性/一致性/资源治理 — 8 项修复 + 12 回归
- KVStore 混合写单记录原子:新增 writeBatch(put+delete 同一条日志记录), KVStoreEngine 全部混合写路径统一(兑现真原子宣称,崩溃无新旧行并存) - WAL full 模式写入失败抛错(此前 console.warn 吞错 → 崩溃即丢且无感知) - MemoryEngine SET NULL 级联索引残留:复用 removeIndexEntries(消除虚假 UNIQUE_VIOLATION) - delete 级联两阶段:先全量 RESTRICT 预检(沿 CASCADE 链递归)再执行,无部分级联 (Memory/Aria 对齐) - BufferPool 驱逐同步清理 pages Map(EvictionManager onRemove 回调,内存预算真实生效) - MVCC commit 清理已提交版本(版本链仅作事务内 undo,消除行数据双份常驻) - LSM.flush 重复入链修复(入链即置空 immutable)+ frozenMemtables 可见性时序 - rollbackToSavepoint 重建受影响表二级索引(消除过期索引条目) 测试 1114 → 1126(71 套件);行覆盖率 89.7%;版本 0.6.3
This commit is contained in:
@@ -2,6 +2,49 @@
|
||||
|
||||
All notable changes to MetonaSqlark will be documented in this file.
|
||||
|
||||
## [0.6.3] - 2026-08-13
|
||||
|
||||
### 原子性 / 一致性 / 资源治理
|
||||
|
||||
> 深度审计第二阶段:兑现"单记录真原子"宣称、补齐 WAL 失败可见性、
|
||||
> 修复级联/索引残留/内存泄漏类问题。
|
||||
|
||||
### Fixed
|
||||
|
||||
- **KVStore 混合写非单记录原子(P2,宣称失实)** — delete/update 主键变更等路径
|
||||
putMany 与 deleteMany 分两次调用 = 两条日志记录:崩溃在两条记录之间 → 新旧行并存
|
||||
(主键变更产生重复行 / SET NULL 重写与父行删除不一致)。新增 `KVStore.writeBatch`
|
||||
(put+delete 编码进同一条日志记录,真全有或全无),KVStoreEngine 全部混合写路径
|
||||
(update/delete/dropTable/alterTable/clear/commitTransaction)统一走 writeBatch
|
||||
- **WAL full 模式写入失败吞错(P2)** — append/appendBatch 失败仅 console.warn:
|
||||
内存已提交而 WAL 缺失,崩溃即丢且调用方无感知。现在失败直接抛出(batch 模式
|
||||
flush 早已抛错,行为对齐)
|
||||
- **MemoryEngine SET NULL 级联索引残留(P2)** — 手动 `pks.get(v)?.delete(pk)` 遗留
|
||||
空 Set → checkUniqueness 对旧值永久误报 UNIQUE_VIOLATION(外键列带 unique 约束时)。
|
||||
统一复用 removeIndexEntries(空 Set 正确清理)+ updateIndexes
|
||||
- **delete 级联部分执行(P2)** — 多行删除时第 N 行 RESTRICT 抛错 → 前 N-1 行的级联
|
||||
子行已删除、父行未删(无事务下数据不一致)。改为两阶段:先对全部待删行做 RESTRICT
|
||||
预检(沿 CASCADE 链递归),任何违规则整体拒绝;Memory/Aria 双引擎对齐
|
||||
- **BufferPool 驱逐不清理 pages Map(P2)** — 驱逐仅清 LRU 链表,pages Map 保留全部
|
||||
历史页面 → 内存无限增长(256 页 ≈ 1MB 预算形同虚设)。EvictionManager 增加
|
||||
onRemove 回调,驱逐时同步从 pages Map 移除(容量约束真实生效,重载仍正确)
|
||||
- **MVCC 已提交版本不清理(P2)** — commit 仅标记 committed,versionStore 随写入量
|
||||
无限增长(行数据双份常驻)。快照读取已移除(v0.5.1),版本链仅作事务内 undo:
|
||||
commit 时直接清理本事务版本(rollback/discardVersions 语义不变,gc 保留未提交链裁剪)
|
||||
- **LSM.flush 重复入链(P2)** — freezeMemtable 会把同一张 immutable 再次入链 →
|
||||
重复 SSTable(2 行 flush 出 3 个文件);且 frozenMemtables 在链执行前被清空 →
|
||||
并发读短暂看不到冻结数据。修复:入链后立即置空 immutable(防重复),
|
||||
frozenMemtables 保持到链排空后再清理
|
||||
- **rollbackToSavepoint 不重建二级索引(P2)** — 事务内直写索引 LSM,savepoint 回滚
|
||||
只还原快照 → savepoint 之后的过期索引条目残留。回滚后重建受影响表索引
|
||||
|
||||
### Changed
|
||||
|
||||
- 测试 1114 → **1126**(71 套件,+12 个 v0.6.3 回归);新增 `tests/v063-fixes.test.ts`;
|
||||
MVCC 语义测试同步改写(commit 清理版本、gc 裁剪未提交链)
|
||||
|
||||
---
|
||||
|
||||
## [0.6.2] - 2026-08-13
|
||||
|
||||
### 深度审计修复(数据正确性专项)
|
||||
|
||||
Reference in New Issue
Block a user