Search in sources :

Example 36 with QuorumServer

use of org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer in project zookeeper by apache.

the class AuthFastLeaderElection method sendNotifications.

private void sendNotifications() {
    for (QuorumServer server : self.getView().values()) {
        ToSend notmsg = new ToSend(ToSend.mType.notification, AuthFastLeaderElection.sequencer++, proposedLeader, proposedZxid, logicalclock.get(), QuorumPeer.ServerState.LOOKING, self.getView().get(server.id).electionAddr);
        sendqueue.offer(notmsg);
    }
}
Also used : QuorumServer(org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer)

Example 37 with QuorumServer

use of org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer in project zookeeper by apache.

the class QuorumBase method setupServer.

public void setupServer(int i) throws IOException {
    int tickTime = 2000;
    int initLimit = 3;
    int syncLimit = 3;
    if (peers == null) {
        peers = new HashMap<Long, QuorumServer>();
        peers.put(Long.valueOf(1), new QuorumServer(1, new InetSocketAddress(LOCALADDR, port1), new InetSocketAddress(LOCALADDR, portLE1), new InetSocketAddress(LOCALADDR, portClient1), LearnerType.PARTICIPANT));
        peers.put(Long.valueOf(2), new QuorumServer(2, new InetSocketAddress(LOCALADDR, port2), new InetSocketAddress(LOCALADDR, portLE2), new InetSocketAddress(LOCALADDR, portClient2), LearnerType.PARTICIPANT));
        peers.put(Long.valueOf(3), new QuorumServer(3, new InetSocketAddress(LOCALADDR, port3), new InetSocketAddress(LOCALADDR, portLE3), new InetSocketAddress(LOCALADDR, portClient3), LearnerType.PARTICIPANT));
        peers.put(Long.valueOf(4), new QuorumServer(4, new InetSocketAddress(LOCALADDR, port4), new InetSocketAddress(LOCALADDR, portLE4), new InetSocketAddress(LOCALADDR, portClient4), LearnerType.PARTICIPANT));
        peers.put(Long.valueOf(5), new QuorumServer(5, new InetSocketAddress(LOCALADDR, port5), new InetSocketAddress(LOCALADDR, portLE5), new InetSocketAddress(LOCALADDR, portClient5), LearnerType.PARTICIPANT));
    }
    switch(i) {
        case 1:
            LOG.info("creating QuorumPeer 1 port " + portClient1);
            s1 = new QuorumPeer(peers, s1dir, s1dir, portClient1, 3, 1, tickTime, initLimit, syncLimit);
            Assert.assertEquals(portClient1, s1.getClientPort());
            break;
        case 2:
            LOG.info("creating QuorumPeer 2 port " + portClient2);
            s2 = new QuorumPeer(peers, s2dir, s2dir, portClient2, 3, 2, tickTime, initLimit, syncLimit);
            Assert.assertEquals(portClient2, s2.getClientPort());
            break;
        case 3:
            LOG.info("creating QuorumPeer 3 port " + portClient3);
            s3 = new QuorumPeer(peers, s3dir, s3dir, portClient3, 3, 3, tickTime, initLimit, syncLimit);
            Assert.assertEquals(portClient3, s3.getClientPort());
            break;
        case 4:
            LOG.info("creating QuorumPeer 4 port " + portClient4);
            s4 = new QuorumPeer(peers, s4dir, s4dir, portClient4, 3, 4, tickTime, initLimit, syncLimit);
            Assert.assertEquals(portClient4, s4.getClientPort());
            break;
        case 5:
            LOG.info("creating QuorumPeer 5 port " + portClient5);
            s5 = new QuorumPeer(peers, s5dir, s5dir, portClient5, 3, 5, tickTime, initLimit, syncLimit);
            Assert.assertEquals(portClient5, s5.getClientPort());
    }
}
Also used : QuorumServer(org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer) InetSocketAddress(java.net.InetSocketAddress) QuorumPeer(org.apache.zookeeper.server.quorum.QuorumPeer)

Example 38 with QuorumServer

use of org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer in project zookeeper by apache.

the class Observer method observeLeader.

/**
 * the main method called by the observer to observe the leader
 * @throws Exception
 */
