(八)zookeeper的Leader选举与事务投票之SyncedLearnerTracker与Proposal

  • 投票统计器: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中有一个没有通过投票,那么会认为本轮投票失败

猜你喜欢

转载自blog.csdn.net/long9870/article/details/93737545
今日推荐