use of com.hazelcast.cp.internal.raft.impl.dataservice.ApplyRaftRunnable in project hazelcast by hazelcast.
the class PersistenceTest method when_followerIsRestarted_then_itRestoresItsRaftState.
@Test
public void when_followerIsRestarted_then_itRestoresItsRaftState() throws ExecutionException, InterruptedException {
group = new LocalRaftGroupBuilder(3).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
final RaftNodeImpl leader = group.waitUntilLeaderElected();
RaftNodeImpl terminatedFollower = group.getAnyFollowerNode();
final int count = 10;
for (int i = 0; i < count; i++) {
leader.replicate(new ApplyRaftRunnable("val" + i)).get();
}
assertTrueEventually(() -> assertEquals(getCommitIndex(leader), getCommitIndex(terminatedFollower)));
RaftEndpoint terminatedEndpoint = terminatedFollower.getLocalMember();
InMemoryRaftStateStore stateStore = getRaftStateStore(terminatedFollower);
RestoredRaftState terminatedState = stateStore.toRestoredRaftState();
group.terminateNode(terminatedEndpoint);
leader.replicate(new ApplyRaftRunnable("val" + count)).get();
final RaftNodeImpl restartedNode = group.createNewRaftNode(terminatedState, stateStore);
assertEquals(new ArrayList<>(getCommittedGroupMembers(leader).members()), new ArrayList<>(getCommittedGroupMembers(restartedNode).members()));
assertEquals(new ArrayList<>(getLastGroupMembers(leader).members()), new ArrayList<>(getLastGroupMembers(restartedNode).members()));
assertTrueEventually(() -> {
assertEquals(leader.getLocalMember(), restartedNode.getLeader());
assertEquals(getTerm(leader), getTerm(restartedNode));
assertEquals(getCommitIndex(leader), getCommitIndex(restartedNode));
assertEquals(getLastApplied(leader), getLastApplied(restartedNode));
RaftDataService service = group.getService(restartedNode);
Object[] values = service.valuesArray();
assertThat(values, arrayWithSize(count + 1));
for (int i = 0; i <= count; i++) {
assertEquals("val" + i, values[i]);
}
});
}
use of com.hazelcast.cp.internal.raft.impl.dataservice.ApplyRaftRunnable in project hazelcast by hazelcast.
the class PersistenceTest method when_leaderIsRestarted_then_itBecomesFollowerAndRestoresItsRaftState.
@Test
public void when_leaderIsRestarted_then_itBecomesFollowerAndRestoresItsRaftState() throws ExecutionException, InterruptedException {
group = new LocalRaftGroupBuilder(3).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).setAppendNopEntryOnLeaderElection(true).build();
group.start();
RaftNodeImpl leader = group.waitUntilLeaderElected();
final int count = 10;
for (int i = 0; i < count; i++) {
leader.replicate(new ApplyRaftRunnable("val" + i)).get();
}
RaftEndpoint terminatedEndpoint = leader.getLocalMember();
InMemoryRaftStateStore stateStore = getRaftStateStore(leader);
RestoredRaftState terminatedState = stateStore.toRestoredRaftState();
group.terminateNode(terminatedEndpoint);
final RaftNodeImpl newLeader = group.waitUntilLeaderElected();
final RaftNodeImpl restartedNode = group.createNewRaftNode(terminatedState, stateStore);
assertEquals(new ArrayList<>(getCommittedGroupMembers(newLeader).members()), new ArrayList<>(getCommittedGroupMembers(restartedNode).members()));
assertEquals(new ArrayList<>(getLastGroupMembers(newLeader).members()), new ArrayList<>(getLastGroupMembers(restartedNode).members()));
assertTrueEventually(() -> {
assertEquals(newLeader.getLocalMember(), restartedNode.getLeader());
assertEquals(getTerm(newLeader), getTerm(restartedNode));
assertEquals(getCommitIndex(newLeader), getCommitIndex(restartedNode));
assertEquals(getLastApplied(newLeader), getLastApplied(restartedNode));
RaftDataService service = group.getService(restartedNode);
Object[] values = service.valuesArray();
assertThat(values, arrayWithSize(count));
for (int i = 0; i < count; i++) {
assertEquals("val" + i, values[i]);
}
});
}
use of com.hazelcast.cp.internal.raft.impl.dataservice.ApplyRaftRunnable in project hazelcast by hazelcast.
the class PersistenceTest method when_followerIsRestarted_then_itAppliesPreviouslyCommittedMemberListViaSnapshot.
@Test
public void when_followerIsRestarted_then_itAppliesPreviouslyCommittedMemberListViaSnapshot() throws ExecutionException, InterruptedException {
int committedEntryCountToSnapshot = 50;
RaftAlgorithmConfig config = new RaftAlgorithmConfig().setCommitIndexAdvanceCountToSnapshot(committedEntryCountToSnapshot).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();
while (getSnapshotEntry(terminatedFollower).index() == 0) {
leader.replicate(new ApplyRaftRunnable("val")).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.dataservice.ApplyRaftRunnable in project hazelcast by hazelcast.
the class PersistenceTest method when_leaderAppendEntriesInMinoritySplit_then_itTruncatesEntriesOnStore.
@Test
public void when_leaderAppendEntriesInMinoritySplit_then_itTruncatesEntriesOnStore() throws ExecutionException, InterruptedException {
group = new LocalRaftGroupBuilder(3).setRaftStateStoreFactory(RAFT_STATE_STORE_FACTORY).build();
group.start();
final RaftNodeImpl leader = group.waitUntilLeaderElected();
leader.replicate(new ApplyRaftRunnable("val1")).get();
assertTrueEventually(() -> {
for (RaftNodeImpl raftNode : group.getNodes()) {
assertEquals(1, getCommitIndex(raftNode));
}
});
final RaftNodeImpl[] followers = group.getNodesExcept(leader.getLocalMember());
group.split(leader.getLocalMember());
assertTrueEventually(() -> {
for (RaftNodeImpl raftNode : followers) {
RaftEndpoint leaderEndpoint = getLeaderMember(raftNode);
assertNotNull(leaderEndpoint);
assertNotEquals(leader.getLocalMember(), leaderEndpoint);
}
});
for (int i = 0; i < 10; i++) {
leader.replicate(new ApplyRaftRunnable("isolated" + i));
}
assertTrueEventually(() -> {
RestoredRaftState restoredState = getRestoredState(leader);
LogEntry[] entries = restoredState.entries();
assertEquals(11, entries.length);
assertEquals("val1", ((ApplyRaftRunnable) entries[0].operation()).getVal());
for (int i = 1; i < 11; i++) {
assertEquals("isolated" + (i - 1), ((ApplyRaftRunnable) entries[i].operation()).getVal());
}
});
RaftNodeImpl newLeader = group.getNode(getLeaderMember(followers[0]));
for (int i = 0; i < 10; i++) {
newLeader.replicate(new ApplyRaftRunnable("valNew" + i)).get();
}
assertTrueEventually(() -> {
for (RaftNodeImpl raftNode : followers) {
assertEquals(11, getCommitIndex(raftNode));
}
});
group.merge();
RaftNodeImpl finalLeader = group.waitUntilLeaderElected();
assertNotEquals(leader.getLocalMember(), finalLeader.getLocalMember());
assertTrueEventually(() -> {
RestoredRaftState state = getRestoredState(leader);
LogEntry[] entries = state.entries();
assertEquals(11, entries.length);
assertEquals("val1", ((ApplyRaftRunnable) entries[0].operation()).getVal());
for (int i = 1; i < 11; i++) {
assertEquals("valNew" + (i - 1), ((ApplyRaftRunnable) entries[i].operation()).getVal());
}
});
}
use of com.hazelcast.cp.internal.raft.impl.dataservice.ApplyRaftRunnable in project hazelcast by hazelcast.
the class SnapshotTest method when_leaderMissesInstallSnapshotResponse_then_itAdvancesMatchIndexWithNextInstallSnapshotResponse.
@Test
public void when_leaderMissesInstallSnapshotResponse_then_itAdvancesMatchIndexWithNextInstallSnapshotResponse() throws ExecutionException, InterruptedException {
final int entryCount = 50;
RaftAlgorithmConfig config = new RaftAlgorithmConfig().setCommitIndexAdvanceCountToSnapshot(entryCount).setAppendRequestBackoffTimeoutInMillis(1000);
group = newGroup(3, config);
group.start();
RaftNodeImpl leader = group.waitUntilLeaderElected();
RaftNodeImpl[] followers = group.getNodesExcept(leader.getLocalMember());
RaftNodeImpl slowFollower = followers[1];
// the leader cannot send AppendEntriesRPC to the follower
group.dropMessagesToMember(leader.getLocalMember(), slowFollower.getLocalMember(), AppendRequest.class);
// the follower cannot send append response to the leader after installing the snapshot
group.dropMessagesToMember(slowFollower.getLocalMember(), leader.getLocalMember(), AppendSuccessResponse.class);
for (int i = 0; i < entryCount; i++) {
leader.replicate(new ApplyRaftRunnable("val" + i)).get();
}
assertTrueEventually(() -> assertEquals(entryCount, getSnapshotEntry(leader).index()));
leader.replicate(new ApplyRaftRunnable("valFinal")).get();
group.resetAllRulesFrom(leader.getLocalMember());
assertTrueEventually(() -> {
for (RaftNodeImpl raftNode : group.getNodesExcept(slowFollower.getLocalMember())) {
assertEquals(entryCount + 1, getCommitIndex(raftNode));
RaftDataService service = group.getService(raftNode);
assertEquals(entryCount + 1, service.size());
for (int i = 0; i < entryCount; i++) {
assertEquals(("val" + i), service.get(i + 1));
}
assertEquals("valFinal", service.get(51));
}
assertEquals(entryCount, getCommitIndex(slowFollower));
RaftDataService service = group.getService(slowFollower);
assertEquals(entryCount, service.size());
for (int i = 0; i < entryCount; i++) {
assertEquals(("val" + i), service.get(i + 1));
}
});
group.resetAllRulesFrom(slowFollower.getLocalMember());
long commitIndex = getCommitIndex(leader);
assertTrueEventually(() -> {
for (RaftNode raftNode : group.getNodesExcept(leader.getLocalMember())) {
assertEquals(commitIndex, getMatchIndex(leader, raftNode.getLocalMember()));
}
});
}
Aggregations