该类主要的功能是记录节点ack的信息,并且判断是否超过了半数等信息
这个东西是在FastleaderElection中通过getVoteTracker获取到的
关系图

变量
1
| protected ArrayList<QuorumVerifierAcksetPair> qvAcksetPairs = new ArrayList<QuorumVerifierAcksetPair>();
|
只有一个变量,节点验证器的ack集合,所以重点是这个qvAcksetPairs
QuorumVerifierAcksetPair
用来存储验证器,以及ack的列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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; }
}
|
hasAllQuorums 核心功能,用来判断是否满足了Quorum机制
如果其中存在某个验证器没有拿到超过半数的机器的ack,则认为是失败的。
1 2 3 4 5 6 7 8
| public boolean hasAllQuorums() { for (QuorumVerifierAcksetPair qvAckset : qvAcksetPairs) { if (!qvAckset.getQuorumVerifier().containsQuorum(qvAckset.getAckset())) { return false; } } return true; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| public class SyncedLearnerTracker {
protected ArrayList<QuorumVerifierAcksetPair> qvAcksetPairs = new ArrayList<QuorumVerifierAcksetPair>();
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; }
public String ackSetsToString() { StringBuilder sb = new StringBuilder();
for (QuorumVerifierAcksetPair qvAckset : qvAcksetPairs) { sb.append(qvAckset.getAckset().toString()).append(","); }
return sb.substring(0, sb.length() - 1); }
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; }
}
}
|