use of com.hazelcast.cp.internal.raft.impl.persistence.RestoredRaftState in project hazelcast by hazelcast.
the class PersistenceTest method when_followerIsRestarted_then_itAppliesPreviouslyCommittedMemberList.
@Test
public void when_followerIsRestarted_then_itAppliesPreviouslyCommittedMemberList() throws ExecutionException, InterruptedException {
RaftAlgorithmConfig config = new RaftAlgorithmConfig().setLeaderHeartbeatPeriodInMillis(SECONDS.toMillis(30));
group = new LocalRaftGroupBuilder(3, config).setAppendNopEntryOnLeaderElection(true).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
final RaftNodeImpl leader = group.waitUntilLeaderElected();
RaftNodeImpl[] followers = group.getNodesExcept(leader.getLocalMember());
RaftNodeImpl removedFollower = followers[0];
RaftNodeImpl terminatedFollower = followers[1];
group.terminateNode(removedFollower.getLocalMember());
leader.replicate(new ApplyRaftRunnable("val")).get();
leader.replicateMembershipChange(removedFollower.getLocalMember(), REMOVE).get();
RaftEndpoint terminatedEndpoint = terminatedFollower.getLocalMember();
InMemoryRaftStateStore stateStore = getRaftStateStore(terminatedFollower);
RestoredRaftState terminatedState = stateStore.toRestoredRaftState();
group.terminateNode(terminatedEndpoint);
final RaftNodeImpl restartedNode = group.createNewRaftNode(terminatedState, stateStore);
assertTrueEventually(() -> {
assertEquals(getCommitIndex(leader), getCommitIndex(restartedNode));
assertEquals(getLastApplied(leader), getLastApplied(restartedNode));
assertEquals(new ArrayList<>(getCommittedGroupMembers(leader).members()), new ArrayList<>(getCommittedGroupMembers(restartedNode).members()));
assertEquals(new ArrayList<>(getLastGroupMembers(leader).members()), new ArrayList<>(getLastGroupMembers(restartedNode).members()));
});
}
use of com.hazelcast.cp.internal.raft.impl.persistence.RestoredRaftState in project hazelcast by hazelcast.
the class PersistenceTest method testUncommittedEntriesArePersisted.
@Test
public void testUncommittedEntriesArePersisted() {
group = new LocalRaftGroupBuilder(3).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
final RaftNodeImpl leader = group.waitUntilLeaderElected();
RaftNodeImpl[] followers = group.getNodesExcept(leader.getLocalMember());
final RaftNodeImpl responsiveFollower = followers[0];
for (int i = 1; i < followers.length; i++) {
group.dropMessagesToMember(leader.getLocalMember(), followers[i].getLocalMember(), AppendRequest.class);
}
final int count = 10;
for (int i = 0; i < count; i++) {
leader.replicate(new ApplyRaftRunnable("val" + i));
}
assertTrueEventually(() -> {
for (RaftNodeImpl node : Arrays.asList(leader, responsiveFollower)) {
RestoredRaftState restoredState = getRestoredState(node);
LogEntry[] entries = restoredState.entries();
assertEquals(count, entries.length);
for (int i = 0; i < count; i++) {
LogEntry entry = entries[i];
assertEquals(i + 1, entry.index());
assertEquals("val" + i, ((ApplyRaftRunnable) entry.operation()).getVal());
}
}
});
}
use of com.hazelcast.cp.internal.raft.impl.persistence.RestoredRaftState in project hazelcast by hazelcast.
the class PersistenceTest method testTermAndVoteArePersisted.
@Test
public void testTermAndVoteArePersisted() {
group = new LocalRaftGroupBuilder(3).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
final RaftNodeImpl leader = group.waitUntilLeaderElected();
final RaftNodeImpl[] followers = group.getNodesExcept(leader.getLocalMember());
final Set<RaftEndpoint> endpoints = new HashSet<RaftEndpoint>();
for (RaftNodeImpl node : group.getNodes()) {
endpoints.add(node.getLocalMember());
}
final int term1 = getTerm(leader);
assertTrueEventually(() -> {
for (RaftNodeImpl node : group.getNodes()) {
RestoredRaftState restoredState = getRestoredState(node);
assertEquals(node.getLocalMember(), restoredState.localEndpoint());
assertEquals(term1, restoredState.term());
assertEquals(endpoints, restoredState.initialMembers());
}
});
group.terminateNode(leader.getLocalMember());
assertTrueEventually(() -> {
for (RaftNodeImpl node : followers) {
RaftEndpoint l = node.getLeader();
assertNotNull(l);
assertNotEquals(leader.getLeader(), l);
}
});
final RaftNodeImpl newLeader = group.waitUntilLeaderElected();
final int term2 = getTerm(newLeader);
assertTrueEventually(() -> {
for (RaftNodeImpl node : followers) {
RestoredRaftState restoredState = getRestoredState(node);
assertEquals(term2, restoredState.term());
assertEquals(newLeader.getLocalMember(), restoredState.votedFor());
}
});
}
use of com.hazelcast.cp.internal.raft.impl.persistence.RestoredRaftState in project hazelcast by hazelcast.
the class PersistenceTest method when_leaderIsRestarted_then_itRestoresItsRaftStateWithSnapshotAndBecomesLeader.
@Test
public void when_leaderIsRestarted_then_itRestoresItsRaftStateWithSnapshotAndBecomesLeader() throws ExecutionException, InterruptedException {
final int committedEntryCountToSnapshot = 50;
RaftAlgorithmConfig config = new RaftAlgorithmConfig().setCommitIndexAdvanceCountToSnapshot(committedEntryCountToSnapshot);
group = new LocalRaftGroupBuilder(3, config).setAppendNopEntryOnLeaderElection(true).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
RaftNodeImpl leader = group.waitUntilLeaderElected();
for (int i = 0; i <= committedEntryCountToSnapshot; i++) {
leader.replicate(new ApplyRaftRunnable("val" + i)).get();
}
assertTrue(getSnapshotEntry(leader).index() > 0);
final int term = getTerm(leader);
final long commitIndex = getCommitIndex(leader);
RaftEndpoint terminatedEndpoint = leader.getLocalMember();
InMemoryRaftStateStore stateStore = getRaftStateStore(leader);
RestoredRaftState terminatedState = stateStore.toRestoredRaftState();
// Block voting between followers
// to avoid a leader election before leader restarts.
blockVotingBetweenFollowers();
group.terminateNode(terminatedEndpoint);
RaftNodeImpl restartedNode = group.createNewRaftNode(terminatedState, stateStore);
RaftNodeImpl newLeader = group.waitUntilLeaderElected();
assertSame(restartedNode, newLeader);
assertTrueEventually(() -> {
assertTrue(getTerm(restartedNode) > term);
assertEquals(commitIndex + 1, getCommitIndex(restartedNode));
RaftDataService service = group.getService(restartedNode);
Object[] values = service.valuesArray();
assertThat(values, arrayWithSize(committedEntryCountToSnapshot + 1));
for (int i = 0; i <= committedEntryCountToSnapshot; i++) {
assertEquals("val" + i, values[i]);
}
});
}
use of com.hazelcast.cp.internal.raft.impl.persistence.RestoredRaftState in project hazelcast by hazelcast.
the class PersistenceTest method when_leaderIsRestarted_then_itBecomesLeaderAndAppliesPreviouslyCommittedMemberList.
@Test
public void when_leaderIsRestarted_then_itBecomesLeaderAndAppliesPreviouslyCommittedMemberList() throws ExecutionException, InterruptedException {
group = new LocalRaftGroupBuilder(3).setAppendNopEntryOnLeaderElection(true).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
RaftNodeImpl leader = group.waitUntilLeaderElected();
RaftNodeImpl[] followers = group.getNodesExcept(leader.getLocalMember());
RaftNodeImpl removedFollower = followers[0];
RaftNodeImpl runningFollower = followers[1];
group.terminateNode(removedFollower.getLocalMember());
leader.replicate(new ApplyRaftRunnable("val")).get();
leader.replicateMembershipChange(removedFollower.getLocalMember(), REMOVE).get();
RaftEndpoint terminatedEndpoint = leader.getLocalMember();
InMemoryRaftStateStore stateStore = getRaftStateStore(leader);
RestoredRaftState terminatedState = stateStore.toRestoredRaftState();
// Block voting between followers
// to avoid a leader election before leader restarts.
blockVotingBetweenFollowers();
group.terminateNode(terminatedEndpoint);
RaftNodeImpl restartedNode = group.createNewRaftNode(terminatedState, stateStore);
RaftNodeImpl newLeader = group.waitUntilLeaderElected();
assertSame(restartedNode, newLeader);
assertTrueEventually(() -> {
assertEquals(getCommitIndex(runningFollower), getCommitIndex(restartedNode));
assertEquals(new ArrayList<>(getCommittedGroupMembers(runningFollower).members()), new ArrayList<>(getCommittedGroupMembers(restartedNode).members()));
assertEquals(new ArrayList<>(getLastGroupMembers(runningFollower).members()), new ArrayList<>(getLastGroupMembers(restartedNode).members()));
});
}
Aggregations