Github user anmolnar commented on a diff in the pull request: https://github.com/apache/zookeeper/pull/659#discussion_r224197413 --- Diff: zookeeper-server/src/test/java/org/apache/zookeeper/server/quorum/QuorumPeerTestBase.java --- @@ -402,4 +421,129 @@ public File getConfFile() { } } + + // This class holds the servers and clients for those servers + protected static class Servers { + MainThread mt[]; + ZooKeeper zk[]; + int[] clientPorts; + + public void shutDownAllServers() throws InterruptedException { + for (MainThread t: mt) { + t.shutdown(); + } + } + + public void restartAllServersAndClients(Watcher watcher) throws IOException, InterruptedException { + for (MainThread t : mt) { + if (!t.isAlive()) { + t.start(); + } + } + for (int i = 0; i < zk.length; i++) { + restartClient(i, watcher); + } + } + + public void restartClient(int clientIndex, Watcher watcher) throws IOException, InterruptedException { + if (zk[clientIndex] != null) { + zk[clientIndex].close(); + } + zk[clientIndex] = new ZooKeeper("127.0.0.1:" + clientPorts[clientIndex], ClientBase.CONNECTION_TIMEOUT, watcher); + } + + public int findLeader() { + for (int i = 0; i < mt.length; i++) { + if (mt[i].main.quorumPeer.leader != null) { + return i; + } + } + return -1; + } + } + + protected Servers LaunchServers(int numServers) throws IOException, InterruptedException { + return LaunchServers(numServers, null); + } + + /** * This is a helper function for launching a set of servers + * + * @param numServers the number of servers + * @param tickTime A ticktime to pass to MainThread + * @return + * @throws IOException + * @throws InterruptedException + */ + protected Servers LaunchServers(int numServers, Integer tickTime) throws IOException, InterruptedException { + int SERVER_COUNT = numServers; + QuorumPeerMainTest.Servers svrs = new QuorumPeerMainTest.Servers(); + svrs.clientPorts = new int[SERVER_COUNT]; + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < SERVER_COUNT; i++) { + svrs.clientPorts[i] = PortAssignment.unique(); + sb.append("server."+i+"=127.0.0.1:"+PortAssignment.unique()+":"+PortAssignment.unique()+";"+svrs.clientPorts[i]+"\n"); + } + String quorumCfgSection = sb.toString(); + + svrs.mt = new MainThread[SERVER_COUNT]; + svrs.zk = new ZooKeeper[SERVER_COUNT]; + for(int i = 0; i < SERVER_COUNT; i++) { + if (tickTime != null) { + svrs.mt[i] = new MainThread(i, svrs.clientPorts[i], quorumCfgSection, new HashMap<String, String>(), tickTime); + } else { + svrs.mt[i] = new MainThread(i, svrs.clientPorts[i], quorumCfgSection); + } + svrs.mt[i].start(); + svrs.restartClient(i, this); + } + + waitForAll(svrs, ZooKeeper.States.CONNECTED); + + return svrs; + } + + public static void waitForOne(ZooKeeper zk, ZooKeeper.States state) throws InterruptedException { + int iterations = ClientBase.CONNECTION_TIMEOUT / 500; + while (zk.getState() != state) { + if (iterations-- == 0) { + throw new RuntimeException("Waiting too long " + zk.getState() + " != " + state); + } + Thread.sleep(500); + } + } + + protected void waitForAll(Servers servers, ZooKeeper.States state) throws InterruptedException { --- End diff -- I don't dare triggering another build. :)
---