import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+
import com.google.common.base.Stopwatch;
import com.google.common.util.concurrent.Uninterruptibles;
import java.util.concurrent.TimeUnit;
context.setConfigParams(configParams);
FollowerLogInformation followerLogInformation =
- new FollowerLogInformationImpl("follower1", 9, context);
+ new FollowerLogInformationImpl(new PeerInfo("follower1", null, VotingState.VOTING), 9, context);
assertFalse("Follower should be termed inactive before stopwatch starts",
- followerLogInformation.isFollowerActive());
+ followerLogInformation.isFollowerActive());
followerLogInformation.markFollowerActive();
if (sleepWithElaspsedTimeReturned(200) > 200) {
- return;
+ return;
}
assertTrue("Follower should be active", followerLogInformation.isFollowerActive());
return;
}
assertFalse("Follower should be inactive after time lapsed",
- followerLogInformation.isFollowerActive());
+ followerLogInformation.isFollowerActive());
followerLogInformation.markFollowerActive();
assertTrue("Follower should be active from inactive",
- followerLogInformation.isFollowerActive());
+ followerLogInformation.isFollowerActive());
}
// we cannot rely comfortably that the sleep will indeed sleep for the desired time
// hence getting the actual elapsed time and do a match.
// if the sleep has spilled over, then return the test gracefully
- private long sleepWithElaspsedTimeReturned(long millis) {
+ private static long sleepWithElaspsedTimeReturned(long millis) {
Stopwatch stopwatch = Stopwatch.createStarted();
Uninterruptibles.sleepUninterruptibly(millis, TimeUnit.MILLISECONDS);
stopwatch.stop();
}
@Test
- public void testOkToReplicate(){
+ public void testOkToReplicate() {
MockRaftActorContext context = new MockRaftActorContext();
- context.setCommitIndex(9);
+ context.setCommitIndex(0);
FollowerLogInformation followerLogInformation =
- new FollowerLogInformationImpl(
- "follower1", 10, context);
+ new FollowerLogInformationImpl(new PeerInfo("follower1", null, VotingState.VOTING), 10, context);
assertTrue(followerLogInformation.okToReplicate());
assertFalse(followerLogInformation.okToReplicate());
followerLogInformation.incrNextIndex();
assertTrue(followerLogInformation.okToReplicate());
}
+
+ @Test
+ public void testVotingNotInitializedState() {
+ final PeerInfo peerInfo = new PeerInfo("follower1", null, VotingState.VOTING_NOT_INITIALIZED);
+ MockRaftActorContext context = new MockRaftActorContext();
+ context.setCommitIndex(0);
+ FollowerLogInformation followerLogInformation = new FollowerLogInformationImpl(peerInfo, -1, context);
+
+ assertFalse(followerLogInformation.okToReplicate());
+
+ followerLogInformation.markFollowerActive();
+ assertFalse(followerLogInformation.isFollowerActive());
+
+ peerInfo.setVotingState(VotingState.VOTING);
+ assertTrue(followerLogInformation.okToReplicate());
+
+ followerLogInformation.markFollowerActive();
+ assertTrue(followerLogInformation.isFollowerActive());
+ }
+
+ @Test
+ public void testNonVotingState() {
+ final PeerInfo peerInfo = new PeerInfo("follower1", null, VotingState.NON_VOTING);
+ MockRaftActorContext context = new MockRaftActorContext();
+ context.setCommitIndex(0);
+ FollowerLogInformation followerLogInformation = new FollowerLogInformationImpl(peerInfo, -1, context);
+
+ assertTrue(followerLogInformation.okToReplicate());
+
+ followerLogInformation.markFollowerActive();
+ assertTrue(followerLogInformation.isFollowerActive());
+ }
}