Search in sources :

Example 1 with Endpoint

use of org.apache.ignite.raft.jraft.util.Endpoint 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());
}
Also used : Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) RaftGroupService(org.apache.ignite.raft.jraft.RaftGroupService) Node(org.apache.ignite.raft.jraft.Node) BootstrapOptions(org.apache.ignite.raft.jraft.option.BootstrapOptions) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) Test(org.junit.jupiter.api.Test)

Example 2 with Endpoint

use of org.apache.ignite.raft.jraft.util.Endpoint 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());
}
Also used : SynchronizedClosure(org.apache.ignite.raft.jraft.closure.SynchronizedClosure) BeforeEach(org.junit.jupiter.api.BeforeEach) Arrays(java.util.Arrays) ExponentialBackoffTimeoutStrategy(org.apache.ignite.raft.jraft.util.ExponentialBackoffTimeoutStrategy) TaskClosure(org.apache.ignite.raft.jraft.closure.TaskClosure) SnapshotThrottle(org.apache.ignite.raft.jraft.storage.SnapshotThrottle) Disabled(org.junit.jupiter.api.Disabled) BooleanSupplier(java.util.function.BooleanSupplier) AfterAll(org.junit.jupiter.api.AfterAll) Future(java.util.concurrent.Future) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) BeforeAll(org.junit.jupiter.api.BeforeAll) Path(java.nio.file.Path) Collections.synchronizedList(java.util.Collections.synchronizedList) Set(java.util.Set) Assertions.assertNotSame(org.junit.jupiter.api.Assertions.assertNotSame) ELECTION_TIMEOUT_MILLIS(org.apache.ignite.raft.jraft.core.TestCluster.ELECTION_TIMEOUT_MILLIS) TestUtils(org.apache.ignite.raft.jraft.test.TestUtils) ExecutorServiceHelper(org.apache.ignite.raft.jraft.util.ExecutorServiceHelper) Executors(java.util.concurrent.Executors) CountDownLatch(java.util.concurrent.CountDownLatch) Stream(java.util.stream.Stream) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) RaftError(org.apache.ignite.raft.jraft.error.RaftError) RpcServer(org.apache.ignite.raft.jraft.rpc.RpcServer) Assertions.fail(org.junit.jupiter.api.Assertions.fail) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) StateMachine(org.apache.ignite.raft.jraft.StateMachine) RaftException(org.apache.ignite.raft.jraft.error.RaftException) Assertions.assertNull(org.junit.jupiter.api.Assertions.assertNull) ArrayList(java.util.ArrayList) Task(org.apache.ignite.raft.jraft.entity.Task) IgniteRpcServer(org.apache.ignite.raft.jraft.rpc.impl.IgniteRpcServer) TestScaleCubeClusterServiceFactory(org.apache.ignite.network.scalecube.TestScaleCubeClusterServiceFactory) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) LinkedHashSet(java.util.LinkedHashSet) NodeManager(org.apache.ignite.raft.jraft.NodeManager) LogIndexOutOfBoundsException(org.apache.ignite.raft.jraft.error.LogIndexOutOfBoundsException) RaftGroupService(org.apache.ignite.raft.jraft.RaftGroupService) LogNotFoundException(org.apache.ignite.raft.jraft.error.LogNotFoundException) DefaultRaftClientService(org.apache.ignite.raft.jraft.rpc.impl.core.DefaultRaftClientService) File(java.io.File) Assertions.assertSame(org.junit.jupiter.api.Assertions.assertSame) WorkDirectory(org.apache.ignite.internal.testframework.WorkDirectory) NetworkAddress(org.apache.ignite.network.NetworkAddress) Assertions.assertArrayEquals(org.junit.jupiter.api.Assertions.assertArrayEquals) AfterEach(org.junit.jupiter.api.AfterEach) ConsoleReporter(com.codahale.metrics.ConsoleReporter) RaftOptions(org.apache.ignite.raft.jraft.option.RaftOptions) EnumOutter(org.apache.ignite.raft.jraft.entity.EnumOutter) Assertions.assertNotEquals(org.junit.jupiter.api.Assertions.assertNotEquals) TestUtils.sender(org.apache.ignite.raft.jraft.test.TestUtils.sender) IgniteLogger(org.apache.ignite.lang.IgniteLogger) ByteBuffer(java.nio.ByteBuffer) ReadOnlyOption(org.apache.ignite.raft.jraft.option.ReadOnlyOption) Assertions.assertFalse(org.junit.jupiter.api.Assertions.assertFalse) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) NodeFinder(org.apache.ignite.network.NodeFinder) Node(org.apache.ignite.raft.jraft.Node) JoinableClosure(org.apache.ignite.raft.jraft.closure.JoinableClosure) TestIgniteRpcServer(org.apache.ignite.raft.jraft.rpc.TestIgniteRpcServer) SnapshotReader(org.apache.ignite.raft.jraft.storage.snapshot.SnapshotReader) Status(org.apache.ignite.raft.jraft.Status) BootstrapOptions(org.apache.ignite.raft.jraft.option.BootstrapOptions) TestInfo(org.junit.jupiter.api.TestInfo) Utils(org.apache.ignite.raft.jraft.util.Utils) Test(org.junit.jupiter.api.Test) List(java.util.List) StaticNodeFinder(org.apache.ignite.network.StaticNodeFinder) RpcClientEx(org.apache.ignite.raft.jraft.rpc.RpcClientEx) Configuration(org.apache.ignite.raft.jraft.conf.Configuration) ReadIndexClosure(org.apache.ignite.raft.jraft.closure.ReadIndexClosure) Bits(org.apache.ignite.raft.jraft.util.Bits) ClusterServiceTestUtils(org.apache.ignite.utils.ClusterServiceTestUtils) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CompletableFuture(java.util.concurrent.CompletableFuture) FixedThreadsExecutorGroup(org.apache.ignite.raft.jraft.util.concurrent.FixedThreadsExecutorGroup) AtomicReference(java.util.concurrent.atomic.AtomicReference) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) HashSet(java.util.HashSet) BiPredicate(java.util.function.BiPredicate) Iterator(org.apache.ignite.raft.jraft.Iterator) ExecutorService(java.util.concurrent.ExecutorService) JRaftUtils(org.apache.ignite.raft.jraft.JRaftUtils) UTF_8(java.nio.charset.StandardCharsets.UTF_8) RpcRequests(org.apache.ignite.raft.jraft.rpc.RpcRequests) IgniteRpcClient(org.apache.ignite.raft.jraft.rpc.impl.IgniteRpcClient) TimeUnit(java.util.concurrent.TimeUnit) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) Collectors.toList(java.util.stream.Collectors.toList) ThroughputSnapshotThrottle(org.apache.ignite.raft.jraft.storage.snapshot.ThroughputSnapshotThrottle) ClusterService(org.apache.ignite.network.ClusterService) WorkDirectoryExtension(org.apache.ignite.internal.testframework.WorkDirectoryExtension) UserLog(org.apache.ignite.raft.jraft.entity.UserLog) Collections(java.util.Collections) RaftOptions(org.apache.ignite.raft.jraft.option.RaftOptions) Task(org.apache.ignite.raft.jraft.entity.Task) Configuration(org.apache.ignite.raft.jraft.conf.Configuration) RaftGroupService(org.apache.ignite.raft.jraft.RaftGroupService) Node(org.apache.ignite.raft.jraft.Node) ArrayList(java.util.ArrayList) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) ByteBuffer(java.nio.ByteBuffer) Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) JoinableClosure(org.apache.ignite.raft.jraft.closure.JoinableClosure) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) Test(org.junit.jupiter.api.Test)

