TinyKV中的LocalMsg

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 个赞

谢谢~

1 个赞

我还不理解这里为什么要调用

r.Step(pb.Message{MsgType: pb.MessageType_MsgPropose, Entries: []*pb.Entry{{}}}
1 个赞

propose是通知leader加入并同步一个数据,就是entries里面的。
设定上,leader一当选就要加入并同步一个空数据。
不过并不影响这个测试

1 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。