RaftBatchSystem处理IO的代码解读

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:4.0.0
  • 【问题描述】:

raftstore的源码解读中提到:

在 PeerStorage 的 handle_raft_ready 方法中,会将收集到 Ready 中的 Raft 日志收集到一个 WriteBatch 中,最终在 RaftPoller 的 end 方法中批量写入磁盘。而 Ready 中收集到的确认过的 Raft 日志,会被 apply_router 发送到 apply 线程中,由 ApplyBatchSystem 来处理。

请问 RaftBatchSystem 涉及的IO操作是同步的吗?
意思是在RaftPoller::end()中完成一个batch的写盘操作之后 该线程才会开始处理下一个batch?

另外源码解读中提到,日志的分发也需要走raftstore。意思是replicate涉及的网络io也走raftstore吗?

另外这里提到:

上层的写入请求会构造一个 PeerMsg::RaftCommand,里面包含写入的 Key-Value,并将 RaftCommand 通过 Router 发送到 raft 线程池,raft 线程将 Raft 日志写入到 Raft RocksDB 并同步给其他 Peer,当日志提交之后,apply 线程将数据写入 KV RocksDB,整体流程如下图所示:

请问raft线程指的就是raftstore吗?这里提到“同步给其他peer”的代码段在哪里呀?

是的

是的

网络io 由额外的线程处理,不在 raftstore 的线程中处理,具体代码在 src/server/raft_client.rs

是的,raft线程指的就是raftstore

“同步给其他peer”的代码

  1. 底层的 raft-rs 库负责收集需要同步给其他 peer 的日志消息(MsgAppend),并包含在 Ready 中返回 raftstore
  2. raftstore 通过 poll_ctx.trans (实际上就是上面提到的 RaftClient) 发送消息

感谢!

如果网络IO出现延迟导致replicate的过程变慢,会导致raftstore中的线程被阻塞吗?


网络io 由额外的线程处理,不在 raftstore 的线程中处理,具体代码在 src/server/raft_client.rs

这个指的是grpc线程吗?(gRPC poll) 另外这里的网络io也是同步的吗

谢谢啦

不会的,raft peer 接收&处理消息都是异步的(这里的异步不是指 async/await, 而是处理逻辑的异步),replicate 的过程变慢会导致 raft log commit 变慢,但不会阻塞 raftstore 线程

在 release-4.0 中是grpc线程,在 matser 中是另外的线程

无论是 release-4.0 还是 matser 这里的网络 io 都是异步的