- 投票统计器:SyncedLearnerTracker
这个类的主要作用是为本轮选举或事务投票提供一些统计性的功能,如下:
1.添加投票验证器以及初始化ackset,ackset是一个zookeeper服务发送ack应答列表
2.添加ack应答到相应的列表中
3.验证当前缓存的投票验证器中是否存在指定serverId的参与投票角色
4.检验是否通过本轮选举或事务投票 - 提案:Proposal
static public class Proposal extends SyncedLearnerTracker {
public QuorumPacket packet;
public Request request;
@Override
public String toString() {
return packet.getType() + ", " + packet.getZxid() + ", " + request;
}
}
这个类继承自SyncedLearnerTracker,但却多了两个成员变量,第一个是Leader跟Follower之间进行交互的数据包,第二个是事务请求本体.
- SyncedLearnerTracker中的内部类:QuorumVerifierAcksetPair
public static class QuorumVerifierAcksetPair {
private final QuorumVerifier qv;
private final HashSet<Long> ackset;
public QuorumVerifierAcksetPair(QuorumVerifier qv, HashSet<Long> ackset) {
this.qv = qv;
this.ackset = ackset;
}
public QuorumVerifier getQuorumVerifier() {
return this.qv;
}
public HashSet<Long> getAckset() {
return this.ackset;
}
}
这是一个投票验证器QuorumVerifier 和 ackset 应答列表的配对
核心方法:
public void addQuorumVerifier(QuorumVerifier qv) {
qvAcksetPairs.add(new QuorumVerifierAcksetPair(qv,
new HashSet<Long>(qv.getVotingMembers().size())));
}
public boolean addAck(Long sid) {
boolean change = false;
for (QuorumVerifierAcksetPair qvAckset : qvAcksetPairs) {
if (qvAckset.getQuorumVerifier().getVotingMembers().containsKey(sid)) {
qvAckset.getAckset().add(sid);
change = true;
}
}
return change;
}
public boolean hasSid(long sid) {
for (QuorumVerifierAcksetPair qvAckset : qvAcksetPairs) {
if (!qvAckset.getQuorumVerifier().getVotingMembers().containsKey(sid)) {
return false;
}
}
return true;
}
public boolean hasAllQuorums() {
for (QuorumVerifierAcksetPair qvAckset : qvAcksetPairs) {
if (!qvAckset.getQuorumVerifier().containsQuorum(qvAckset.getAckset()))
return false;
}
return true;
}
- addQuorumVerifier(QuorumVerifier qv)
添加投票验证器QuorumVerifier 以及初始化ackset,初始化ackset的大小时是按照投票验证器QuorumVerifier中参与投票列表的大小来的 - addAck(Long sid)
添加ack应答到相应的列表中 - hasSid(long sid)
验证当前缓存的投票验证器中是否存在指定serverId的参与投票角色 - hasAllQuorums()
检验是否通过本轮选举或事务投票,这里需要注意的是,只要SyncedLearnerTracker缓存的投票验证器QuorumVerifier中有一个没有通过投票,那么会认为本轮投票失败