(VIII)飼育係のSyncedLearnerTrackerリーダー選挙と投票総務提案

  • 投票の合計である:SyncedLearnerTracker
    このクラスの主な役割は以下のように、選挙や投票事項の現在のラウンドのためにいくつかの統計関数を提供することである:
    1、投票バリデータと初期化acksetを追加acksetは、飼育係のサービスは、応答リスト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から継承しますが、二つ以上のメンバ変数、最初のものはリーダーフォロワー間でデータパケットと対話することで、2番目のトランザクション要求体です。

  • 内部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;
        }
    }

これは、投票はacksetのリストをペアリングして答えるQuorumVerifierバリで

コアな方法:
    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)
    の初期化acksetのサイズは投票のリストでバリデータQuorumVerifierの大きさに応じて投票するとき、バリデータQuorumVerifierと初期化acksetを投票に追加
  • addAck(ロングSID)は、
    対応するリストに応答ACK添加しました
  • hasSid(ロングSID)
    指定されたSERVERIDの役割で投票が現在のキャッシュ投票バリデータを検証しているかどうか
  • hasAllQuorums()
    ここで注意することは、投票や業務によって選挙の現在のラウンドは限りSyncedLearnerTrackerキャッシュバリデータとしてQuorumVerifier投票、投票権がないことであるかどうかのチェックは、あなたが投票のこのラウンドが失敗したことを思うだろう

おすすめ

転載: blog.csdn.net/long9870/article/details/93737545
おすすめ