void observeLeader() throws Exception {
    zk.registerJMX(new ObserverBean(this, zk), self.jmxLocalPeerBean);
    try {
        QuorumServer leaderServer = findLeader();
        LOG.info("Observing " + leaderServer.addr);
        try {
            connectToLeader(leaderServer.addr, leaderServer.hostname);
            long newLeaderZxid = registerWithLeader(Leader.OBSERVERINFO);
            if (self.isReconfigStateChange())
                throw new Exception("learned about role change");
            syncWithLeader(newLeaderZxid);
            QuorumPacket qp = new QuorumPacket();
            while (this.isRunning()) {
                readPacket(qp);
                processPacket(qp);
            }
        } catch (Exception e) {
            LOG.warn("Exception when observing the leader", e);
            try {
                sock.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
            // clear pending revalidations
            pendingRevalidations.clear();
        }
    } finally {
        zk.unregisterJMX(this);
    }
}
Also used : ObserverBean(org.apache.zookeeper.server.ObserverBean) QuorumServer(org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer) IOException(java.io.IOException) IOException(java.io.IOException)

Example 39 with QuorumServer

use of org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer in project zookeeper by apache.

the class QuorumPeerConfig method parseDynamicConfig.

/**
 * Parse dynamic configuration file and return
 * quorumVerifier for new configuration.
 * @param dynamicConfigProp Properties to parse from.
 * @throws IOException
 * @throws ConfigException
 */
public static QuorumVerifier parseDynamicConfig(Properties dynamicConfigProp, int eAlg, boolean warnings, boolean configBackwardCompatibilityMode) throws IOException, ConfigException {
    boolean isHierarchical = false;
    for (Entry<Object, Object> entry : dynamicConfigProp.entrySet()) {
        String key = entry.getKey().toString().trim();
        if (key.startsWith("group") || key.startsWith("weight")) {
            isHierarchical = true;
        } else if (!configBackwardCompatibilityMode && !key.startsWith("server.") && !key.equals("version")) {
            LOG.info(dynamicConfigProp.toString());
            throw new ConfigException("Unrecognised parameter: " + key);
        }
    }
    QuorumVerifier qv = createQuorumVerifier(dynamicConfigProp, isHierarchical);
    int numParticipators = qv.getVotingMembers().size();
    int numObservers = qv.getObservingMembers().size();
    if (numParticipators == 0) {
        if (!standaloneEnabled) {
            throw new IllegalArgumentException("standaloneEnabled = false then " + "number of participants should be >0");
        }
        if (numObservers > 0) {
            throw new IllegalArgumentException("Observers w/o participants is an invalid configuration");
        }
    } else if (numParticipators == 1 && standaloneEnabled) {
        // HBase currently adds a single server line to the config, for
        // b/w compatibility reasons we need to keep this here. If standaloneEnabled
        // is true, the QuorumPeerMain script will create a standalone server instead
        // of a quorum configuration
        LOG.error("Invalid configuration, only one server specified (ignoring)");
        if (numObservers > 0) {
            throw new IllegalArgumentException("Observers w/o quorum is an invalid configuration");
        }
    } else {
        if (warnings) {
            if (numParticipators <= 2) {
                LOG.warn("No server failure will be tolerated. " + "You need at least 3 servers.");
            } else if (numParticipators % 2 == 0) {
                LOG.warn("Non-optimial configuration, consider an odd number of servers.");
            }
        }
        for (QuorumServer s : qv.getVotingMembers().values()) {
            if (s.electionAddr == null)
                throw new IllegalArgumentException("Missing election port for server: " + s.id);
        }
    }
    return qv;
}
Also used : QuorumServer(org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer) QuorumVerifier(org.apache.zookeeper.server.quorum.flexible.QuorumVerifier)

Example 40 with QuorumServer

use of org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer in project zookeeper by apache.

the class QuorumBase method startServers.

void startServers(boolean withObservers) throws Exception {
    int tickTime = 2000;
    int initLimit = 3;
    int syncLimit = 3;
    Map<Long, QuorumServer> peers = new HashMap<Long, QuorumServer>();
    peers.put(Long.valueOf(1), new QuorumServer(1, new InetSocketAddress(LOCALADDR, port1), new InetSocketAddress(LOCALADDR, portLE1), new InetSocketAddress(LOCALADDR, portClient1), LearnerType.PARTICIPANT));
    peers.put(Long.valueOf(2), new QuorumServer(2, new InetSocketAddress(LOCALADDR, port2), new InetSocketAddress(LOCALADDR, portLE2), new InetSocketAddress(LOCALADDR, portClient2), LearnerType.PARTICIPANT));
    peers.put(Long.valueOf(3), new QuorumServer(3, new InetSocketAddress(LOCALADDR, port3), new InetSocketAddress(LOCALADDR, portLE3), new InetSocketAddress(LOCALADDR, portClient3), LearnerType.PARTICIPANT));
    peers.put(Long.valueOf(4), new QuorumServer(4, new InetSocketAddress(LOCALADDR, port4), new InetSocketAddress(LOCALADDR, portLE4), new InetSocketAddress(LOCALADDR, portClient4), LearnerType.PARTICIPANT));
    peers.put(Long.valueOf(5), new QuorumServer(5, new InetSocketAddress(LOCALADDR, port5), new InetSocketAddress(LOCALADDR, portLE5), new InetSocketAddress(LOCALADDR, portClient5), LearnerType.PARTICIPANT));
    if (withObservers) {
        peers.get(Long.valueOf(4)).type = LearnerType.OBSERVER;
        peers.get(Long.valueOf(5)).type = LearnerType.OBSERVER;
    }
    LOG.info("creating QuorumPeer 1 port " + portClient1);
    s1 = new QuorumPeer(peers, s1dir, s1dir, portClient1, 3, 1, tickTime, initLimit, syncLimit);
    Assert.assertEquals(portClient1, s1.getClientPort());
    LOG.info("creating QuorumPeer 2 port " + portClient2);
    s2 = new QuorumPeer(peers, s2dir, s2dir, portClient2, 3, 2, tickTime, initLimit, syncLimit);
    Assert.assertEquals(portClient2, s2.getClientPort());
    LOG.info("creating QuorumPeer 3 port " + portClient3);
    s3 = new QuorumPeer(peers, s3dir, s3dir, portClient3, 3, 3, tickTime, initLimit, syncLimit);
    Assert.assertEquals(portClient3, s3.getClientPort());
    LOG.info("creating QuorumPeer 4 port " + portClient4);
    s4 = new QuorumPeer(peers, s4dir, s4dir, portClient4, 3, 4, tickTime, initLimit, syncLimit);
    Assert.assertEquals(portClient4, s4.getClientPort());
    LOG.info("creating QuorumPeer 5 port " + portClient5);
    s5 = new QuorumPeer(peers, s5dir, s5dir, portClient5, 3, 5, tickTime, initLimit, syncLimit);
    Assert.assertEquals(portClient5, s5.getClientPort());
    if (withObservers) {
        s4.setLearnerType(LearnerType.OBSERVER);
        s5.setLearnerType(LearnerType.OBSERVER);
    }
    LOG.info("QuorumPeer 1 voting view: " + s1.getVotingView());
    LOG.info("QuorumPeer 2 voting view: " + s2.getVotingView());
    LOG.info("QuorumPeer 3 voting view: " + s3.getVotingView());
    LOG.info("QuorumPeer 4 voting view: " + s4.getVotingView());
    LOG.info("QuorumPeer 5 voting view: " + s5.getVotingView());
    s1.enableLocalSessions(localSessionsEnabled);
    s2.enableLocalSessions(localSessionsEnabled);
    s3.enableLocalSessions(localSessionsEnabled);
    s4.enableLocalSessions(localSessionsEnabled);
    s5.enableLocalSessions(localSessionsEnabled);
    s1.enableLocalSessionsUpgrading(localSessionsUpgradingEnabled);
    s2.enableLocalSessionsUpgrading(localSessionsUpgradingEnabled);
    s3.enableLocalSessionsUpgrading(localSessionsUpgradingEnabled);
    s4.enableLocalSessionsUpgrading(localSessionsUpgradingEnabled);
    s5.enableLocalSessionsUpgrading(localSessionsUpgradingEnabled);
    LOG.info("start QuorumPeer 1");
    s1.start();
    LOG.info("start QuorumPeer 2");
    s2.start();
    LOG.info("start QuorumPeer 3");
    s3.start();
    LOG.info("start QuorumPeer 4");
    s4.start();
    LOG.info("start QuorumPeer 5");
    s5.start();
    LOG.info("started QuorumPeer 5");
    LOG.info("Checking ports " + hostPort);
    for (String hp : hostPort.split(",")) {
        Assert.assertTrue("waiting for server up", ClientBase.waitForServerUp(hp, CONNECTION_TIMEOUT));
        LOG.info(hp + " is accepting client connections");
    }
    // interesting to see what's there...
    JMXEnv.dump();
    // make sure we have these 5 servers listed
    Set<String> ensureNames = new LinkedHashSet<String>();
    for (int i = 1; i <= 5; i++) {
        ensureNames.add("InMemoryDataTree");
    }
    for (int i = 1; i <= 5; i++) {
        ensureNames.add("name0=ReplicatedServer_id" + i + ",name1=replica." + i + ",name2=");
    }
    for (int i = 1; i <= 5; i++) {
        for (int j = 1; j <= 5; j++) {
            ensureNames.add("name0=ReplicatedServer_id" + i + ",name1=replica." + j);
        }
    }
    for (int i = 1; i <= 5; i++) {
        ensureNames.add("name0=ReplicatedServer_id" + i);
    }
    JMXEnv.ensureAll(ensureNames.toArray(new String[ensureNames.size()]));
}
Also used : LinkedHashSet(java.util.LinkedHashSet) HashMap(java.util.HashMap) QuorumServer(org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer) InetSocketAddress(java.net.InetSocketAddress) QuorumPeer(org.apache.zookeeper.server.quorum.QuorumPeer)

Aggregations

QuorumServer (org.apache.zookeeper.server.quorum.QuorumPeer.QuorumServer)45 InetSocketAddress (java.net.InetSocketAddress)24 Test (org.junit.Test)20 QuorumPeer (org.apache.zookeeper.server.quorum.QuorumPeer)19 IOException (java.io.IOException)10 HashMap (java.util.HashMap)9 File (java.io.File)7 ArrayList (java.util.ArrayList)5 Before (org.junit.Before)4 ServerSocket (java.net.ServerSocket)3 Socket (java.net.Socket)3 ByteBuffer (java.nio.ByteBuffer)3 KeeperException (org.apache.zookeeper.KeeperException)3 ZooKeeper (org.apache.zookeeper.ZooKeeper)3 Vote (org.apache.zookeeper.server.quorum.Vote)3 EOFException (java.io.EOFException)2 FileNotFoundException (java.io.FileNotFoundException)2 DatagramPacket (java.net.DatagramPacket)2 DatagramSocket (java.net.DatagramSocket)2 SocketException (java.net.SocketException)2