看eraftpb.proto
的时候看到MessageType
的前三个是LocalMsg
,有个关于LocalMsg应该被谁append的问题请教一下大家:
- 例如一个candidate节点发生了election超时,他应该是将一个
MsgHup
附加到自己的msgs
,然后在Step
中处理MsgHub
来发送RequestVote RPC,还是直接发送RequestVote RPC。
-
MsgBeat
同理
或者说localMsg应该属于raft
层append还是属于rawnode
层append
1 个赞
不用附加到自己的msgs,直接调用step处理MsgHub。同理MsgBeat。
localMsg不用附加到msgs中去,只需要调用step处理就行
1 个赞
leader的MsgBeat应该直接传入Step函数
如果将MsgBeat传入自己的Msgs,你会发现通不过下面的测试代码。
因为在这个测试代码中,tick超时后,它默认所有的消息都是心跳消息,并没有将MsgBeat读出并传给Step的操作。
MsgHup同理
func TestLeaderBcastBeat2AA(t *testing.T) {
// heartbeat interval
hi := 1
r := newTestRaft(1, []uint64{1, 2, 3}, 10, hi, NewMemoryStorage())
r.becomeCandidate()
r.becomeLeader()
r.Step(pb.Message{MsgType: pb.MessageType_MsgPropose, Entries: []*pb.Entry{{}}})
r.readMessages() // clear message
for i := 0; i < hi; i++ {
r.tick()
}
msgs := r.readMessages()
sort.Sort(messageSlice(msgs))
wmsgs := []pb.Message{
{From: 1, To: 2, Term: 1, MsgType: pb.MessageType_MsgHeartbeat},
{From: 1, To: 3, Term: 1, MsgType: pb.MessageType_MsgHeartbeat},
}
if !reflect.DeepEqual(msgs, wmsgs) {
t.Errorf("msgs = %v, want %v", msgs, wmsgs)
}
}
1 个赞
我还不理解这里为什么要调用
r.Step(pb.Message{MsgType: pb.MessageType_MsgPropose, Entries: []*pb.Entry{{}}}
1 个赞
propose是通知leader加入并同步一个数据,就是entries里面的。
设定上,leader一当选就要加入并同步一个空数据。
不过并不影响这个测试
1 个赞
system
(system)
关闭
7
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。