tinykv TestHandleMessageType_MsgAppend2AB 的测试用例是否有问题

在测试TestHandleMessageType_MsgAppend2AB的case1中,


// 1. Reply false if log doesn’t contain an entry at prevLogIndex whose term matches prevLogTerm.

// Ensure 1

        {pb.Message{MsgType: pb.MessageType_MsgAppend, Term: 2, LogTerm: 3, Index: 2, Commit: 3}, 2, 0, true}, // previous log mismatch

测试用例的 logTerm > term, 这应当不会出现在真实场景里?

1 个赞

有可能出现。raft paper 里面其实也说了:Follower 可能丢失一些在新的 Leader 中有的日志,也有可能拥有一些新的 Leader 没有的日志。

可以看下 raft paper 里面关于日志复制的描述,

是有可能的,可以看下《In Search of an Understandable Consensus Algorithm (Extended Version)》里的figure7、figure8的相关描述

可否详细请教一下。
因为这个case是leader发往follower的message
我的理解是term代表当前leader的term,logterm代表的是当前leader在prs[i].Match位置的entry的term。
如果leader目前的term是2的话,logterm为3应当是term3时候的leader收到的信息。但term不会回退,所以我认为logterm为3的话,leader的term至少为3。我看了关于figure 7,8的描述,没有看明白哪里提及了logterm会大于leader term?

同疑问,按照论文里的描述

If RPC request or response contains term T > currentTerm:
set currentTerm = T, convert to follower (§5.1)

node的entries里是不应该包含比自身term更大的log的,因为在通过handleAppend时肯定已经与远端同步了自身的term

这个测试用例我也觉得是有问题的,之前有人提出过,然后还修改了,但应该没全部修改,快去提issue,继续修改~:thinking:

https://github.com/tidb-incubator/tinykv/issues/297