[Important] publishedSequence 需要明确的内存序约束 #14

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

来源

Oracle 审核 docs/design.md Section 3.2 WAL

位置

Section 3.2 "可见性语义"(~line 148)

问题描述

publishedSequence 作为普通变量描述其语义,但未说明其在 Go 内存模型中的操作类型。多 goroutine 并发读写需要明确的 happens-before 关系。

当前文档只描述了逻辑语义("普通读只返回 sequence <= publishedSequence 的 entry"),但缺少实现层面的内存序约束。这与 C5(Go 内存模型)相关但更聚焦于 publishedSequence 变量本身。

建议修复

在 "可见性语义" 小节补充内存序约束:

  1. 类型atomic.Uint64(或等效原子变量)
  2. 写入侧Store 只在 WAL durability 和所有 MemTable 节点原子发布都完成后执行
  3. 读取侧Load 在遍历 MemTable 前执行,获得可见性 high-water mark
  4. Happens-before 关系
WAL fsync 完成 → MemTable 节点原子发布 → publishedSequence.Store
→ 读者 publishedSequence.Load → 遍历 MemTable 筛选可见 entry
## 来源 Oracle 审核 `docs/design.md` Section 3.2 WAL ## 位置 Section 3.2 "可见性语义"(~line 148) ## 问题描述 `publishedSequence` 作为普通变量描述其语义,但未说明其在 Go 内存模型中的操作类型。多 goroutine 并发读写需要明确的 happens-before 关系。 当前文档只描述了逻辑语义("普通读只返回 `sequence <= publishedSequence` 的 entry"),但缺少实现层面的内存序约束。这与 C5(Go 内存模型)相关但更聚焦于 `publishedSequence` 变量本身。 ## 建议修复 在 "可见性语义" 小节补充内存序约束: 1. **类型**:`atomic.Uint64`(或等效原子变量) 2. **写入侧**:`Store` 只在 WAL durability 和所有 MemTable 节点原子发布都完成后执行 3. **读取侧**:`Load` 在遍历 MemTable 前执行,获得可见性 high-water mark 4. **Happens-before 关系**: ``` WAL fsync 完成 → MemTable 节点原子发布 → publishedSequence.Store → 读者 publishedSequence.Load → 遍历 MemTable 筛选可见 entry ```
dailz closed this issue 2026-06-11 20:36:15 +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#14