3.2 WAL:澄清 WAL write failure 与 MemTable pending entry 的时序 #1
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
docs/design.md第 3.2 节的 WAL 写入流程是:commit queue -> WAL writer 组 batch -> 分配 sequence -> 编码并写 WAL -> 写入 MemTable pending -> fsync -> publish。但后续失败处理描述中说:如果 WAL write 失败或 WAL bytes 未完整写入,pending entries 保留在 MemTable 中并保持 unpublished / aborted。
问题
这和当前流程存在时序矛盾:如果 WAL write 在写入 MemTable 之前失败,理论上 pending entry 还没有进入 MemTable。
风险
实现时可能出现两种互相冲突的解释:
如果不明确,WAL、MemTable flush、recovery 的失败路径会分叉。
建议
在 3.2 中明确区分:
参考
docs/design.md:101写入流程docs/design.md:117WAL write failure 处理docs/design.md:119fsync unknown 处理