该类主要的功能是记录节点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;         }
      }
  }
  |