Example 3 with Endpoint

use of org.apache.ignite.raft.jraft.util.Endpoint 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);
}
Also used : Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) Configuration(org.apache.ignite.raft.jraft.conf.Configuration) RaftGroupService(org.apache.ignite.raft.jraft.RaftGroupService) Node(org.apache.ignite.raft.jraft.Node) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) Test(org.junit.jupiter.api.Test)

Example 4 with Endpoint

use of org.apache.ignite.raft.jraft.util.Endpoint in project ignite-3 by apache.

the class ItNodeTest method testFollowerStartStopFollowing.

@Test
public void testFollowerStartStopFollowing() throws Exception {
    // start five nodes
    List<PeerId> peers = TestUtils.generatePeers(5);
    cluster = new TestCluster("unitest", dataPath, peers, ELECTION_TIMEOUT_MILLIS, testInfo);
    for (PeerId peer : peers) assertTrue(cluster.start(peer.getEndpoint()));
    cluster.waitLeader();
    Node firstLeader = cluster.getLeader();
    assertNotNull(firstLeader);
    cluster.ensureLeader(firstLeader);
    // apply something
    sendTestTaskAndWait(firstLeader);
    // assert follow times
    List<Node> firstFollowers = cluster.getFollowers();
    assertEquals(4, firstFollowers.size());
    for (Node node : firstFollowers) {
        assertTrue(waitForCondition(() -> ((MockStateMachine) node.getOptions().getFsm()).getOnStartFollowingTimes() == 1, 5_000));
        assertEquals(0, ((MockStateMachine) node.getOptions().getFsm()).getOnStopFollowingTimes());
    }
    // stop leader and elect new one
    Endpoint fstLeaderAddr = firstLeader.getNodeId().getPeerId().getEndpoint();
    assertTrue(cluster.stop(fstLeaderAddr));
    cluster.waitLeader();
    Node secondLeader = cluster.getLeader();
    assertNotNull(secondLeader);
    sendTestTaskAndWait(secondLeader, 10, RaftError.SUCCESS);
    // ensure start/stop following times
    List<Node> secondFollowers = cluster.getFollowers();
    assertEquals(3, secondFollowers.size());
    for (Node node : secondFollowers) {
        assertTrue(waitForCondition(() -> ((MockStateMachine) node.getOptions().getFsm()).getOnStartFollowingTimes() == 2, 5_000));
        assertEquals(1, ((MockStateMachine) node.getOptions().getFsm()).getOnStopFollowingTimes());
    }
    // transfer leadership to a follower
    PeerId targetPeer = secondFollowers.get(0).getNodeId().getPeerId().copy();
    assertTrue(secondLeader.transferLeadershipTo(targetPeer).isOk());
    Thread.sleep(100);
    cluster.waitLeader();
    Node thirdLeader = cluster.getLeader();
    assertEquals(targetPeer, thirdLeader.getNodeId().getPeerId());
    sendTestTaskAndWait(thirdLeader, 20, RaftError.SUCCESS);
    List<Node> thirdFollowers = cluster.getFollowers();
    assertEquals(3, thirdFollowers.size());
    for (int i = 0; i < 3; i++) {
        Node follower = thirdFollowers.get(i);
        if (follower.getNodeId().getPeerId().equals(secondLeader.getNodeId().getPeerId())) {
            assertTrue(waitForCondition(() -> ((MockStateMachine) follower.getOptions().getFsm()).getOnStartFollowingTimes() == 2, 5_000));
            assertEquals(1, ((MockStateMachine) follower.getOptions().getFsm()).getOnStopFollowingTimes());
            continue;
        }
        assertTrue(waitForCondition(() -> ((MockStateMachine) follower.getOptions().getFsm()).getOnStartFollowingTimes() == 3, 5_000));
        assertEquals(2, ((MockStateMachine) follower.getOptions().getFsm()).getOnStopFollowingTimes());
    }
    cluster.ensureSame();
}
Also used : Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) Node(org.apache.ignite.raft.jraft.Node) Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) Test(org.junit.jupiter.api.Test)

