设计审查: Segment ID 连续性要求与旧 segment 删除后的 gap 处理 #16

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

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

问题描述

Recovery 要求从 MANIFEST 指定的 recoverySegmentID 开始按 segmentID 升序恢复,且 segmentID 必须连续。但设计中没有明确:

  1. 已被 MANIFEST 覆盖的旧 segment 删除后,是否会在旧 ID 位置留下 gap?
  2. Recovery 是只关心 recoverySegmentID 之后的连续性,还是从 segment-0 开始要求全局连续?

当前理解的合理推断

"已被 MANIFEST 证明不再需要的旧 WAL segment 可以删除,不参与连续性校验;连续性要求只适用于 recovery 起点之后仍需恢复的 WAL segment。"

但实现时需要明确:如果 recoverySegmentID = 5,但 WAL 目录中存在 segment-3.wal(MANIFEST 已覆盖),recovery 应该忽略它还是报错?

需要明确

  • 连续性校验的起始点是 recoverySegmentID,不是 segment-0
  • 旧 segment 文件存在但已被 MANIFEST 覆盖时的行为:忽略?报错?还是要求实现必须先删除旧文件?
  • 是否允许 segmentID 不从 0 开始(例如首次创建时 recoverySegmentID = 0)?
来源: docs/design.md §3.2 WAL Oracle 架构审查 ## 问题描述 Recovery 要求从 MANIFEST 指定的 `recoverySegmentID` 开始按 segmentID 升序恢复,且 segmentID 必须连续。但设计中没有明确: 1. 已被 MANIFEST 覆盖的旧 segment 删除后,是否会在旧 ID 位置留下 gap? 2. Recovery 是只关心 `recoverySegmentID` 之后的连续性,还是从 segment-0 开始要求全局连续? ## 当前理解的合理推断 > "已被 MANIFEST 证明不再需要的旧 WAL segment 可以删除,不参与连续性校验;连续性要求只适用于 recovery 起点之后仍需恢复的 WAL segment。" 但实现时需要明确:如果 `recoverySegmentID = 5`,但 WAL 目录中存在 `segment-3.wal`(MANIFEST 已覆盖),recovery 应该忽略它还是报错? ## 需要明确 - 连续性校验的起始点是 `recoverySegmentID`,不是 segment-0 - 旧 segment 文件存在但已被 MANIFEST 覆盖时的行为:忽略?报错?还是要求实现必须先删除旧文件? - 是否允许 segmentID 不从 0 开始(例如首次创建时 recoverySegmentID = 0)?
dailz added the design-reviewquestionWAL labels 2026-06-12 08:28:10 +08:00
dailz closed this issue 2026-06-12 08:52:47 +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#16