设计审查: MANIFEST 职责边界 — checkpoint vs WAL 恢复终点 #17

Closed
opened 2026-06-12 08:28:17 +08:00 by dailz · 0 comments
Owner

来源: docs/design.md §3.2 WAL Oracle 架构审查

问题描述

设计中 MANIFEST 有两个看似矛盾的角色:

  1. 定义角色: "MANIFEST 表示 recovery 起点 / checkpoint 状态,只在 MemTable flush、SSTable 与 checkpoint 元数据都持久化后推进"
  2. 尾部截断时的角色: "更新 MANIFEST 或等价 recovery metadata,记录本次 recovery repair 后的恢复终点"

如果 MANIFEST 只在 checkpoint 时推进,那尾部截断不应该更新它。如果 MANIFEST 也负责记录 WAL 恢复终点,则需要单独定义其 crash-consistency 协议。

需要明确

  • MANIFEST 是否只记录 checkpoint(recovery 起点)?
  • 如果是,recovery repair(尾部截断)后的恢复终点记录在哪里?
    • 选项 A: 单独的 recovery metadata 文件
    • 选项 B: MANIFEST 增加 recoveryEndSequence 字段,但仅在 recovery repair 时更新
    • 选项 C: recovery repair 后通过截断 WAL 文件本身隐式记录终点(下次 recovery 重新扫描)

建议

推荐选项 C(最简洁):尾部截断持久化只需 ftruncate + fsync + 清理空 segment,不需要更新 MANIFEST。Recovery 完成后,publishedSequencenextSequence 是内存状态,下次启动重新从 MANIFEST recovery 点扫描 WAL 即可。

来源: docs/design.md §3.2 WAL Oracle 架构审查 ## 问题描述 设计中 MANIFEST 有两个看似矛盾的角色: 1. **定义角色:** "MANIFEST 表示 recovery 起点 / checkpoint 状态,只在 MemTable flush、SSTable 与 checkpoint 元数据都持久化后推进" 2. **尾部截断时的角色:** "更新 MANIFEST 或等价 recovery metadata,记录本次 recovery repair 后的恢复终点" 如果 MANIFEST 只在 checkpoint 时推进,那尾部截断不应该更新它。如果 MANIFEST 也负责记录 WAL 恢复终点,则需要单独定义其 crash-consistency 协议。 ## 需要明确 - MANIFEST 是否只记录 checkpoint(recovery 起点)? - 如果是,recovery repair(尾部截断)后的恢复终点记录在哪里? - 选项 A: 单独的 recovery metadata 文件 - 选项 B: MANIFEST 增加 `recoveryEndSequence` 字段,但仅在 recovery repair 时更新 - 选项 C: recovery repair 后通过截断 WAL 文件本身隐式记录终点(下次 recovery 重新扫描) ## 建议 推荐选项 C(最简洁):尾部截断持久化只需 `ftruncate + fsync + 清理空 segment`,不需要更新 MANIFEST。Recovery 完成后,`publishedSequence` 和 `nextSequence` 是内存状态,下次启动重新从 MANIFEST recovery 点扫描 WAL 即可。
dailz added the design-reviewquestionWAL labels 2026-06-12 08:28:17 +08:00
dailz closed this issue 2026-06-12 09:15:41 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/go-kv#17