此章研究WorkerReceiver和FastLeaderElection的响应模式, 进而分析其选举机制。面对其他服务器发来的不同数据,我们要判断其状态,并以此调整自己的状态、返回消息。我们要研究zookeeper选举时是如何根据消息进行响应的。
我们要研究,主线程在FastLeaderElection::lookForLeader以及WorkerReceiver::run是如何根据输入数据的不同进行响应的,图形化表示就是如下部分:
protected boolean termPredicate(Map<Long, Vote> votes, Vote vote) {
SyncedLearnerTracker voteSet = new SyncedLearnerTracker();
voteSet.addQuorumVerifier(self.getQuorumVerifier());
if (self.getLastSeenQuorumVerifier() != null
&& self.getLastSeenQuorumVerifier().getVersion() > self
.getQuorumVerifier().getVersion()) {
voteSet.addQuorumVerifier(self.getLastSeenQuorumVerifier());
}
/*
* First make the views consistent. Sometimes peers will have different
* zxids for a server depending on timing.
*/
for (Map.Entry<Long, Vote> entry : votes.entrySet()) {
if (vote.equals(entry.getValue())) {
voteSet.addAck(entry.getKey());
}
}
return voteSet.hasAllQuorums();
}
FastLeaderElection::getPeerEpoch
可知,其含义与currentEpoch
等同,只是后者在选票消息中的名字。logicalclock
等同,只是后者在选票中的名字。lookForLeader
的逻辑可知: 我们看到上图橘色方块的三个出口,可知节点认为自己处于集群中,需要满足三个条件之一: