update WAL published sequence design
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
+13
-2
@@ -167,13 +167,13 @@ WAL 写入路径的失败分类如下:
|
||||
|
||||
#### 可见性语义
|
||||
|
||||
- `publishedSequence` 表示普通读的逻辑可见 high-water mark;普通读可以读取 MemTable,但只返回 `sequence <= publishedSequence` 的 entry
|
||||
- `publishedSequence` 表示 WAL 物理 mutation sequence 的连续发布边界:普通读可以读取 MemTable,但第一阶段只返回 `sequence <= publishedSequence` 的 entry
|
||||
- fsync 前,写入可以已经存在于 MemTable 中,但处于 pending / unpublished 状态,仅供内部提交流程使用,对普通读不可见
|
||||
- pending / unpublished / aborted entry 不仅对普通读不可见,也不得进入 SSTable;MemTable flush 必须遵守 3.3 的 Flush 过滤规则,只刷 `sequence <= publishedSequence` 且非 aborted 的 entry
|
||||
- `Always` 默认策略下,`publishedSequence` 也是 durable high-water mark;普通读能读到的数据,必须是崩溃恢复后仍可恢复的数据
|
||||
- `Periodic` / `Never` 策略下,`publishedSequence` 可以领先于 durable high-water mark;普通读能读到当前进程内已发布的数据,但这些数据不保证机器掉电后仍可恢复
|
||||
- 如果 WAL Entry 引用外部持久化对象(例如 Value Log record),发布 WAL Batch 前,被引用对象也必须满足当前落盘策略对应的持久化要求;在 `Always` 下这意味着该 Batch 引用的 Value Log ranges 必须先通过 3.9 的 durable barrier,避免恢复后出现悬空指针
|
||||
- 该模型为后续 MVCC / 事务层提供统一的 read timestamp / commit sequence 基础
|
||||
- 第一阶段单 key autocommit 中,`entry.sequence == commitSequence`,因此 `publishedSequence` 可同时作为普通读可见边界;后续 MVCC / SSI 引入多 key 事务后,`publishedSequence` 不改义为事务提交时间,而是继续表示物理发布 / durable / recovery 边界,事务可见性由独立的 `commitSequence` / `visibleCommitSequence` 控制
|
||||
- `Always` 下该选择牺牲的是写入进入 MemTable 后到 fsync 发布前的短暂全局可见性延迟,不是已发布数据的读路径性能
|
||||
|
||||
#### WAL 落盘策略
|
||||
@@ -448,6 +448,17 @@ WAL Batch 解析和写入必须使用同一套可配置资源上限。默认上
|
||||
|
||||
WAL 的 `baseSequence + i` 是物理 mutation sequence,用于保持 WAL 重放顺序和 `publishedSequence` 连续推进;它不能直接等同于多 key 事务的逻辑提交时间。
|
||||
|
||||
相关 sequence 的职责边界如下:
|
||||
|
||||
| 名称 | 范围 | 职责 |
|
||||
|------|------|------|
|
||||
| `walSequence` / `entry.sequence` | 单条 WAL 物理 mutation | 保证 WAL append、recovery replay、MemTable flush 与 Value Log 可达性判断的物理顺序 |
|
||||
| `publishedSequence` | 连续的 WAL 物理 mutation high-water mark | 表示已发布到读路径且满足当前落盘策略的物理边界;也是 recovery / durable high-water mark;MVCC 引入后仍不表示事务可见时间 |
|
||||
| `commitSequence` | 事务逻辑提交记录 | 表示 MVCC reader 与 SSI 冲突检测使用的逻辑提交 timestamp;同一事务内所有 mutation 共享一个 `commitSequence` |
|
||||
| `visibleCommitSequence` / reader snapshot | 读事务或普通读的逻辑可见边界 | 事务时代的读可见性 high-water mark;读路径必须同时满足 MVCC 可见性规则和底层物理 mutation 已不超过 `publishedSequence` |
|
||||
|
||||
因此系统在 MVCC / SSI 阶段会同时维护两个边界:`publishedSequence` 负责物理持久化与恢复连续性,`visibleCommitSequence` 负责事务逻辑可见性。二者在第一阶段单 key autocommit 中等价,但这是阶段性简化,不是长期语义。
|
||||
|
||||
第一阶段单 key autocommit 规则:
|
||||
|
||||
```text
|
||||
|
||||
Reference in New Issue
Block a user