20200212
Plan
60min: RocksDB Write Procedure
Notes
RocksDB Write Procedure: 今天收获比较大,不过疑惑以随之增多。
WriteThread 中维护一个 lockless 的 writer 双向链表(newest_writer_),其结构如下:
writer(n) <-> writer(n-1) <-> writer(n-2) <-> ... <-> writer(0) -> nullptr
其中序号可以认为是进入队列的先后顺序,越大越新,也就是说 writer(0) 就是 leader,leader 会负责把当时它看到的所有 follower 组成一个 WriteGroup,当 WriteGroup 完成(并发)写入之后,会从链表中挑选一个新的 leader,也就是会将 WriteGroup 中涉及到的 writer 从链表中 remove 掉。
整个 Write Procedure 中涉及到的写入方,实际上都被 WriteThread 增加了一个 state,然后每个写入方都成为了一个状态机,因此整个写入流程可以从状态的转换来入手。
目前简单总结如下:
- leader:JoinBatchWriter ==(如果是被选的话,那么会因为 AwaitState 而 block)==> STETE_GROUP_LEADER => EnterAsBatchGroupLeader => LaunchParallelMemTableWriters => WritebatchInternal::InsertInto => (暂缺)
- follower:JoinBatchWriter ==(AwaitState)==> STATE_PARALLEL_MEMTABLE_WRITER => WriteBatchInternal::InsertInto => CompleteParallelMemTableWriter => ExitAsBatchGroupFollower
疑惑: 这样的 batch write 似乎没有 batch 的效果,和直接并发写入似乎没有太大的区别。 关于这点可能是因为 sequence number 的存在,由于 sequence number 的存在会导致没法直接并发地写入,因此通过这个方式可以做到并发的写入。