private static CustomQuorumPeer getCustomQuorumPeer(MainThread mt) { while (true) { QuorumPeer quorumPeer = mt.getQuorumPeer(); if (null != quorumPeer) { return (CustomQuorumPeer) quorumPeer; } else { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } } } }
private void verifyQuorumMembers(QuorumPeerTestBase.MainThread mt, Set<String> expectedConfigs) { Map<Long, QuorumPeer.QuorumServer> members = mt.getQuorumPeer().getQuorumVerifier().getAllMembers(); Assert.assertTrue("Quorum member should not change.", members.size() == expectedConfigs.size()); for (QuorumPeer.QuorumServer qs : members.values()) { String actualConfig = qs.toString(); Assert.assertTrue("Unexpected config " + actualConfig + " found!", expectedConfigs.contains(actualConfig)); } } }
final long zxid = q1.getQuorumPeer().getLastLoggedZxid(); int followerPort = q1.getQuorumPeer().leader == null ? CLIENT_PORT_QP1 : CLIENT_PORT_QP2; ZooKeeper fZk = new ZooKeeper("127.0.0.1:" + followerPort, ClientBase.CONNECTION_TIMEOUT, this);
Map<String, Object> stats = Commands.runCommand("mntr", q3.getQuorumPeer().getActiveServer(), emptyMap).toMap(); Assert.assertTrue("observer not emitting observer_master_id", stats.containsKey("observer_master_id")); stats = Commands.runCommand("mntr", q1.getQuorumPeer().getActiveServer(), emptyMap).toMap(); if (testObserverMaster) { if (q1.getQuorumPeer().leader == null) { Assert.assertEquals(1, stats.get("synced_observers")); } else { if (q1.getQuorumPeer().leader == null) { Assert.assertNull(stats.get("synced_observers")); } else { stats = Commands.runCommand("mntr", q2.getQuorumPeer().getActiveServer(), emptyMap).toMap(); if (testObserverMaster) { if (q2.getQuorumPeer().leader == null) { Assert.assertEquals(1, stats.get("synced_observers")); } else { if (q2.getQuorumPeer().leader == null) { Assert.assertNull(stats.get("synced_observers")); } else { for (ObjectName bean : JMXEnv.conn().queryNames(new ObjectName(CommonNames.DOMAIN + ":*"), null)) { if (bean.getCanonicalName().contains("Learner_Connections") && bean.getCanonicalName().contains("id:" + q3.getQuorumPeer().getId())) { connBean = bean; break;
MainThread leader; MainThread follower; if (q1.getQuorumPeer().leader != null) { leaderPort = CLIENT_PORT_QP1; leader = q1; follower = q2; } else if (q2.getQuorumPeer().leader != null) { leaderPort = CLIENT_PORT_QP2; leader = q2; final long lastLoggedZxid = leader.getQuorumPeer().getLastLoggedZxid(); FollowerZooKeeperServer followerZooKeeperServer = (FollowerZooKeeperServer) follower.getQuorumPeer().getActiveServer(); delayRequestProcessor = DelayRequestProcessor.injectDelayRequestProcessor(followerZooKeeperServer); CreateMode.PERSISTENT); LOG.info("observer zxid " + Long.toHexString(q3.getQuorumPeer().getLastLoggedZxid()) + (testObserverMaster ? "" : " observer master zxid " + Long.toHexString(follower.getQuorumPeer().getLastLoggedZxid())) + " leader zxid " + Long.toHexString(leader.getQuorumPeer().getLastLoggedZxid())); ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_OBS, CONNECTION_TIMEOUT)); Assert.assertNotNull("Leader switched", leader.getQuorumPeer().leader);
int masterPort = q3.getQuorumPeer().observer.getSocket().getPort(); LOG.info("port " + masterPort + " " + OM_PORT); Assert.assertEquals("observer failed to connect to observer master", masterPort, OM_PORT); int leaderProxyPort = PortAssignment.unique(); int obsProxyPort = PortAssignment.unique(); int leaderPort = q1.getQuorumPeer().leader == null ? CLIENT_PORT_QP2 : CLIENT_PORT_QP1; PortForwarder leaderPF = new PortForwarder(leaderProxyPort, leaderPort);
long nonLeaderOMPort = s1.getQuorumPeer().leader == null ? omPort1 : omPort2; int observerClientPort = PortAssignment.unique();
Assert.assertTrue(svrs.mt[0].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.LOOKING); Assert.assertTrue(svrs.mt[highestServerIndex].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.LEADING); for (int i = 1; i < highestServerIndex; i++) { Assert.assertTrue(svrs.mt[i].getQuorumPeer().getPeerState() == QuorumPeer.ServerState.FOLLOWING);
@Test(timeout = 60000) // Verify no zoo.cfg.dynamic and zoo.cfg.bak files existing locally // when reconfig feature flag is off by default. public void testNoLocalDynamicConfigAndBackupFiles() throws InterruptedException, IOException { int serverCount = 3; String config = generateNewQuorumConfig(serverCount); QuorumPeerTestBase.MainThread mt[] = new QuorumPeerTestBase.MainThread[serverCount]; String[] staticFileContent = new String[serverCount]; for (int i = 0; i < serverCount; i++) { mt[i] = new QuorumPeerTestBase.MainThread(i, clientPorts.get(i), config, false); mt[i].start(); } for (int i = 0; i < serverCount; i++) { Assert.assertTrue("waiting for server " + i + " being up", ClientBase.waitForServerUp("127.0.0.1:" + clientPorts.get(i), CONNECTION_TIMEOUT)); Assert.assertNull("static file backup (zoo.cfg.bak) shouldn't exist!", mt[i].getFileByName(ZOO_CFG_BAK_FILE)); Assert.assertNull("dynamic configuration file (zoo.cfg.dynamic.*) shouldn't exist!", mt[i].getFileByName(mt[i].getQuorumPeer().getNextDynamicConfigFilename())); staticFileContent[i] = Files.readAllLines(mt[i].confFile.toPath(), StandardCharsets.UTF_8).toString(); Assert.assertTrue("static config file should contain server entry " + serverAddress.get(i), staticFileContent[i].contains(serverAddress.get(i))); } for (int i = 0; i < serverCount; i++) { mt[i].shutdown(); } }
@Test public void testRevalidation() throws Exception { setUp(-1); q3.start(); Assert.assertTrue("waiting for server 3 being up", ClientBase.waitForServerUp("127.0.0.1:" + CLIENT_PORT_OBS, CONNECTION_TIMEOUT)); final int leaderProxyPort = PortAssignment.unique(); final int obsProxyPort = PortAssignment.unique(); int leaderPort = q1.getQuorumPeer().leader == null ? CLIENT_PORT_QP2 : CLIENT_PORT_QP1; PortForwarder leaderPF = new PortForwarder(leaderProxyPort, leaderPort); latch = new CountDownLatch(1); zk = new ZooKeeper(String.format("127.0.0.1:%d,127.0.0.1:%d", leaderProxyPort, obsProxyPort), ClientBase.CONNECTION_TIMEOUT, this); latch.await(); zk.create("/revalidtest", "test".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); Assert.assertNotNull("Read-after write failed", zk.exists("/revalidtest", null)); latch = new CountDownLatch(2); PortForwarder obsPF = new PortForwarder(obsProxyPort, CLIENT_PORT_OBS); try { leaderPF.shutdown(); } catch (Exception e) { // ignore? } latch.await(); Assert.assertEquals(new String(zk.getData("/revalidtest", null, null)), "test"); obsPF.shutdown(); shutdown(); }
private QuorumPeer waitForQuorumPeer(MainThread mainThread, int timeout) throws TimeoutException { long start = Time.currentElapsedTime(); while (true) { QuorumPeer quorumPeer = mainThread.isAlive() ? mainThread.getQuorumPeer() : null; if (quorumPeer != null) { return quorumPeer; } if (Time.currentElapsedTime() > start + timeout) { LOG.error("Timed out while waiting for QuorumPeer"); throw new TimeoutException(); } try { Thread.sleep(250); } catch (InterruptedException e) { // ignore } } }
public boolean evaluate() { return zxid == q3.getQuorumPeer().getLastLoggedZxid(); } }, 30);
public boolean evaluate() { return lastLoggedZxid == q3.getQuorumPeer().getLastLoggedZxid(); } }, 30);
private void shutdownFollowers(MainThread[] mt) { for (int i = 0; i < mt.length; i++) { CustomQuorumPeer quorumPeer = (CustomQuorumPeer) mt[i].getQuorumPeer(); if (quorumPeer != null && ServerState.FOLLOWING == quorumPeer.getPeerState()) { quorumPeer.setStopPing(true); } } }
private QuorumPeer getByServerState(MainThread[] mt, ServerState state) { for (int i = mt.length - 1; i >= 0; i--) { QuorumPeer quorumPeer = mt[i].getQuorumPeer(); if (null != quorumPeer && state == quorumPeer.getPeerState()) { return quorumPeer; } } return null; }
private QuorumPeer getLeader(MainThread[] mt) { for (int i = mt.length - 1; i >= 0; i--) { QuorumPeer quorumPeer = mt[i].getQuorumPeer(); if (quorumPeer != null && ServerState.LEADING == quorumPeer.getPeerState()) { return quorumPeer; } } return null; }
private QuorumPeer getLeaderQuorumPeer(MainThread[] mt) { for (int i = mt.length - 1; i >= 0; i--) { QuorumPeer quorumPeer = mt[i].getQuorumPeer(); if (null != quorumPeer && ServerState.LEADING == quorumPeer.getPeerState()) { return quorumPeer; } } return null; }