[Critical] Segment 边界跨 Batch 行为未定义 #6

Closed
opened 2026-06-09 13:07:29 +08:00 by dailz · 0 comments
Owner

来源

Oracle 审核 docs/design.md Section 3.2 WAL

位置

Section 3.2 "Block 边界处理"(~line 303)与 "Recovery 扫描流程"(~line 436)

问题描述

WAL Batch 可拆成多个 Physical Record 跨多个 Block,但未定义 WAL Batch 是否可以跨 segment 文件。Recovery 中 incomplete fragment 的处理取决于是否位于"最后一个需要恢复的 segment"(~line 493):

  • 如果 Batch 可以跨 segment:recovery 必须在 segment 间携带 fragment 收集状态(CollectingFragments),这增加了恢复复杂度
  • 如果 Batch 不可跨 segment:需要显式约束 segment rotation 时机

当前 recovery 流程按 segment 顺序独立扫描,未定义跨 segment fragment 收集。

影响

可能导致合法的跨 segment batch 被误判为中间损坏,或需要引入复杂的跨 segment 状态管理。

建议修复

在 Section 3.2 明确添加约束:

WAL Batch 不得跨 segment 文件。Segment rotation 只在 WAL Batch 边界发生。
当前 segment 写入完一个完整 WAL Batch 后,如果需要轮转,在下个 Batch 写入前切换到新 segment。

## 来源 Oracle 审核 `docs/design.md` Section 3.2 WAL ## 位置 Section 3.2 "Block 边界处理"(~line 303)与 "Recovery 扫描流程"(~line 436) ## 问题描述 WAL Batch 可拆成多个 Physical Record 跨多个 Block,但未定义 WAL Batch 是否可以跨 segment 文件。Recovery 中 incomplete fragment 的处理取决于是否位于"最后一个需要恢复的 segment"(~line 493): - 如果 Batch 可以跨 segment:recovery 必须在 segment 间携带 fragment 收集状态(CollectingFragments),这增加了恢复复杂度 - 如果 Batch 不可跨 segment:需要显式约束 segment rotation 时机 当前 recovery 流程按 segment 顺序独立扫描,未定义跨 segment fragment 收集。 ## 影响 可能导致合法的跨 segment batch 被误判为中间损坏,或需要引入复杂的跨 segment 状态管理。 ## 建议修复 在 Section 3.2 明确添加约束: > WAL Batch 不得跨 segment 文件。Segment rotation 只在 WAL Batch 边界发生。 > 当前 segment 写入完一个完整 WAL Batch 后,如果需要轮转,在下个 Batch 写入前切换到新 segment。
dailz closed this issue 2026-06-11 17:33:52 +08:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/go-kv#6