@Test
public void testLeaderInConnectingFollowers() throws Exception {
File tmpDir = File.createTempFile("test", "dir");
tmpDir.delete();
tmpDir.mkdir();
Leader leader = null;
try {
QuorumPeer peer = createQuorumPeer(tmpDir);
leader = createLeader(tmpDir, peer);
peer.leader = leader;
peer.setAcceptedEpoch(5);
FollowerMockThread f1 = new FollowerMockThread(1, leader, true);
FollowerMockThread f2 = new FollowerMockThread(2, leader, true);
f1.start();
f2.start();
// wait until followers time out in getEpochToPropose - they shouldn't return
// normally because the leader didn't execute getEpochToPropose and so its epoch was not
// accounted for
f1.join(leader.self.getInitLimit()*leader.self.getTickTime() + 5000);
f2.join(leader.self.getInitLimit()*leader.self.getTickTime() + 5000);
// even though followers timed out, their ids are in connectingFollowers, and their
// epoch were accounted for, so the leader should not block and since it started with
// accepted epoch = 5 it should now have 6
try {
long epoch = leader.getEpochToPropose(leader.self.getId(), leader.self.getAcceptedEpoch());
Assert.assertEquals("leader got wrong epoch from getEpochToPropose", 6, epoch);
} catch (Exception e){
Assert.fail("leader timed out in getEpochToPropose");
}
} finally {
recursiveDelete(tmpDir);
if (leader != null) {
leader.shutdown("end of test");
}
}
}