public void testLE() throws Exception { int count = 30; HashMap<Long, QuorumServer> peers = new HashMap<Long, QuorumServer>(count); ArrayList<LEThread> threads = new ArrayList<LEThread>(count); File tmpdir[] = new File[count]; int port[] = new int[count]; votes = new Vote[count]; for (int i = 0; i < count; i++) { peers.put( Long.valueOf(i), new QuorumServer(i, new InetSocketAddress("127.0.0.1", PortAssignment.unique()))); tmpdir[i] = ClientBase.createTmpDir(); port[i] = PortAssignment.unique(); } LeaderElection le[] = new LeaderElection[count]; leaderDies = true; boolean allowOneBadLeader = leaderDies; for (int i = 0; i < le.length; i++) { QuorumPeer peer = new QuorumPeer(peers, tmpdir[i], tmpdir[i], port[i], 0, i, 1000, 2, 2); peer.startLeaderElection(); le[i] = new LeaderElection(peer); LEThread thread = new LEThread(le[i], peer, i); thread.start(); threads.add(thread); } for (int i = 0; i < threads.size(); i++) { threads.get(i).join(15000); if (threads.get(i).isAlive()) { fail("Threads didn't join"); } } long id = votes[0].id; for (int i = 1; i < votes.length; i++) { if (votes[i] == null) { fail("Thread " + i + " had a null vote"); } if (votes[i].id != id) { if (allowOneBadLeader && votes[i].id == i) { allowOneBadLeader = false; } else { fail("Thread " + i + " got " + votes[i].id + " expected " + id); } } } }
@Test public void testLENewEpoch() throws Exception { FastLeaderElection le[] = new FastLeaderElection[count]; LOG.info("TestLE: " + getName() + ", " + count); for (int i = 0; i < count; i++) { peers.put( Long.valueOf(i), new QuorumServer( i, new InetSocketAddress(baseport + 100 + i), new InetSocketAddress(baseLEport + 100 + i))); tmpdir[i] = File.createTempFile("letest", "test"); port[i] = baseport + i; } for (int i = 1; i < le.length; i++) { QuorumPeer peer = new QuorumPeer(peers, tmpdir[i], tmpdir[i], port[i], 3, i, 2, 2, 2); peer.startLeaderElection(); LEThread thread = new LEThread(peer, i); thread.start(); threads.add(thread); } Thread.sleep(2000); QuorumPeer peer = new QuorumPeer(peers, tmpdir[0], tmpdir[0], port[0], 3, 0, 2, 2, 2); peer.startLeaderElection(); LEThread thread = new LEThread(peer, 0); thread.start(); threads.add(thread); LOG.info("Started threads " + getName()); for (int i = 0; i < threads.size(); i++) { threads.get(i).join(10000); if (threads.get(i).isAlive()) { fail("Threads didn't join"); } } }