设计审查: Periodic/Never 落盘策略下 fsync 错误的上报机制 #20

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

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

问题描述

PeriodicNever 策略下,WAL Batch 在 fsync 之前就可以发布 publishedSequence 并返回成功。这意味着:

  1. 已确认并返回成功的 batch 可能尚未 fsync
  2. 后台 periodic fsync 失败时,哪些 batch 受影响?
  3. 如何通知调用方?此时调用方已经收到成功返回

具体场景

时间线:
t1: Batch A 写入 WAL,Periodic 模式下立即发布 publishedSequence 并返回成功
t2: Batch B 写入 WAL,同样立即发布并返回成功
t3: 后台 fsync 触发,覆盖 A+B 的 WAL bytes,但 fsync 失败
    → A 和 B 的调用方已经收到成功确认
    → 但 WAL bytes 可能未持久化

需要明确

  1. Periodic fsync 失败后,引擎是否进入 write-stopped?
  2. 已经返回成功的 batch 如何处理?
    • 选项 A: 引擎进入 write-stopped,后续写入被拒绝;已返回成功的 batch 由调用方自行承担风险
    • 选项 B: 引擎记录 fsync 错误但继续服务,通过回调/通道通知调用方
    • 选项 C: 引擎降级到 Always 模式
  3. Periodic 模式下 durable high-water mark 如何跟踪?是否需要独立的 durableSequence

建议

至少需要跟踪 durableSequence(最后一次成功 fsync 的 batch sequence),并在 API 层暴露:

  • GetDurableSequence() uint64 — 调用方可以判断哪些确认是真正持久的
  • Periodic fsync 失败后进入 write-stopped 是最安全的选择
来源: docs/design.md §3.2 WAL Oracle 架构审查 ## 问题描述 `Periodic` 和 `Never` 策略下,WAL Batch 在 fsync 之前就可以发布 `publishedSequence` 并返回成功。这意味着: 1. **已确认并返回成功的 batch 可能尚未 fsync** 2. **后台 periodic fsync 失败时,哪些 batch 受影响?** 3. **如何通知调用方?此时调用方已经收到成功返回** ## 具体场景 ```text 时间线: t1: Batch A 写入 WAL,Periodic 模式下立即发布 publishedSequence 并返回成功 t2: Batch B 写入 WAL,同样立即发布并返回成功 t3: 后台 fsync 触发,覆盖 A+B 的 WAL bytes,但 fsync 失败 → A 和 B 的调用方已经收到成功确认 → 但 WAL bytes 可能未持久化 ``` ## 需要明确 1. Periodic fsync 失败后,引擎是否进入 write-stopped? 2. 已经返回成功的 batch 如何处理? - 选项 A: 引擎进入 write-stopped,后续写入被拒绝;已返回成功的 batch 由调用方自行承担风险 - 选项 B: 引擎记录 fsync 错误但继续服务,通过回调/通道通知调用方 - 选项 C: 引擎降级到 Always 模式 3. `Periodic` 模式下 `durable high-water mark` 如何跟踪?是否需要独立的 `durableSequence`? ## 建议 至少需要跟踪 `durableSequence`(最后一次成功 fsync 的 batch sequence),并在 API 层暴露: - `GetDurableSequence() uint64` — 调用方可以判断哪些确认是真正持久的 - Periodic fsync 失败后进入 write-stopped 是最安全的选择
dailz added the design-reviewquestionWAL labels 2026-06-12 08:28:42 +08:00
dailz closed this issue 2026-06-12 09:35:51 +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#20