该类主要的功能是记录节点ack的信息,并且判断是否超过了半数等信息
这个东西是在FastleaderElection中通过getVoteTracker获取到的
关系图
![]()
变量
protected ArrayList<QuorumVerifierAcksetPair> qvAcksetPairs = new ArrayList<QuorumVerifierAcksetPair>();
只有一个变量,节点验证器的ack集合,所以重点是这个qvAcksetPairs
QuorumVerifierAcksetPair
用来存储验证器,以及ack的列表。
public static class QuorumVerifierAcksetPair {
private final QuorumVerifier qv; //验证器
private final HashSet<Long> ackset; //ack的列表
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,则认为是失败的。
public boolean hasAllQuorums() {
for (QuorumVerifierAcksetPair qvAckset : qvAcksetPairs) {
if (!qvAckset.getQuorumVerifier().containsQuorum(qvAckset.getAckset())) {
return false;
}
}
return true;
}
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;
}
}
}