use of org.neo4j.causalclustering.core.state.snapshot.CoreSnapshot in project neo4j by neo4j.
the class ClusterBinderTest method shouldBootstrapWhenBootstrappable.
@Test
public void shouldBootstrapWhenBootstrappable() throws Throwable {
// given
CoreTopology bootstrappableTopology = new CoreTopology(null, true, emptyMap());
CoreTopologyService topologyService = mock(CoreTopologyService.class);
when(topologyService.coreServers()).thenReturn(bootstrappableTopology);
when(topologyService.setClusterId(any())).thenReturn(true);
ClusterBinder binder = new ClusterBinder(new StubClusterIdStorage(), topologyService, NullLogProvider.getInstance(), clock, () -> clock.forward(1, TimeUnit.SECONDS), 3_000, coreBootstrapper);
ThrowingConsumer<CoreSnapshot, Throwable> snapshotInstaller = mock(ThrowingConsumer.class);
// when
binder.bindToCluster(snapshotInstaller);
// then
verify(coreBootstrapper).bootstrap(any());
Optional<ClusterId> clusterId = binder.get();
assertTrue(clusterId.isPresent());
verify(topologyService).setClusterId(clusterId.get());
verify(snapshotInstaller).accept(any());
}
use of org.neo4j.causalclustering.core.state.snapshot.CoreSnapshot in project neo4j by neo4j.
the class ClusterBinder method bindToCluster.
/**
* The cluster binding process tries to establish a common cluster ID. If there is no common cluster ID
* then a single instance will eventually create one and publish it through the underlying topology service.
*
* @throws IOException If there is an issue with I/O.
* @throws InterruptedException If the process gets interrupted.
* @throws TimeoutException If the process times out.
*/
public void bindToCluster(ThrowingConsumer<CoreSnapshot, Throwable> snapshotInstaller) throws Throwable {
if (clusterIdStorage.exists()) {
clusterId = clusterIdStorage.readState();
publishClusterId(clusterId);
log.info("Already bound to cluster: " + clusterId);
return;
}
CoreTopology topology;
long endTime = clock.millis() + timeoutMillis;
do {
topology = topologyService.coreServers();
if (topology.clusterId() != null) {
clusterId = topology.clusterId();
log.info("Bound to cluster: " + clusterId);
} else if (topology.canBeBootstrapped()) {
clusterId = new ClusterId(UUID.randomUUID());
CoreSnapshot snapshot = coreBootstrapper.bootstrap(topology.members().keySet());
log.info(String.format("Bootstrapped with snapshot: %s and clusterId: %s", snapshot, clusterId));
snapshotInstaller.accept(snapshot);
publishClusterId(clusterId);
} else {
retryWaiter.apply();
}
} while (clusterId == null && clock.millis() < endTime);
if (clusterId == null) {
throw new TimeoutException(String.format("Failed to join a cluster with members %s. Another member should have published " + "a clusterId but none was detected. Please restart the cluster.", topology));
}
clusterIdStorage.writeState(clusterId);
}
use of org.neo4j.causalclustering.core.state.snapshot.CoreSnapshot in project neo4j by neo4j.
the class CommandApplicationProcess method snapshot.
public synchronized CoreSnapshot snapshot(RaftMachine raft) throws IOException, InterruptedException {
applier.sync(false);
long prevIndex = lastApplied;
long prevTerm = raftLog.readEntryTerm(prevIndex);
CoreSnapshot coreSnapshot = new CoreSnapshot(prevIndex, prevTerm);
coreStateMachines.addSnapshots(coreSnapshot);
coreSnapshot.add(CoreStateType.SESSION_TRACKER, sessionTracker.snapshot());
coreSnapshot.add(CoreStateType.RAFT_CORE_STATE, raft.coreState());
return coreSnapshot;
}
use of org.neo4j.causalclustering.core.state.snapshot.CoreSnapshot in project neo4j by neo4j.
the class CoreBootstrapper method bootstrap.
public CoreSnapshot bootstrap(Set<MemberId> members) throws IOException {
StoreFactory factory = new StoreFactory(storeDir, config, new DefaultIdGeneratorFactory(fs), pageCache, fs, logProvider);
NeoStores neoStores = factory.openAllNeoStores(true);
neoStores.close();
CoreSnapshot coreSnapshot = new CoreSnapshot(FIRST_INDEX, FIRST_TERM);
coreSnapshot.add(CoreStateType.ID_ALLOCATION, deriveIdAllocationState(storeDir));
coreSnapshot.add(CoreStateType.LOCK_TOKEN, new ReplicatedLockTokenState());
coreSnapshot.add(CoreStateType.RAFT_CORE_STATE, new RaftCoreState(new MembershipEntry(FIRST_INDEX, members)));
coreSnapshot.add(CoreStateType.SESSION_TRACKER, new GlobalSessionTrackerState());
appendNullTransactionLogEntryToSetRaftIndexToMinusOne();
return coreSnapshot;
}
use of org.neo4j.causalclustering.core.state.snapshot.CoreSnapshot 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);
}
Aggregations