在2a的test里标注了,leader在收到高于自己term的follower发来的信息时应自动转变为follower,raft论文里也对此有描述。但实际etcd里的实现是在leader处理MsgAppResp时根据对方term调整自身状态,为什么不给leader设置一个收到AppendEntries以及heartbeat时的处理逻辑呢?
我认为在etcd中是有这样的处理逻辑的。
如果某个节点收到了消息,首先会进入Step函数处理,而不是直接进入stepFollower/stepCandidate/stepLeader函数进行处理。
我们就假设Leader收到了一个来自更高Term的节点的heartBeatResponse,在Step函数处理之后,Leader会转为Follower。
func (r *raft) Step(m pb.Message) error {
// Handle the message term, which may result in our stepping down to a follower.
switch {
//。。。。。。
case m.Term > r.Term:
//。。。。。。
switch {
//。。。。。。
default:
//。。。。。。
if m.Type == pb.MsgApp || m.Type == pb.MsgHeartbeat || m.Type == pb.MsgSnap {
r.becomeFollower(m.Term, m.From)
} else {
//Leader收到的消息类型为MsgHeartbeatResp,进入到下面的函数,转为Follower。
r.becomeFollower(m.Term, None)
}
}
case m.Term < r.Term:
//。。。。。。
}
诸如此类。。。。
刚看了一下,确实是这样的。是我看的不仔细了 没注意到源码通过r.Step预处理再用r.step细分处理
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。