use of org.neo4j.causalclustering.core.state.snapshot.RaftCoreState in project neo4j by neo4j.
the class RaftTestFixture method bootstrap.
public void bootstrap(MemberId[] members) throws RaftMachine.BootstrapException, IOException {
for (MemberFixture member : members()) {
member.raftLog().append(new RaftLogEntry(0, new MemberIdSet(asSet(members))));
member.raftInstance().installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(members))));
member.raftInstance().startTimers();
}
}
use of org.neo4j.causalclustering.core.state.snapshot.RaftCoreState in project neo4j by neo4j.
the class Fixture method boot.
void boot() throws BootstrapException, TimeoutException, InterruptedException, IOException {
for (RaftFixture raft : rafts) {
raft.raftLog().append(new RaftLogEntry(0, new MemberIdSet(asSet(members))));
raft.raftMachine().installCoreState(new RaftCoreState(new MembershipEntry(0, members)));
raft.raftMachine.startTimers();
}
net.start();
awaitBootstrapped();
}
use of org.neo4j.causalclustering.core.state.snapshot.RaftCoreState in project neo4j by neo4j.
the class CoreBootstrapperTest method shouldSetAllCoreState.
@Test
public void shouldSetAllCoreState() throws Exception {
// given
int nodeCount = 100;
FileSystemAbstraction fileSystem = fileSystemRule.get();
File classicNeo4jStore = RestoreClusterUtils.createClassicNeo4jStore(testDirectory.directory(), fileSystem, nodeCount, Standard.LATEST_NAME);
PageCache pageCache = pageCacheRule.getPageCache(fileSystem);
CoreBootstrapper bootstrapper = new CoreBootstrapper(classicNeo4jStore, pageCache, fileSystem, Config.defaults(), NullLogProvider.getInstance());
// when
Set<MemberId> membership = asSet(randomMember(), randomMember(), randomMember());
CoreSnapshot snapshot = bootstrapper.bootstrap(membership);
// then
assertEquals(nodeCount, ((IdAllocationState) snapshot.get(CoreStateType.ID_ALLOCATION)).firstUnallocated(IdType.NODE));
/* Bootstrapped state is created in RAFT land at index -1 and term -1. */
assertEquals(0, snapshot.prevIndex());
assertEquals(0, snapshot.prevTerm());
/* Lock is initially not taken. */
assertEquals(new ReplicatedLockTokenState(), snapshot.get(CoreStateType.LOCK_TOKEN));
/* Raft has the bootstrapped set of members initially. */
assertEquals(membership, ((RaftCoreState) snapshot.get(CoreStateType.RAFT_CORE_STATE)).committed().members());
/* The session state is initially empty. */
assertEquals(new GlobalSessionTrackerState(), snapshot.get(CoreStateType.SESSION_TRACKER));
LastCommittedIndexFinder lastCommittedIndexFinder = new LastCommittedIndexFinder(new ReadOnlyTransactionIdStore(pageCache, classicNeo4jStore), new ReadOnlyTransactionStore(pageCache, fileSystem, classicNeo4jStore, new Monitors()), NullLogProvider.getInstance());
long lastCommittedIndex = lastCommittedIndexFinder.getLastCommittedIndex();
assertEquals(-1, lastCommittedIndex);
}
use of org.neo4j.causalclustering.core.state.snapshot.RaftCoreState in project neo4j by neo4j.
the class ElectionTest method candidateShouldLoseElectionAndRemainCandidate.
@Test
public void candidateShouldLoseElectionAndRemainCandidate() throws Exception {
// Note the etcd implementation seems to diverge from the paper here, since the paper suggests that it should
// remain as a candidate
// given
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).outbound(outbound).timeoutService(timeouts).clock(fakeClock).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2))));
raft.startTimers();
timeouts.invokeTimeout(RaftMachine.Timeouts.ELECTION);
// when
raft.handle(voteResponse().from(member1).term(1).deny().build());
raft.handle(voteResponse().from(member2).term(1).deny().build());
// then
assertEquals(1, raft.term());
assertEquals(CANDIDATE, raft.currentRole());
verify(outbound, never()).send(eq(member1), isA(RaftMessages.AppendEntries.Request.class));
verify(outbound, never()).send(eq(member2), isA(RaftMessages.AppendEntries.Request.class));
}
use of org.neo4j.causalclustering.core.state.snapshot.RaftCoreState in project neo4j by neo4j.
the class ElectionTest method candidateShouldWinElectionAndBecomeLeader.
@Test
public void candidateShouldWinElectionAndBecomeLeader() throws Exception {
// given
FakeClock fakeClock = Clocks.fakeClock();
ControlledRenewableTimeoutService timeouts = new ControlledRenewableTimeoutService(fakeClock);
RaftMachine raft = new RaftMachineBuilder(myself, 3, RaftTestMemberSetBuilder.INSTANCE).outbound(outbound).timeoutService(timeouts).clock(fakeClock).build();
raft.installCoreState(new RaftCoreState(new MembershipEntry(0, asSet(myself, member1, member2))));
raft.startTimers();
timeouts.invokeTimeout(RaftMachine.Timeouts.ELECTION);
// when
raft.handle(voteResponse().from(member1).term(1).grant().build());
raft.handle(voteResponse().from(member2).term(1).grant().build());
// then
assertEquals(1, raft.term());
assertEquals(LEADER, raft.currentRole());
verify(outbound).send(eq(member1), isA(RaftMessages.AppendEntries.Request.class));
verify(outbound).send(eq(member2), isA(RaftMessages.AppendEntries.Request.class));
}
Aggregations