设为首页 加入收藏

TOP

etcd/raft选举源码解读(五)
2023-07-23 13:30:32 】 浏览:77
Tags:etcd/raft 解读
n we get a // quorum. If it is not, the term comes from the node that // rejected our vote so we should become a follower at the new // term. default: if m.Type == pb.MsgApp || m.Type == pb.MsgHeartbeat || m.Type == pb.MsgSnap { r.becomeFollower(m.Term, m.From) } else { r.becomeFollower(m.Term, None) } } case m.Term < r.Term: // ........ } switch m.Type { case pb.MsgHup: // ........ case pb.MsgVote, pb.MsgPreVote: // We can vote if this is a repeat of a vote we've already cast... canVote := r.Vote == m.From || // ...we haven't voted and we don't think there's a leader yet in this term... (r.Vote == None && r.lead == None) || // ...or this is a PreVote for a future term... (m.Type == pb.MsgPreVote && m.Term > r.Term) // ...and we believe the candidate is up to date. if canVote && r.raftLog.isUpToDate(m.Index, m.LogTerm) { // Note: it turns out that that learners must be allowed to cast votes. // This seems counter- intuitive but is necessary in the situation in which // a learner has been promoted (i.e. is now a voter) but has not learned // about this yet. // For example, consider a group in which id=1 is a learner and id=2 and // id=3 are voters. A configuration change promoting 1 can be committed on // the quorum `{2,3}` without the config change being appended to the // learner's log. If the leader (say 2) fails, there are de facto two // voters remaining. Only 3 can win an election (due to its log containing // all committed entries), but to do so it will need 1 to vote. But 1 // considers itself a learner and will continue to do so until 3 has // stepped up as leader, replicates the conf change to 1, and 1 applies it. // Ultimately, by receiving a request to vote, the learner realizes that // the candidate believes it to be a voter, and that it should act // accordingly. The candidate's config may be stale, too; but in that case // it won't win the election, at least in the absence of the bug discussed // in: // https://github.com/etcd-io/etcd/issues/7625#issuecomment-488798263. // When responding to Msg{Pre,}Vote messages we include the term // from the message, not the local term. To see why, consider the // case where a single node was previously partitioned away and // it's local term is now out of date. If we include the local term // (recall that for pre-votes we don't update the local term), the // (pre-)campaigning node on the other end will proceed to ignore // the message (it ignores all out of date messages). // The term in the original message and current local term are the // same in the case of regular votes, but different for pre-votes. r.send(pb.Message{To: m.From, Term: m.Term, Type: voteRespMsgType(m.Type)}) if m.Type == pb.MsgVote { // Only record real votes. r.electionElapsed = 0 r.Vote = m.From } } else { r.send(pb.Message{To: m.From, Term: r.Term, Type: voteRespMsgType(m.Type), Reject: true}) } default: // ........... } return nil }

注意:节点同意投票消息带的是m.Term,拒绝投票消息是r.Term,如果拒接MsgPreVote消息,那么发送pre-vote消息的节点就变为

r.Termfollower,在2.3.1节内体现

2.3 节点收到处理MsgPreVoteResp或MsgVoteResp消息流程

2.3.1 Step内处理

根据2.2节可以看到Step内有这样一段代码:在2.2节最后有解释,官方也给了详细注释

		switch {
		case m.Type == pb.MsgPreVote:
			// Never change our term in response to a PreVote
		case m.Type == pb.MsgPreVoteResp && !m.Reject:
	
首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇go打印hello world、go语言的注释.. 下一篇golang + modbus tcp

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目