public static void shutdown(QuorumPeer qp) { if (qp == null) { return; } try { LOG.info("Shutting down quorum peer " + qp.getName()); qp.shutdown(); Election e = qp.getElectionAlg(); if (e != null) { LOG.info("Shutting down leader election " + qp.getName()); e.shutdown(); } else { LOG.info("No election available to shutdown " + qp.getName()); } LOG.info("Waiting for " + qp.getName() + " to exit thread"); long readTimeout = qp.getTickTime() * qp.getInitLimit(); long connectTimeout = qp.getTickTime() * qp.getSyncLimit(); long maxTimeout = Math.max(readTimeout, connectTimeout); maxTimeout = Math.max(maxTimeout, ClientBase.CONNECTION_TIMEOUT); qp.join(maxTimeout * 2); if (qp.isAlive()) { Assert.fail("QP failed to shutdown in " + (maxTimeout * 2) + " seconds: " + qp.getName()); } } catch (InterruptedException e) { LOG.debug("QP interrupted: " + qp.getName(), e); } }
private void startDistributed() throws IOException { logger.info("Starting Embedded ZooKeeper Peer"); try { transactionLog = new FileTxnSnapLog(new File(quorumPeerConfig.getDataLogDir()), new File(quorumPeerConfig.getDataDir())); connectionFactory = ServerCnxnFactory.createFactory(); connectionFactory.configure(quorumPeerConfig.getClientPortAddress(), quorumPeerConfig.getMaxClientCnxns()); quorumPeer = new QuorumPeer(); quorumPeer.setClientPortAddress(quorumPeerConfig.getClientPortAddress()); quorumPeer.setTxnFactory(new FileTxnSnapLog(new File(quorumPeerConfig.getDataLogDir()), new File(quorumPeerConfig.getDataDir()))); quorumPeer.setQuorumPeers(quorumPeerConfig.getServers()); quorumPeer.setElectionType(quorumPeerConfig.getElectionAlg()); quorumPeer.setMyid(quorumPeerConfig.getServerId()); quorumPeer.setTickTime(quorumPeerConfig.getTickTime()); quorumPeer.setMinSessionTimeout(quorumPeerConfig.getMinSessionTimeout()); quorumPeer.setMaxSessionTimeout(quorumPeerConfig.getMaxSessionTimeout()); quorumPeer.setInitLimit(quorumPeerConfig.getInitLimit()); quorumPeer.setSyncLimit(quorumPeerConfig.getSyncLimit()); quorumPeer.setQuorumVerifier(quorumPeerConfig.getQuorumVerifier()); quorumPeer.setCnxnFactory(connectionFactory); quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory())); quorumPeer.setLearnerType(quorumPeerConfig.getPeerType()); quorumPeer.setSyncEnabled(quorumPeerConfig.getSyncEnabled()); quorumPeer.setQuorumListenOnAllIPs(quorumPeerConfig.getQuorumListenOnAllIPs()); quorumPeer.start(); } catch (final IOException ioe) { throw new IOException("Failed to start embedded ZooKeeper Peer", ioe); } catch (final Exception e) { throw new RuntimeException("Failed to start embedded ZooKeeper Peer", e); } }
@Override public void run() { updateThreadName(); jmxQuorumBean = new QuorumBean(this); MBeanRegistry.getInstance().register(jmxQuorumBean, null); for(QuorumServer s: getView().values()){ ZKMBeanInfo p; if (getId() == s.id) { p = jmxLocalPeerBean = new LocalPeerBean(this); try { switch (getPeerState()) { case LOOKING: LOG.info("LOOKING"); try { roZkMgr.start(); reconfigFlagClear(); if (shuttingDownLE) { shuttingDownLE = false; startLeaderElection(); setCurrentVote(makeLEStrategy().lookForLeader()); } catch (Exception e) { LOG.warn("Unexpected exception", e); setPeerState(ServerState.LOOKING); } finally { reconfigFlagClear();
private boolean updateLearnerType(QuorumVerifier newQV) { //check if I'm an observer in new config if (newQV.getObservingMembers().containsKey(getId())) { if (getLearnerType()!=LearnerType.OBSERVER){ setLearnerType(LearnerType.OBSERVER); LOG.info("Becoming an observer"); reconfigFlagSet(); return true; } else { return false; } } else if (newQV.getVotingMembers().containsKey(getId())) { if (getLearnerType()!=LearnerType.PARTICIPANT){ setLearnerType(LearnerType.PARTICIPANT); LOG.info("Becoming a voting participant"); reconfigFlagSet(); return true; } else { return false; } } // I'm not in the view if (getLearnerType()!=LearnerType.PARTICIPANT){ setLearnerType(LearnerType.PARTICIPANT); LOG.info("Becoming a non-voting participant"); reconfigFlagSet(); return true; } return false; }
@Test public void testIsNotLeaderBecauseNoVote() throws Exception { long localPeerId = 7; QuorumPeer peer = new QuorumPeer(); peer.setId(localPeerId); peer.setCurrentVote(null); assertFalse(peer.isLeader(localPeerId)); }
public void start(int id) throws IOException { PeerStruct ps = getPeer(id); LOG.info("Creating QuorumPeer " + ps.id + "; public port " + ps.clientPort); ps.peer = new QuorumPeer(peersView, ps.dataDir, ps.dataDir, ps.clientPort, electionAlg, ps.id, tickTime, initLimit, syncLimit); if (localSessionEnabled) { ps.peer.enableLocalSessions(true); } Assert.assertEquals(ps.clientPort, ps.peer.getClientPort()); ps.peer.start(); }
quorumPeer.setRootMetricsContext(metricsProvider.getRootContext()); quorumPeer.setTxnFactory(new FileTxnSnapLog( config.getDataLogDir(), config.getDataDir())); quorumPeer.enableLocalSessions(config.areLocalSessionsEnabled()); quorumPeer.enableLocalSessionsUpgrading( config.isLocalSessionsUpgradingEnabled()); quorumPeer.setElectionType(config.getElectionAlg()); quorumPeer.setMyid(config.getServerId()); quorumPeer.setTickTime(config.getTickTime()); quorumPeer.setMinSessionTimeout(config.getMinSessionTimeout()); quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout()); quorumPeer.setInitLimit(config.getInitLimit()); quorumPeer.setSyncLimit(config.getSyncLimit()); quorumPeer.setObserverMasterPort(config.getObserverMasterPort()); quorumPeer.setConfigFileName(config.getConfigFilename()); quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory())); quorumPeer.setQuorumVerifier(config.getQuorumVerifier(), false); if (config.getLastSeenQuorumVerifier()!=null) { quorumPeer.setLastSeenQuorumVerifier(config.getLastSeenQuorumVerifier(), false); quorumPeer.initConfigInZKDatabase(); quorumPeer.setCnxnFactory(cnxnFactory); quorumPeer.setSecureCnxnFactory(secureCnxnFactory); quorumPeer.setSslQuorum(config.isSslQuorum()); quorumPeer.setUsePortUnification(config.shouldUsePortUnification()); quorumPeer.setLearnerType(config.getPeerType()); quorumPeer.setSyncEnabled(config.getSyncEnabled());
quorumPeer.setQuorumPeers(config.getServers()); quorumPeer.setTxnFactory(new FileTxnSnapLog( new File(config.getDataLogDir()), new File(config.getDataDir()))); quorumPeer.setElectionType(config.getElectionAlg()); quorumPeer.setMyid(config.getServerId()); quorumPeer.setTickTime(config.getTickTime()); quorumPeer.setInitLimit(config.getInitLimit()); quorumPeer.setSyncLimit(config.getSyncLimit()); quorumPeer.setQuorumListenOnAllIPs(config.getQuorumListenOnAllIPs()); quorumPeer.setCnxnFactory(cnxnFactory); quorumPeer.setQuorumVerifier(config.getQuorumVerifier()); quorumPeer.setClientPortAddress(config.getClientPortAddress()); quorumPeer.setMinSessionTimeout(config.getMinSessionTimeout()); quorumPeer.setMaxSessionTimeout(config.getMaxSessionTimeout()); quorumPeer.setZKDatabase(new ZKDatabase(quorumPeer.getTxnFactory())); quorumPeer.setLearnerType(config.getPeerType()); quorumPeer.setSyncEnabled(config.getSyncEnabled()); quorumPeer.setQuorumSaslEnabled(config.quorumEnableSasl); if(quorumPeer.isQuorumSaslAuthEnabled()){ quorumPeer.setQuorumServerSaslRequired(config.quorumServerRequireSasl); quorumPeer.setQuorumLearnerSaslRequired(config.quorumLearnerRequireSasl); quorumPeer.setQuorumServicePrincipal(config.quorumServicePrincipal); quorumPeer.setQuorumServerLoginContext(config.quorumServerLoginContext); quorumPeer.setQuorumLearnerLoginContext(config.quorumLearnerLoginContext); quorumPeer.setQuorumCnxnThreadsSize(config.quorumCnxnThreadsSize); quorumPeer.initialize();
self.setCurrentVote(new Vote(self.getId(), self.getLastLoggedZxid())); responseBytes.length); int xid = epochGen.nextInt(); while (self.isRunning()) { HashMap<InetSocketAddress, Vote> votes = new HashMap<InetSocketAddress, Vote>(self.getVotingView().size()); requestPacket.setLength(4); HashSet<Long> heardFrom = new HashSet<Long>(); for (QuorumServer server : self.getVotingView().values()) { LOG.info("Server address: " + server.addr); try { self.setCurrentVote(new Vote(self.getId(), self.getLastLoggedZxid())); } else { if (result.winner.getId() >= 0) { self.setCurrentVote(result.vote); 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()); if (self.getLearnerType() == LearnerType.OBSERVER) { if (current.getId() == self.getId()) {
cnxnFactory.configure(peerConfig.getClientPortAddress(), peerConfig.getMaxClientCnxns()); QuorumPeer quorumPeer = new QuorumPeer( peerConfig.getServers(), new File(peerConfig.getDataDir()), peerConfig.getQuorumVerifier() ); quorumPeer.setMinSessionTimeout(peerConfig.getMinSessionTimeout()); quorumPeer.setMaxSessionTimeout(peerConfig.getMaxSessionTimeout()); quorumPeer.setLearnerType(peerConfig.getPeerType()); if (saslConfigurationSuccessful) { quorumPeer.setQuorumSaslEnabled(peerConfig.isQuorumEnableSasl()); quorumPeer.setQuorumLearnerSaslRequired(peerConfig.isQuorumEnableSasl()); quorumPeer.setQuorumServerSaslRequired(peerConfig.isQuorumEnableSasl()); quorumPeer.initialize(peerSubject, peerCredentials); LOGGER.debug("Starting quorum peer \"{}\" on address {}", quorumPeer.getMyid(), peerConfig.getClientPortAddress()); quorumPeer.start(); LOGGER.debug("Started quorum peer \"{}\"", quorumPeer.getMyid()); } catch (Exception e) { LOGGER.warn("Failed to start quorum peer \"{}\", reason : {} ", quorumPeer.getMyid(), e.getMessage()); quorumPeer.shutdown(); throw e;
peer = new QuorumPeer(peers, tmpdir[sid], tmpdir[sid], port[sid], 3, sid, 2000, 2, 2); LOG.info("Starting peer " + peer.getId()); peer.start(); peerList.add(sid, peer); long leaderSid = peer.getCurrentVote().getId(); long zxid = peer.getCurrentVote().getZxid(); long electionEpoch = peer.getCurrentVote().getElectionEpoch(); ServerState state = peer.getCurrentVote().getState(); long peerEpoch = peer.getCurrentVote().getPeerEpoch(); Vote newVote = new Vote(leaderSid, zxid+100, electionEpoch+100, peerEpoch, state); peer.setCurrentVote(newVote); peer = new QuorumPeer(peers, tmpdir[2], tmpdir[2], port[2], 3, 2, 2000, 2, 2); LOG.info("Starting peer " + peer.getId()); peer.start(); peerList.add(sid, peer); v1 = new VerifyState(peer); v1.join(waitTime); if (v1.isAlive()) { Assert.fail("Peer " + peer.getId() + " failed to join the cluster " + "within " + waitTime + " ms"); peer = peerList.get(id); if (peer != null) { peer.shutdown();
try { for (int sid = 0; sid < 3; sid++) { QuorumPeer peer = new QuorumPeer(peers, peerTmpdir[sid], peerTmpdir[sid], peerClientPort[sid], 3, sid, 1000, 2, 2); LOG.info("Starting peer {}", peer.getId()); peer.start(); peerList.add(sid, peer); new Object[] { i, peer.getId() }); peer.shutdown(); peerList.remove(myid); failure = verifyThreadCount(peerList, 2); Assert.assertNull(failure, failure); peer = new QuorumPeer(peers, peerTmpdir[myid], peerTmpdir[myid], peerClientPort[myid], 3, myid, 1000, 2, 2); LOG.info("Round {}, restarting peer ", new Object[] { i, peer.getId() }); peer.start(); peerList.add(myid, peer); failure = verifyThreadCount(peerList, 4); quorumPeer.shutdown();
QuorumPeer peer = new QuorumPeer(peers, peerTmpdir[1], peerTmpdir[1], peerClientPort[1], 3, 1, 1000, 2, 2); QuorumCnxManager cnxManager = peer.createCnxnManager(); QuorumCnxManager.Listener listener = cnxManager.listener; if(listener != null){ int port = peers.get(peer.getId()).electionAddr.getPort(); LOG.info("Election port: " + port); LOG.info("Socket has been closed as expected"); peer.shutdown(); cnxManager.halt(); Assert.assertFalse(cnxManager.listener.isAlive());
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()); 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);
@Test(expected=IOException.class) public void connectionRetryTimeoutTest() throws Exception { Learner learner = new TimeoutLearner(); learner.self = new QuorumPeer(); learner.self.setTickTime(2000); learner.self.setInitLimit(5); learner.self.setSyncLimit(2); // this addr won't even be used since we fake the Socket.connect InetSocketAddress addr = new InetSocketAddress(1111); // we expect this to throw an IOException since we're faking socket connect errors every time learner.connectToLeader(addr, ""); } @Test
if (quorumPeer.getPeerState() == ServerState.LEADING) { leader = quorumPeer; break; leader.shutdown(); FileTxnSnapLog snapLog = leader.getTxnFactory(); File snapDir= snapLog.getSnapDir(); qb.setupServers(); if (leaderSid != 1)qb.s1.start(); else leader = qb.s1; if (leaderSid != 2)qb.s2.start(); else leader = qb.s2; if (leaderSid != 3)qb.s3.start(); else leader = qb.s3; if (leaderSid != 4)qb.s4.start(); else leader = qb.s4; if (leaderSid != 5)qb.s5.start(); else leader = qb.s5; leader.start(); Assert.assertTrue(false); } catch(RuntimeException re) {
InetSocketAddress oldClientAddr = getClientAddress(); QuorumVerifier prevQV = setQuorumVerifier(qv, true); initConfigInZKDatabase(); updateRemotePeerMXBeans(newMembers); if (restartLE) restartLeaderElection(prevQV, qv); QuorumServer myNewQS = newMembers.get(getId()); if (myNewQS != null && myNewQS.clientAddr != null && !myNewQS.clientAddr.equals(oldClientAddr)) { cnxnFactory.reconfigure(myNewQS.clientAddr); updateThreadName(); boolean roleChange = updateLearnerType(qv); boolean leaderChange = false; if (suggestedLeaderId != null) { leaderChange = updateVote(suggestedLeaderId, zxid); } else { long currentLeaderId = getCurrentVote().getId(); QuorumServer myleaderInCurQV = prevQV.getVotingMembers().get(currentLeaderId); QuorumServer myleaderInNewQV = qv.getVotingMembers().get(currentLeaderId); reconfigFlagClear();
Vote v = null; while(true) { peer.setPeerState(ServerState.LOOKING); LOG.info("Going to call leader election again."); v = peer.getElectionAlg().lookForLeader(); if(v == null){ LOG.info("Thread " + i + " got a null vote"); peer.setCurrentVote(v); LOG.info("First peer, shutting it down"); QuorumBase.shutdown(peer); ((FastLeaderElection) restartThreads.get(i).peer.getElectionAlg()).shutdown(); peer = new QuorumPeer(peers, tmpdir[i], tmpdir[i], port[i], 3, i, 1000, 2, 2); peer.startLeaderElection(); peerRound++; } else {
public void shutdown(int id) { QuorumPeer qp = getPeer(id).peer; try { LOG.info("Shutting down quorum peer " + qp.getName()); qp.shutdown(); Election e = qp.getElectionAlg(); if (e != null) { LOG.info("Shutting down leader election " + qp.getName()); e.shutdown(); } else { LOG.info("No election available to shutdown " + qp.getName()); } LOG.info("Waiting for " + qp.getName() + " to exit thread"); qp.join(30000); if (qp.isAlive()) { Assert.fail("QP failed to shutdown in 30 seconds: " + qp.getName()); } } catch (InterruptedException e) { LOG.debug("QP interrupted: " + qp.getName(), e); } }
/** {@inheritDoc} */ @Override public void close() throws IOException { if (quorumPeer != null) quorumPeer.shutdown(); }