TestLeaderElectionOverwriteNewerLogs2AB的疑问

image
注释里写的是最开始的时候 node1 因为对方的term是2,而自己是1,才选举失败的。然而 MsgHup 在发起一轮选举的时候就会自增任期,变成2。为什么在这里会失败呢?

如论文所说,我感觉测试文件有点小问题

注释的意思是nodes4、5在term2都已经投票了
只有node2会给它投票,node3因为有比他新的index而拒绝投票
如果有超过半数的nodes都投拒绝票,那么这个node将转变成follower
(可以看entsWithConfig的实现

此时node1为候选者,term=2,向其余节点发送投票信息。其中节点2,因为处在term=1,所以投票成功。但节点3 4 5,初始时term就等于2,这个term不是凭空增到2的,说明这三个节点知道,在term=2,已经有一个leader了,一个term只能有一个leader。所以这三个节点,对node1的投票是失败,node1接收到大多数的失败票,就转为follower了

1赞

3 4 5的初始化任期已经是2,也就是说大多数节点已经知道任期2有一个leader,所以对他投reject票,所以他的状态会变为follower,他的Term仍然会维持在2

1赞

node3有更新的log,node4,5已经投票给3了,因此只有node2会给node1投票,node1是不能成功当选的。

我想你是觉得 Node 1's term is pushed ahead to 2. 这句有问题吧。

也就是说,在 Node1 开始选举的时候已经将 term 自增,到了 term==2

因此,它选举失败的原因是没有得到多数的赞成票。个人觉得 Node 1's term is pushed ahead to 2. 注释有问题,可以改一下。(建议pr)

关于多数票拒绝的问题:
https://github.com/tidb-incubator/tinykv/pull/328/commits/f78c850615d161b6ae512db00a3aa0d3baaac15a

是的,应该是Node1选举的时候的term就是2了。另外其他几位老哥说的也对