[Important] MemTable 写入失败(Arena 满)在 WAL 写入后未覆盖 #10

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

来源

Oracle 审核 docs/design.md Section 3.2 WAL

位置

Section 3.2 "写入流程" 步骤 ⑥(~line 109)

问题描述

写入流程步骤 ⑤(WAL encode/write)成功后,步骤 ⑥ 写入 MemTable 可能因为 Arena 满而失败。此时 WAL bytes 已持久化(或已在 page cache),但 MemTable 中没有对应 entry。设计文档未覆盖此场景。

建议修复

方案 A(推荐):在 WAL write 之前保证 MemTable 有足够容量。

写入前检查 Arena 剩余空间,不足时先冻结 MemTable 并创建新 MemTable。
Arena 预留必须考虑最大可能的 batch size。

方案 B:MemTable 写入失败后按 ErrCommitUnknown + write-stopped 处理。

因为 WAL bytes 可能已持久化,不能按普通错误处理。

## 来源 Oracle 审核 `docs/design.md` Section 3.2 WAL ## 位置 Section 3.2 "写入流程" 步骤 ⑥(~line 109) ## 问题描述 写入流程步骤 ⑤(WAL encode/write)成功后,步骤 ⑥ 写入 MemTable 可能因为 Arena 满而失败。此时 WAL bytes 已持久化(或已在 page cache),但 MemTable 中没有对应 entry。设计文档未覆盖此场景。 ## 建议修复 **方案 A(推荐)**:在 WAL write 之前保证 MemTable 有足够容量。 > 写入前检查 Arena 剩余空间,不足时先冻结 MemTable 并创建新 MemTable。 > Arena 预留必须考虑最大可能的 batch size。 **方案 B**:MemTable 写入失败后按 `ErrCommitUnknown` + write-stopped 处理。 > 因为 WAL bytes 可能已持久化,不能按普通错误处理。
dailz closed this issue 2026-06-11 19:53:25 +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#10