docs(B-6): 附录 H(B-6 完整实施记录)+ README/CHANGELOG/site/CONTRIBUTING 同步
- PLAN 附录 H:交付物清单、提交顺序不变量、**实施中新发现的 10 个缺陷**(含分片号复用、 读快照与并发 flush 的窗口、checkpoint 仍等 compaction、takeover 世代竞争、提交中冻结表 误报 WRITE_LOST、底部层只剩墓碑的 TypeError、介质读故障被当缺失、元数据损坏静默空库等), 以及可复现的验收命令与实测数字。 - PLAN 待办表:B-6 行改为"完整实施(非降级选项)";原"B-1 遗留"给出结论 (compaction/merge 输入只来自已校验数据,补校验反而有害;触发条件写明)。 - README:架构图/核心机制加入单一提交点;新增"存储布局在 v0.8.0 变更"的已知限制与迁移说明; 测试 1935 / 覆盖率 90.34 · 82.16 · 94.06 · 93.23;新增变异验证命令。 - CHANGELOG:0.8.0 条目补齐 B-6 完整实现(含 9 个新错误码与恢复报告)。 - site:错误码表补 7 个新码;AriaEngine 与崩溃恢复卡片按实现改写(不再宣称"空洞截断"); 首页徽章数字同步。 - CONTRIBUTING:新增"变异验证"一节(修复类提交必须能回答"回退后用例会不会失败")。
This commit is contained in:
+34
-3
@@ -11,8 +11,8 @@ All notable changes to MetonaSqlark will be documented in this file.
|
||||
> 必然复发的结构**:多处并存的语义实现被收敛为唯一实现,并第一次让崩溃语义、
|
||||
> 错误码一致性、入口等价性变成可机器验证的门禁。
|
||||
>
|
||||
> 测试规模 1304 → **1872(90 套件)+ 14 项 e2e**(另 4 个重型套件在独立 CI
|
||||
> job 串行运行)。
|
||||
> 测试规模 1304 → **1935(91 套件)+ 14 项 e2e**(另 4 个重型套件在独立 CI
|
||||
> job 串行运行);B-6 的全部修复另有 **22 项变异验证**(`scripts/mutation-b6.py`,全部通过)。
|
||||
|
||||
### 工作流 B · 结构根治(消除整类缺陷)
|
||||
|
||||
@@ -45,7 +45,38 @@ All notable changes to MetonaSqlark will be documented in this file.
|
||||
并统一分隔标识符语义:引号只在"解析→执行"边界脱去。
|
||||
顺带补上 **ORDER BY 的列存在性/歧义校验**(此前 JOIN 里裸写两表同名列既不报错
|
||||
也不确定按哪列排)。
|
||||
- **B-6 存储提交点(KVStore)** — 两处 P0:① `open()` 遇损坏日志尾部会**清空整个
|
||||
- **B-6 存储提交点(完整实施,非降级方案)** — 见 `PLAN-v0.7.5.md` 附录 H。
|
||||
- **`__aria_manifest_<generation>` 单一提交点**:页面水位 + 各命名空间 SSTable
|
||||
元数据 + 表结构 + WAL 起始位置 + 待落盘冻结表意图,一次原子提交
|
||||
(头部/载荷双 CRC、先写后验、保留两代)。顺序固定为
|
||||
**数据落盘 → manifest 提交 → 才允许截断 WAL / 删除旧文件**。
|
||||
- **元数据损坏不再静默空库**:此前 `__aria_lsm_meta*` 是裸 JSON,解析失败即
|
||||
`[]` → 看不到任何表,随后 `repair()` 还会把"没人引用"的活页删光(不可逆)。
|
||||
现在全部世代校验失败抛 `ARIA_MANIFEST_CORRUPT`,旧格式迁移遇到坏 JSON 抛
|
||||
`ARIA_LEGACY_META_CORRUPT`。
|
||||
- **WAL**:LSN 改为一库一条单调水位(manifest 记账);按水位删除旧分片;
|
||||
**分片号只增不减**(修复前全量截断后重置为 0,会与 manifest 记录的
|
||||
`startSegment` 错位,实测造成"删掉的行复活"与"已确认写入丢失"两个方向的损坏);
|
||||
分片空洞(含前缀缺失)显式报 `ARIA_WAL_GAP` 而不是静默丢弃尾部。
|
||||
- **LSM**:冻结表成为一等状态(失败可重试,`flush()` 先入链再报错,修复前
|
||||
一次后台失败会让之后每次 flush 直接抛错、数据永远等不到落盘);compaction
|
||||
不再"先摘整层再合并"(窗口内该层对读者不可见 → 少行);底部层原地合并
|
||||
**回收墓碑**;`compacting` 改为按层集合;被取代的 SSTable 进入退休表,
|
||||
等更早的读者退出才物理删除;`rangeScanLazy` 提前终止不再多算一条。
|
||||
- **读路径自洽**:删除引擎层全部 `prefetch*`/`drainChain` 依赖,改为
|
||||
"快照 + 结构版本乐观重试"(修复前那次改动会暴露一个新缺陷:并发 flush
|
||||
在扫描的 await 窗口里发布的 SSTable 对本次扫描不可见 → 刚改名的行读回旧值)。
|
||||
- **checkpoint 不等 compaction**:写路径的周期 checkpoint 只落 memtable,
|
||||
compaction 继续后台跑(v0.6.1 记录的 "8~11s 悬崖"的另一半)。
|
||||
- **介质故障与"文件不存在"分开**:读失败抛 `ARIA_SSTABLE_READ_FAILED`,
|
||||
不再被折叠成 null 从而误删元数据。
|
||||
- **恢复报告**:`engine.getRecoveryReport()` 返回
|
||||
`{droppedSSTables, dataLossSuspected, walGaps, legacyImported, manifestFallback}`。
|
||||
- 新增 `tests/v080-b6-single-commit-point.test.ts`(63 项:含 manifest 严格校验
|
||||
表驱动 25 例)与
|
||||
`scripts/mutation-b6.py`(22 项变异验证:把修复回退到修复前行为,对应用例
|
||||
必须失败 —— 全部被拦住)。
|
||||
- **B-6 存储提交点(KVStore 侧止血)** — 两处 P0:① `open()` 遇损坏日志尾部会**清空整个
|
||||
日志**(写 3 条 → 第 4 条撕裂 → 重开可见 → 再重开全空);② 自动 checkpoint
|
||||
失败会让**已确认写入**报错(而该写入已在 WAL 中,报错与事实相反)。另修陈旧实例
|
||||
的 checkpoint 会**静默抹掉**新实例写入(现抛 `STALE_INSTANCE` 拒绝提交)。
|
||||
|
||||
Reference in New Issue
Block a user