Example 5 with Endpoint

use of org.apache.ignite.raft.jraft.util.Endpoint in project ignite-3 by apache.

the class ItNodeTest method testRestoreSnapshot.

/**
 * @throws Exception
 */
@Test
public void testRestoreSnapshot() throws Exception {
    List<PeerId> peers = TestUtils.generatePeers(3);
    cluster = new TestCluster("unitest", dataPath, peers, testInfo);
    for (PeerId peer : peers) assertTrue(cluster.start(peer.getEndpoint()));
    cluster.waitLeader();
    // get leader
    Node leader = cluster.getLeader();
    LOG.info("Leader: " + leader);
    assertNotNull(leader);
    // apply tasks to leader
    sendTestTaskAndWait(leader);
    cluster.ensureSame();
    triggerLeaderSnapshot(cluster, leader);
    // stop leader
    Endpoint leaderAddr = leader.getNodeId().getPeerId().getEndpoint().copy();
    assertTrue(cluster.stop(leaderAddr));
    // restart leader
    cluster.waitLeader();
    assertEquals(0, cluster.getLeaderFsm().getLoadSnapshotTimes());
    assertTrue(cluster.start(leaderAddr));
    cluster.ensureSame();
    assertEquals(0, cluster.getLeaderFsm().getLoadSnapshotTimes());
}
Also used : Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) Node(org.apache.ignite.raft.jraft.Node) PeerId(org.apache.ignite.raft.jraft.entity.PeerId) Test(org.junit.jupiter.api.Test)

Aggregations

Endpoint (org.apache.ignite.raft.jraft.util.Endpoint)42 Test (org.junit.jupiter.api.Test)32 PeerId (org.apache.ignite.raft.jraft.entity.PeerId)23 Node (org.apache.ignite.raft.jraft.Node)22 NodeOptions (org.apache.ignite.raft.jraft.option.NodeOptions)13 RaftGroupService (org.apache.ignite.raft.jraft.RaftGroupService)9 CountDownLatch (java.util.concurrent.CountDownLatch)8 Configuration (org.apache.ignite.raft.jraft.conf.Configuration)7 RaftOptions (org.apache.ignite.raft.jraft.option.RaftOptions)7 RpcRequests (org.apache.ignite.raft.jraft.rpc.RpcRequests)7 ByteBuffer (java.nio.ByteBuffer)6 CompletableFuture (java.util.concurrent.CompletableFuture)6 Message (org.apache.ignite.raft.jraft.rpc.Message)5 RpcResponseClosure (org.apache.ignite.raft.jraft.rpc.RpcResponseClosure)5 SnapshotReader (org.apache.ignite.raft.jraft.storage.snapshot.SnapshotReader)5 BeforeEach (org.junit.jupiter.api.BeforeEach)5 ArrayList (java.util.ArrayList)4 Status (org.apache.ignite.raft.jraft.Status)4 BootstrapOptions (org.apache.ignite.raft.jraft.option.BootstrapOptions)3 SnapshotCopierOptions (org.apache.ignite.raft.jraft.option.SnapshotCopierOptions)3