use of org.apache.ignite.raft.jraft.option.NodeOptions in project ignite-3 by apache.
the class ItNodeTest method testBootStrapWithSnapshot.
@Test
public void testBootStrapWithSnapshot() throws Exception {
Endpoint addr = new Endpoint("127.0.0.1", 5006);
MockStateMachine fsm = new MockStateMachine(addr);
for (char ch = 'a'; ch <= 'z'; ch++) fsm.getLogs().add(ByteBuffer.wrap(new byte[] { (byte) ch }));
BootstrapOptions opts = new BootstrapOptions();
opts.setServiceFactory(new DefaultJRaftServiceFactory());
opts.setLastLogIndex(fsm.getLogs().size());
opts.setRaftMetaUri(dataPath + File.separator + "meta");
opts.setLogUri(dataPath + File.separator + "log");
opts.setSnapshotUri(dataPath + File.separator + "snapshot");
opts.setGroupConf(JRaftUtils.getConfiguration("127.0.0.1:5006"));
opts.setFsm(fsm);
NodeOptions nodeOpts = createNodeOptions();
opts.setNodeOptions(nodeOpts);
assertTrue(JRaftUtils.bootstrap(opts));
nodeOpts.setRaftMetaUri(dataPath + File.separator + "meta");
nodeOpts.setLogUri(dataPath + File.separator + "log");
nodeOpts.setSnapshotUri(dataPath + File.separator + "snapshot");
nodeOpts.setFsm(fsm);
RaftGroupService service = createService("test", new PeerId(addr, 0), nodeOpts);
Node node = service.start();
assertEquals(26, fsm.getLogs().size());
for (int i = 0; i < 26; i++) assertEquals('a' + i, fsm.getLogs().get(i).get());
// Group configuration will be restored from snapshot meta.
while (!node.isLeader()) Thread.sleep(20);
sendTestTaskAndWait(node);
assertEquals(36, fsm.getLogs().size());
}
use of org.apache.ignite.raft.jraft.option.NodeOptions in project ignite-3 by apache.
the class ItNodeTest method testNodeTaskOverload.
@Test
public void testNodeTaskOverload() throws Exception {
Endpoint addr = new Endpoint(TestUtils.getLocalAddress(), TestUtils.INIT_PORT);
PeerId peer = new PeerId(addr, 0);
NodeOptions nodeOptions = createNodeOptions();
RaftOptions raftOptions = new RaftOptions();
raftOptions.setDisruptorBufferSize(2);
nodeOptions.setRaftOptions(raftOptions);
MockStateMachine fsm = new MockStateMachine(addr);
nodeOptions.setFsm(fsm);
nodeOptions.setLogUri(dataPath + File.separator + "log");
nodeOptions.setRaftMetaUri(dataPath + File.separator + "meta");
nodeOptions.setSnapshotUri(dataPath + File.separator + "snapshot");
nodeOptions.setInitialConf(new Configuration(Collections.singletonList(peer)));
RaftGroupService service = createService("unittest", new PeerId(addr, 0), nodeOptions);
Node node = service.start();
assertEquals(1, node.listPeers().size());
assertTrue(node.listPeers().contains(peer));
while (!node.isLeader()) ;
List<Task> tasks = new ArrayList<>();
AtomicInteger c = new AtomicInteger(0);
for (int i = 0; i < 10; i++) {
ByteBuffer data = ByteBuffer.wrap(("hello" + i).getBytes(UTF_8));
int finalI = i;
Task task = new Task(data, new JoinableClosure(status -> {
LOG.info("{} i={}", status, finalI);
if (!status.isOk()) {
assertTrue(status.getRaftError() == RaftError.EBUSY || status.getRaftError() == RaftError.EPERM);
}
c.incrementAndGet();
}));
node.apply(task);
tasks.add(task);
}
Task.joinAll(tasks, TimeUnit.SECONDS.toMillis(30));
assertEquals(10, c.get());
}
use of org.apache.ignite.raft.jraft.option.NodeOptions in project ignite-3 by apache.
the class NodeImpl method join.
@Override
public synchronized void join() throws InterruptedException {
if (this.shutdownLatch != null) {
if (this.readOnlyService != null) {
this.readOnlyService.join();
}
if (this.logManager != null) {
this.logManager.join();
}
if (this.snapshotExecutor != null) {
this.snapshotExecutor.join();
}
if (this.wakingCandidate != null) {
Replicator.join(this.wakingCandidate);
}
this.shutdownLatch.await();
this.applyDisruptor.unsubscribe(groupId);
this.shutdownLatch = null;
}
if (this.fsmCaller != null) {
this.fsmCaller.join();
}
// Stop and reset non shared pools.
NodeOptions opts = getOptions();
if (opts.getScheduler() != null && !opts.isSharedPools()) {
opts.getScheduler().shutdown();
opts.setScheduler(null);
}
if (opts.getElectionTimer() != null && !opts.isSharedPools()) {
opts.getElectionTimer().stop();
opts.setElectionTimer(null);
}
if (opts.getVoteTimer() != null && !opts.isSharedPools()) {
opts.getVoteTimer().stop();
opts.setVoteTimer(null);
}
if (opts.getStepDownTimer() != null && !opts.isSharedPools()) {
opts.getStepDownTimer().stop();
opts.setStepDownTimer(null);
}
if (opts.getSnapshotTimer() != null && !opts.isSharedPools()) {
opts.getSnapshotTimer().stop();
opts.setSnapshotTimer(null);
}
if (opts.getCommonExecutor() != null && !opts.isSharedPools()) {
ExecutorServiceHelper.shutdownAndAwaitTermination(opts.getCommonExecutor());
opts.setCommonExecutor(null);
}
if (opts.getStripedExecutor() != null && !opts.isSharedPools()) {
opts.getStripedExecutor().shutdownGracefully();
opts.setStripedExecutor(null);
}
if (opts.getClientExecutor() != null && !opts.isSharedPools()) {
ExecutorServiceHelper.shutdownAndAwaitTermination(opts.getClientExecutor());
opts.setClientExecutor(null);
}
if (opts.getfSMCallerExecutorDisruptor() != null && !opts.isSharedPools()) {
opts.getfSMCallerExecutorDisruptor().shutdown();
opts.setfSMCallerExecutorDisruptor(null);
}
if (opts.getNodeApplyDisruptor() != null && !opts.isSharedPools()) {
opts.getNodeApplyDisruptor().shutdown();
opts.setNodeApplyDisruptor(null);
}
if (opts.getReadOnlyServiceDisruptor() != null && !opts.isSharedPools()) {
opts.getReadOnlyServiceDisruptor().shutdown();
opts.setReadOnlyServiceDisruptor(null);
}
if (opts.getLogManagerDisruptor() != null && !opts.isSharedPools()) {
opts.getLogManagerDisruptor().shutdown();
opts.setLogManagerDisruptor(null);
}
}
use of org.apache.ignite.raft.jraft.option.NodeOptions in project ignite-3 by apache.
the class ItNodeTest method testAutoSnapshot.
@Test
public void testAutoSnapshot() throws Exception {
Endpoint addr = new Endpoint(TestUtils.getLocalAddress(), TestUtils.INIT_PORT);
NodeOptions nodeOptions = createNodeOptions();
MockStateMachine fsm = new MockStateMachine(addr);
nodeOptions.setFsm(fsm);
nodeOptions.setLogUri(dataPath + File.separator + "log");
nodeOptions.setSnapshotUri(dataPath + File.separator + "snapshot");
nodeOptions.setRaftMetaUri(dataPath + File.separator + "meta");
nodeOptions.setSnapshotIntervalSecs(10);
nodeOptions.setInitialConf(new Configuration(Collections.singletonList(new PeerId(addr, 0))));
RaftGroupService service = createService("unittest", new PeerId(addr, 0), nodeOptions);
Node node = service.start();
// wait node elect self as leader
Thread.sleep(2000);
sendTestTaskAndWait(node);
// wait for auto snapshot
Thread.sleep(10000);
// first snapshot will be triggered randomly
int times = fsm.getSaveSnapshotTimes();
assertTrue(times >= 1, "snapshotTimes=" + times);
assertTrue(fsm.getSnapshotIndex() > 0);
}
use of org.apache.ignite.raft.jraft.option.NodeOptions in project ignite-3 by apache.
the class ItMetaStorageRaftGroupTest method prepareJraftMetaStorages.
private List<Pair<RaftServer, RaftGroupService>> prepareJraftMetaStorages(AtomicInteger replicatorStartedCounter, AtomicInteger replicatorStoppedCounter) throws InterruptedException, ExecutionException {
List<Peer> peers = new ArrayList<>();
cluster.forEach(c -> peers.add(new Peer(c.topologyService().localMember().address())));
assertTrue(cluster.size() > 1);
NodeOptions opt1 = new NodeOptions();
opt1.setReplicationStateListeners(List.of(new UserReplicatorStateListener(replicatorStartedCounter, replicatorStoppedCounter)));
NodeOptions opt2 = new NodeOptions();
opt2.setReplicationStateListeners(List.of(new UserReplicatorStateListener(replicatorStartedCounter, replicatorStoppedCounter)));
NodeOptions opt3 = new NodeOptions();
opt3.setReplicationStateListeners(List.of(new UserReplicatorStateListener(replicatorStartedCounter, replicatorStoppedCounter)));
metaStorageRaftSrv1 = new JraftServerImpl(cluster.get(0), dataPath, opt1);
metaStorageRaftSrv2 = new JraftServerImpl(cluster.get(1), dataPath, opt2);
metaStorageRaftSrv3 = new JraftServerImpl(cluster.get(2), dataPath, opt3);
metaStorageRaftSrv1.start();
metaStorageRaftSrv2.start();
metaStorageRaftSrv3.start();
metaStorageRaftSrv1.startRaftGroup(METASTORAGE_RAFT_GROUP_NAME, new MetaStorageListener(mockStorage), peers);
metaStorageRaftSrv2.startRaftGroup(METASTORAGE_RAFT_GROUP_NAME, new MetaStorageListener(mockStorage), peers);
metaStorageRaftSrv3.startRaftGroup(METASTORAGE_RAFT_GROUP_NAME, new MetaStorageListener(mockStorage), peers);
metaStorageRaftGrpSvc1 = RaftGroupServiceImpl.start(METASTORAGE_RAFT_GROUP_NAME, cluster.get(0), FACTORY, 10_000, peers, true, 200, executor).get();
metaStorageRaftGrpSvc2 = RaftGroupServiceImpl.start(METASTORAGE_RAFT_GROUP_NAME, cluster.get(1), FACTORY, 10_000, peers, true, 200, executor).get();
metaStorageRaftGrpSvc3 = RaftGroupServiceImpl.start(METASTORAGE_RAFT_GROUP_NAME, cluster.get(2), FACTORY, 10_000, peers, true, 200, executor).get();
assertTrue(TestUtils.waitForCondition(() -> sameLeaders(metaStorageRaftGrpSvc1, metaStorageRaftGrpSvc2, metaStorageRaftGrpSvc3), 10_000), "Leaders: " + metaStorageRaftGrpSvc1.leader() + " " + metaStorageRaftGrpSvc2.leader() + " " + metaStorageRaftGrpSvc3.leader());
List<Pair<RaftServer, RaftGroupService>> raftServersRaftGroups = new ArrayList<>();
raftServersRaftGroups.add(new Pair<>(metaStorageRaftSrv1, metaStorageRaftGrpSvc1));
raftServersRaftGroups.add(new Pair<>(metaStorageRaftSrv2, metaStorageRaftGrpSvc2));
raftServersRaftGroups.add(new Pair<>(metaStorageRaftSrv3, metaStorageRaftGrpSvc3));
return raftServersRaftGroups;
}
Aggregations