Package org.apache.zookeeper.server.quorum

Examples of org.apache.zookeeper.server.quorum.Vote


        }

        public void run(){           
            try{
                Vote v = null;
                peer.setPeerState(ServerState.LOOKING);
                LOG.info("Going to call leader election: " + i);
                v = peer.getElectionAlg().lookForLeader();

                if (v == null){
View Full Code Here


            this.peer = peer;
            LOG.info("Constructor: " + getName());
        }
        public void run() {
            try {
                Vote v = null;
                while(true) {
                    peer.setPeerState(ServerState.LOOKING);
                    LOG.info("Going to call leader election again.");
                    v = peer.getElectionAlg().lookForLeader();
                    if(v == null){
View Full Code Here

    }

    protected ElectionResult countVotes(HashMap<InetSocketAddress, Vote> votes, HashSet<Long> heardFrom) {
        ElectionResult result = new ElectionResult();
        // Initialize with null vote
        result.vote = new Vote(Long.MIN_VALUE, Long.MIN_VALUE);
        result.winner = new Vote(Long.MIN_VALUE, Long.MIN_VALUE);
        Collection<Vote> votesCast = votes.values();
        // First make the views consistent. Sometimes peers will have
        // different zxids for a server depending on timing.
        for (Iterator<Vote> i = votesCast.iterator(); i.hasNext();) {
            Vote v = i.next();
            if (!heardFrom.contains(v.id)) {
                // Discard votes for machines that we didn't hear from
                i.remove();
                continue;
            }
View Full Code Here

            LOG.warn("Failed to register with JMX", e);
            self.jmxLeaderElectionBean = null;
        }

        try {
            self.setCurrentVote(new Vote(self.getId(),
                    self.getLastLoggedZxid()));
            // We are going to look for a leader by casting a vote for ourself
            byte requestBytes[] = new byte[4];
            ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes);
            byte responseBytes[] = new byte[28];
            ByteBuffer responseBuffer = ByteBuffer.wrap(responseBytes);
            /* The current vote for the leader. Initially me! */
            DatagramSocket s = null;
            try {
                s = new DatagramSocket();
                s.setSoTimeout(200);
            } catch (SocketException e1) {
                LOG.error("Socket exception when creating socket for leader election", e1);
                System.exit(4);
            }
            DatagramPacket requestPacket = new DatagramPacket(requestBytes,
                    requestBytes.length);
            DatagramPacket responsePacket = new DatagramPacket(responseBytes,
                    responseBytes.length);
            HashMap<InetSocketAddress, Vote> votes =
                new HashMap<InetSocketAddress, Vote>(self.getVotingView().size());
            int xid = epochGen.nextInt();
            while (self.isRunning()) {
                votes.clear();
                requestBuffer.clear();
                requestBuffer.putInt(xid);
                requestPacket.setLength(4);
                HashSet<Long> heardFrom = new HashSet<Long>();
                for (QuorumServer server : self.getVotingView().values()) {
                    LOG.info("Server address: " + server.addr);
                    try {
                        requestPacket.setSocketAddress(server.addr);
                    } catch (IllegalArgumentException e) {
                        // Sun doesn't include the address that causes this
                        // exception to be thrown, so we wrap the exception
                        // in order to capture this critical detail.
                        throw new IllegalArgumentException(
                                "Unable to set socket address on packet, msg:"
                                + e.getMessage() + " with addr:" + server.addr,
                                e);
                    }

                    try {
                        s.send(requestPacket);
                        responsePacket.setLength(responseBytes.length);
                        s.receive(responsePacket);
                        if (responsePacket.getLength() != responseBytes.length) {
                            LOG.error("Got a short response: "
                                    + responsePacket.getLength());
                            continue;
                        }
                        responseBuffer.clear();
                        int recvedXid = responseBuffer.getInt();
                        if (recvedXid != xid) {
                            LOG.error("Got bad xid: expected " + xid
                                    + " got " + recvedXid);
                            continue;
                        }
                        long peerId = responseBuffer.getLong();
                        heardFrom.add(peerId);
                        //if(server.id != peerId){
                            Vote vote = new Vote(responseBuffer.getLong(),
                                responseBuffer.getLong());
                            InetSocketAddress addr =
                                (InetSocketAddress) responsePacket
                                .getSocketAddress();
                            votes.put(addr, vote);
                        //}
                    } catch (IOException e) {
                        LOG.warn("Ignoring exception while looking for leader",
                                e);
                        // Errors are okay, since hosts may be
                        // down
                    }
                }

                ElectionResult result = countVotes(votes, heardFrom);
                // ZOOKEEPER-569:
                // If no votes are received for live peers, reset to voting
                // for ourselves as otherwise we may hang on to a vote
                // for a dead peer                
                if (votes.size() == 0) {                   
                    self.setCurrentVote(new Vote(self.getId(),
                            self.getLastLoggedZxid()));
                } else {
                    if (result.winner.id >= 0) {
                        self.setCurrentVote(result.vote);
                        // To do: this doesn't use a quorum verifier
                        if (result.winningCount > (self.getVotingView().size() / 2)) {
                            self.setCurrentVote(result.winner);
                            s.close();
                            Vote current = self.getCurrentVote();
                            LOG.info("Found leader: my type is: " + self.getLearnerType());
                            /*
                             * We want to make sure we implement the state machine
                             * correctly. If we are a PARTICIPANT, once a leader
                             * is elected we can move either to LEADING or
View Full Code Here

                    case 2:
                        ackstate = QuorumPeer.ServerState.FOLLOWING;
                        break;
                    }

                    Vote current = self.getCurrentVote();

                    switch (type) {
                    case 0:
                        // Receive challenge request
                        ToSend c = new ToSend(ToSend.mType.challenge, tag,
View Full Code Here

        }

        public void run(){
            try{
                Vote v = null;
                peer.setPeerState(ServerState.LOOKING);
                LOG.info("Going to call leader election: " + i);
                v = peer.getElectionAlg().lookForLeader();

                if (v == null){
                    Assert.fail("Thread " + i + " got a null vote");
                }

                /*
                 * A real zookeeper would take care of setting the current vote. Here
                 * we do it manually.
                 */
                peer.setCurrentVote(v);

                LOG.info("Finished election: " + i + ", " + v.getId());

                Assert.assertTrue("State is not leading.", peer.getPeerState() == ServerState.LEADING);
            } catch (Exception e) {
                e.printStackTrace();
            }
View Full Code Here

    }

    private ElectionResult countVotes(HashMap<InetSocketAddress, Vote> votes, HashSet<Long> heardFrom) {
        ElectionResult result = new ElectionResult();
        // Initialize with null vote
        result.vote = new Vote(Long.MIN_VALUE, Long.MIN_VALUE);
        result.winner = new Vote(Long.MIN_VALUE, Long.MIN_VALUE);
        Collection<Vote> votesCast = votes.values();
        // First make the views consistent. Sometimes peers will have
        // different zxids for a server depending on timing.
        for (Iterator<Vote> i = votesCast.iterator(); i.hasNext();) {
            Vote v = i.next();
            if (!heardFrom.contains(v.id)) {
                // Discard votes for machines that we didn't hear from
                i.remove();
                continue;
            }
View Full Code Here

        }
        return result;
    }

    public Vote lookForLeader() throws InterruptedException {
        self.setCurrentVote(new Vote(self.getId(), self.getLastLoggedZxid()));
        // We are going to look for a leader by casting a vote for ourself
        byte requestBytes[] = new byte[4];
        ByteBuffer requestBuffer = ByteBuffer.wrap(requestBytes);
        byte responseBytes[] = new byte[28];
        ByteBuffer responseBuffer = ByteBuffer.wrap(responseBytes);
        /* The current vote for the leader. Initially me! */
        DatagramSocket s = null;
        try {
            s = new DatagramSocket();
            s.setSoTimeout(200);
        } catch (SocketException e1) {
            e1.printStackTrace();
            System.exit(4);
        }
        DatagramPacket requestPacket = new DatagramPacket(requestBytes,
                requestBytes.length);
        DatagramPacket responsePacket = new DatagramPacket(responseBytes,
                responseBytes.length);
        HashMap<InetSocketAddress, Vote> votes = new HashMap<InetSocketAddress, Vote>(
                self.quorumPeers.size());
        int xid = new Random().nextInt();
        while (self.running) {
            votes.clear();
            requestBuffer.clear();
            requestBuffer.putInt(xid);
            requestPacket.setLength(4);
            HashSet<Long> heardFrom = new HashSet<Long>();
            for (QuorumServer server : self.quorumPeers.values()) {
                requestPacket.setSocketAddress(server.addr);
                LOG.warn("Server address: " + server.addr);
                try {
                    s.send(requestPacket);
                    responsePacket.setLength(responseBytes.length);
                    s.receive(responsePacket);
                    if (responsePacket.getLength() != responseBytes.length) {
                        LOG.error("Got a short response: "
                                + responsePacket.getLength());
                        continue;
                    }
                    responseBuffer.clear();
                    int recvedXid = responseBuffer.getInt();
                    if (recvedXid != xid) {
                        LOG.error("Got bad xid: expected " + xid
                                + " got " + recvedXid);
                        continue;
                    }
                    long peerId = responseBuffer.getLong();
                    heardFrom.add(peerId);
                    //if(server.id != peerId){
                        Vote vote = new Vote(responseBuffer.getLong(),
                            responseBuffer.getLong());
                        InetSocketAddress addr = (InetSocketAddress) responsePacket
                            .getSocketAddress();
                        votes.put(addr, vote);
                    //}
                } catch (IOException e) {
                    LOG.error("Error in looking for leader", e);
                    // Errors are okay, since hosts may be
                    // down
                    // ZooKeeperServer.logException(e);
                }
            }
            ElectionResult result = countVotes(votes, heardFrom);
            if (result.winner.id >= 0) {
                self.setCurrentVote(result.vote);
                if (result.winningCount > (self.quorumPeers.size() / 2)) {
                    self.setCurrentVote(result.winner);
                    s.close();
                    Vote current = self.getCurrentVote();
                    self.setPeerState((current.id == self.getId())
                            ? ServerState.LEADING: ServerState.FOLLOWING);
                    if (self.getPeerState() == ServerState.FOLLOWING) {
                        Thread.sleep(100);
                    }
View Full Code Here

                        proposedZxid = n.zxid;

                        sendNotifications();
                    }

                    recvset.put(n.addr, new Vote(n.leader, n.zxid));

                    // If have received from all nodes, then terminate
                    if (self.quorumPeers.size() == recvset.size()) {
                        self.setPeerState((proposedLeader == self.getId()) ?
                                ServerState.LEADING: ServerState.FOLLOWING);
                        // if (self.state == ServerState.FOLLOWING) {
                        // Thread.sleep(100);
                        // }
                        leaveInstance();
                        return new Vote(proposedLeader, proposedZxid);

                    } else if (termPredicate(recvset, proposedLeader,
                            proposedZxid)) {
                        // Otherwise, wait for a fixed amount of time
                        LOG.warn("Passed predicate");
                        Thread.sleep(finalizeWait);

                        // Notification probe = recvqueue.peek();

                        // Verify if there is any change in the proposed leader
                        while ((!recvqueue.isEmpty())
                                && !totalOrderPredicate(
                                        recvqueue.peek().leader, recvqueue
                                                .peek().zxid)) {
                            recvqueue.poll();
                        }
                        if (recvqueue.isEmpty()) {
                            // LOG.warn("Proposed leader: " +
                            // proposedLeader);
                            self.setPeerState((proposedLeader == self.getId()) ?
                                    ServerState.LEADING: ServerState.FOLLOWING);
                            // if (self.state == ServerState.FOLLOWING) {
                            // Thread.sleep(100);
                            // }

                            leaveInstance();
                            return new Vote(proposedLeader, proposedZxid);
                        }
                    }
                    break;
                case LEADING:
                    outofelection.put(n.addr, new Vote(n.leader, n.zxid));

                    if (termPredicate(outofelection, n.leader, n.zxid)) {

                        self.setPeerState((n.leader == self.getId()) ?
                                ServerState.LEADING: ServerState.FOLLOWING);

                        leaveInstance();
                        return new Vote(n.leader, n.zxid);
                    }
                    break;
                case FOLLOWING:
                    outofelection.put(n.addr, new Vote(n.leader, n.zxid));

                    if (termPredicate(outofelection, n.leader, n.zxid)) {

                        self.setPeerState((n.leader == self.getId()) ?
                                ServerState.LEADING: ServerState.FOLLOWING);

                        leaveInstance();
                        return new Vote(n.leader, n.zxid);
                    }
                    break;
                default:
                    break;
                }
View Full Code Here

                    case 2:
                        ackstate = QuorumPeer.ServerState.FOLLOWING;
                        break;
                    }

                    Vote current = self.getCurrentVote();

                    switch (type) {
                    case 0:
                        // Receive challenge request
                        ToSend c = new ToSend(ToSend.mType.challenge, tag,
View Full Code Here

TOP

Related Classes of org.apache.zookeeper.server.quorum.Vote

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.