[tinyKV][etcd] project2a 关于AppendEntries的疑问

在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:
	//。。。。。。
}

诸如此类。。。。

刚看了一下,确实是这样的。是我看的不仔细了 :see_no_evil: 没注意到源码通过r.Step预处理再用r.step细分处理