Kudu Tablet Server 非事务写入流程分析
序 本文记录 kudu 源码阅读笔记,记录了 kudu tserver 端非事务写入的完整流程。 写入流程总览 Kudu 的一次“非事务”写(普通单/批行 Insert/Upsert/Update/Delete,不带 txn_id)在 tserver 侧需要经历以下阶段: Client 组装 WriteRequestPB 并通过 RPC 发送 (tserver_service.proto: Write). RPC 入口:TabletServiceImpl::Write() 做权限、资源(内存 / 线程池)与节流检查,构造 WriteOpState。 提交给 TabletReplica::SubmitWrite(),创建 WriteOp 与 OpDriver(LEADER 模式)。 OpDriver::ExecuteAsync() 进入 Prepare 阶段:解码行、锁定 schema、行级锁 / 分区锁(非事务写仅行锁)、权限校验。 (LEADER)向 RAFT 复制:给 ReplicateMsg 分配 timestamp,RaftConsensus::Replicate() 开始复制;Follower 侧由共识回放直接创建 Follower OpDriver 并 Start。 RAFT 提交(ReplicationFinished())后进入 Apply 阶段:WriteOp::Apply() 调用 Tablet::ApplyRowOperations() 执行实际插入/更新/删除(写入 MemRowSet / DeltaMemStore)。 生成 CommitMsg 写入 WAL;WriteOp::Finish() 更新 MVCC 状态与各种 metrics;释放行锁、schema 锁。 RPC 回调发送 WriteResponsePB 给客户端(含 per-row errors、资源 metrics、timestamp 等)。 流程总览图如下: ...