在AppendEntries RPC请求的构建时,initializing标志是通过!isCaughtUp(follower)
确定的,用于标识Follower是否已经与Leader日志同步。这对处理新加入节点或长时间离线后重新加入的节点特别重要。
本文来分析一下initializing为true和false这两种场景下Ratis分别的处理逻辑。
一、initializing == false
当initializing为false时,表示Follower已经完成初始化并被认为是"追上"了Leader的日志(即isCaughtUp(follower)返回true)。 这种场景下:
- Leader端处理
当Leader认为一个Follower已经追上其日志时(initializing=false):
- 正常日志复制:Leader会正常向该Follower发送AppendEntries请求,不再将其视为特殊的初始化节点。
- 参与提交索引计算:该Follower的复制进度会被纳入Leader计算提交索引(commit index)的多数派统计中。在LeaderStateImpl.updateCommit()方法中,系统会收集所有非初始化Follower的复制进度信息。
- 参与配置变更决策&