对于下面这个测试代码,当传入参数state为stateCandidate时,Raft会依次执行becomeCandidate和tick超时。
测试代码检查了第二次requestVote的情况。
我的问题是,按raft逻辑,becomeCandidate只有在follower超时的时候才可能发生,也就是说执行becomeCandidate的时候,就会发送requestVote。
但测试代码似乎没考虑第一次的投票情况。
所以,是在becomeCandidate的时候不该立即requestVote,还是应该在测试代码tick超时之前额外清空一下消息列表?
func testNonleaderStartElection(t *testing.T, state StateType) {
// election timeout
et := 10
r := newTestRaft(1, []uint64{1, 2, 3}, et, 1, NewMemoryStorage())
switch state {
case StateFollower:
r.becomeFollower(1, 2)
case StateCandidate:
r.becomeCandidate()
}
for i := 1; i < 2*et; i++ {
r.tick()
}
if r.Term != 2 {
t.Errorf("term = %d, want 2", r.Term)
}
if r.State != StateCandidate {
t.Errorf("state = %s, want %s", r.State, StateCandidate)
}
if !r.votes[r.id] {
t.Errorf("vote for self = false, want true")
}
msgs := r.readMessages()
sort.Sort(messageSlice(msgs))
wmsgs := []pb.Message{
{From: 1, To: 2, Term: 2, MsgType: pb.MessageType_MsgRequestVote},
{From: 1, To: 3, Term: 2, MsgType: pb.MessageType_MsgRequestVote},
}
if !reflect.DeepEqual(msgs, wmsgs) {
t.Errorf("msgs = %v, want %v", msgs, wmsgs)
}
}