Search in sources :

Example 1 with NodeImpl

use of org.apache.ignite.raft.jraft.core.NodeImpl in project ignite-3 by apache.

the class JRaftUtils method bootstrap.

/**
 * Bootstrap a non-empty raft node.
 *
 * @param opts options of bootstrap
 * @return true if bootstrap success
 */
public static boolean bootstrap(final BootstrapOptions opts) throws InterruptedException {
    final NodeImpl node = new NodeImpl("bootstrap", new PeerId("127.0.0.1", 0));
    NodeOptions nodeOpts = opts.getNodeOptions();
    nodeOpts.setStripes(1);
    final boolean ret = node.bootstrap(opts);
    node.shutdown();
    node.join();
    return ret;
}
Also used : NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) PeerId(org.apache.ignite.raft.jraft.entity.PeerId)

Example 2 with NodeImpl

use of org.apache.ignite.raft.jraft.core.NodeImpl in project ignite-3 by apache.

the class RaftGroupService method start.

/**
 * Starts the raft group service, returns the raft node.
 */
public synchronized Node start() {
    if (this.started) {
        return this.node;
    }
    if (this.serverId == null || this.serverId.getEndpoint() == null || this.serverId.getEndpoint().equals(new Endpoint(Utils.IP_ANY, 0))) {
        throw new IllegalArgumentException("Blank serverId:" + this.serverId);
    }
    if (StringUtils.isBlank(this.groupId)) {
        throw new IllegalArgumentException("Blank group id" + this.groupId);
    }
    assert this.nodeOptions.getRpcClient() != null;
    this.node = new NodeImpl(groupId, serverId);
    if (!this.node.init(this.nodeOptions)) {
        LOG.warn("Stopping partially started node [groupId={}, serverId={}]", groupId, serverId);
        this.node.shutdown();
        try {
            this.node.join();
        } catch (InterruptedException e) {
            throw new IgniteInternalException(e);
        }
        throw new IgniteInternalException("Fail to init node, please see the logs to find the reason.");
    }
    this.nodeManager.add(this.node);
    this.started = true;
    LOG.info("Start the RaftGroupService successfully {}", this.node.getNodeId());
    return this.node;
}
Also used : Endpoint(org.apache.ignite.raft.jraft.util.Endpoint) NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl) IgniteInternalException(org.apache.ignite.lang.IgniteInternalException)

Example 3 with NodeImpl

use of org.apache.ignite.raft.jraft.core.NodeImpl in project ignite-3 by apache.

the class ItJraftCounterServerTest method hasLeader.

/**
 * Returns {@code true} if a raft group has elected a leader for a some term.
 *
 * @param grpId Group id.
 * @return {@code True} if a leader is elected.
 */
private boolean hasLeader(String grpId) {
    return servers.stream().anyMatch(s -> {
        NodeImpl node = (NodeImpl) s.raftGroupService(grpId).getRaftNode();
        StateMachineAdapter fsm = (StateMachineAdapter) node.getOptions().getFsm();
        return node.isLeader() && fsm.getLeaderTerm() == node.getCurrentTerm();
    });
}
Also used : StateMachineAdapter(org.apache.ignite.raft.jraft.core.StateMachineAdapter) NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl)

Example 4 with NodeImpl

use of org.apache.ignite.raft.jraft.core.NodeImpl in project ignite-3 by apache.

the class ItJraftCounterServerTest method testApplyWithFailure.

/**
 * Tests if a raft group become unavailable in case of a critical error.
 */
@Test
public void testApplyWithFailure() throws Exception {
    listenerFactory = () -> new CounterListener() {

        @Override
        public void onWrite(Iterator<CommandClosure<WriteCommand>> iterator) {
            Iterator<CommandClosure<WriteCommand>> wrapper = new Iterator<>() {

                @Override
                public boolean hasNext() {
                    return iterator.hasNext();
                }

                @Override
                public CommandClosure<WriteCommand> next() {
                    CommandClosure<WriteCommand> cmd = iterator.next();
                    IncrementAndGetCommand command = (IncrementAndGetCommand) cmd.command();
                    if (command.delta() == 10) {
                        throw new IgniteInternalException("Very bad");
                    }
                    return cmd;
                }
            };
            super.onWrite(wrapper);
        }
    };
    startCluster();
    RaftGroupService client1 = clients.get(0);
    RaftGroupService client2 = clients.get(1);
    client1.refreshLeader().get();
    client2.refreshLeader().get();
    NodeImpl leader = servers.stream().map(s -> ((NodeImpl) s.raftGroupService(COUNTER_GROUP_0).getRaftNode())).filter(n -> n.getState() == STATE_LEADER).findFirst().orElse(null);
    assertNotNull(leader);
    long val1 = applyIncrements(client1, 1, 5);
    long val2 = applyIncrements(client2, 1, 7);
    assertEquals(sum(5), val1);
    assertEquals(sum(7), val2);
    long val3 = applyIncrements(client1, 6, 9);
    assertEquals(sum(9), val3);
    try {
        client1.<Long>run(new IncrementAndGetCommand(10)).get();
        fail();
    } catch (Exception e) {
        // Expected.
        Throwable cause = e.getCause();
        assertTrue(cause instanceof RaftException);
    }
    NodeImpl finalLeader = leader;
    waitForCondition(() -> finalLeader.getState() == STATE_ERROR, 5_000);
    // Client can't switch to new leader, because only one peer in the list.
    try {
        client1.<Long>run(new IncrementAndGetCommand(11)).get();
    } catch (Exception e) {
        boolean isValid = e.getCause() instanceof TimeoutException;
        if (!isValid) {
            LOG.error("Got unexpected exception", e);
        }
        assertTrue(isValid, "Expecting the timeout");
    }
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) TimeoutException(java.util.concurrent.TimeoutException) IgniteLogger(org.apache.ignite.lang.IgniteLogger) Future(java.util.concurrent.Future) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) RaftGroupService(org.apache.ignite.raft.client.service.RaftGroupService) JraftServerImpl(org.apache.ignite.internal.raft.server.impl.JraftServerImpl) TestUtils.getLocalAddress(org.apache.ignite.raft.jraft.test.TestUtils.getLocalAddress) Path(java.nio.file.Path) CommandClosure(org.apache.ignite.raft.client.service.CommandClosure) Collectors.toSet(java.util.stream.Collectors.toSet) STATE_ERROR(org.apache.ignite.raft.jraft.core.State.STATE_ERROR) Set(java.util.Set) ScheduledThreadPoolExecutor(java.util.concurrent.ScheduledThreadPoolExecutor) Collectors(java.util.stream.Collectors) TestUtils(org.apache.ignite.raft.jraft.test.TestUtils) ExecutorServiceHelper(org.apache.ignite.raft.jraft.util.ExecutorServiceHelper) Executors(java.util.concurrent.Executors) RaftServer(org.apache.ignite.internal.raft.server.RaftServer) ReadCommand(org.apache.ignite.raft.client.ReadCommand) Test(org.junit.jupiter.api.Test) List(java.util.List) Stream(java.util.stream.Stream) IgniteInternalException(org.apache.ignite.lang.IgniteInternalException) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) NotNull(org.jetbrains.annotations.NotNull) RaftGroupServiceImpl(org.apache.ignite.raft.jraft.rpc.impl.RaftGroupServiceImpl) Assertions.fail(org.junit.jupiter.api.Assertions.fail) IntStream(java.util.stream.IntStream) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) Assertions.assertNull(org.junit.jupiter.api.Assertions.assertNull) Loza(org.apache.ignite.internal.raft.Loza) Supplier(java.util.function.Supplier) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) ArrayList(java.util.ArrayList) TestUtils.waitForTopology(org.apache.ignite.raft.jraft.test.TestUtils.waitForTopology) WriteCommand(org.apache.ignite.raft.client.WriteCommand) IgniteUtils(org.apache.ignite.internal.util.IgniteUtils) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Comparator.comparing(java.util.Comparator.comparing) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) ExecutorService(java.util.concurrent.ExecutorService) TestUtils.waitForCondition(org.apache.ignite.raft.jraft.test.TestUtils.waitForCondition) StateMachineAdapter(org.apache.ignite.raft.jraft.core.StateMachineAdapter) Iterator(java.util.Iterator) Files(java.nio.file.Files) IOException(java.io.IOException) NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl) WorkDirectory(org.apache.ignite.internal.testframework.WorkDirectory) NetworkAddress(org.apache.ignite.network.NetworkAddress) STATE_LEADER(org.apache.ignite.raft.jraft.core.State.STATE_LEADER) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) Collectors.toList(java.util.stream.Collectors.toList) Peer(org.apache.ignite.raft.client.Peer) AfterEach(org.junit.jupiter.api.AfterEach) ClusterService(org.apache.ignite.network.ClusterService) NamedThreadFactory(org.apache.ignite.internal.thread.NamedThreadFactory) WorkDirectoryExtension(org.apache.ignite.internal.testframework.WorkDirectoryExtension) RaftException(org.apache.ignite.raft.jraft.rpc.impl.RaftException) WriteCommand(org.apache.ignite.raft.client.WriteCommand) RaftException(org.apache.ignite.raft.jraft.rpc.impl.RaftException) NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl) IgniteInternalException(org.apache.ignite.lang.IgniteInternalException) RaftGroupService(org.apache.ignite.raft.client.service.RaftGroupService) TimeoutException(java.util.concurrent.TimeoutException) IgniteInternalException(org.apache.ignite.lang.IgniteInternalException) IOException(java.io.IOException) RaftException(org.apache.ignite.raft.jraft.rpc.impl.RaftException) Iterator(java.util.Iterator) CommandClosure(org.apache.ignite.raft.client.service.CommandClosure) TimeoutException(java.util.concurrent.TimeoutException) Test(org.junit.jupiter.api.Test)

Example 5 with NodeImpl

use of org.apache.ignite.raft.jraft.core.NodeImpl in project ignite-3 by apache.

the class ItJraftCounterServerTest method testClientCatchExceptionFromSm.

/**
 * Tests that users related exceptions from SM are propagated to the client.
 */
@Test
public void testClientCatchExceptionFromSm() throws Exception {
    listenerFactory = () -> new CounterListener() {

        @Override
        public void onWrite(Iterator<CommandClosure<WriteCommand>> iterator) {
            while (iterator.hasNext()) {
                CommandClosure<WriteCommand> clo = iterator.next();
                IncrementAndGetCommand cmd0 = (IncrementAndGetCommand) clo.command();
                clo.result(new RuntimeException("Expected message"));
            }
        }

        @Override
        public void onRead(Iterator<CommandClosure<ReadCommand>> iterator) {
            while (iterator.hasNext()) {
                CommandClosure<ReadCommand> clo = iterator.next();
                assert clo.command() instanceof GetValueCommand;
                clo.result(new RuntimeException("Another expected message"));
            }
        }
    };
    startCluster();
    RaftGroupService client1 = clients.get(0);
    RaftGroupService client2 = clients.get(1);
    client1.refreshLeader().get();
    client2.refreshLeader().get();
    NodeImpl leader = servers.stream().map(s -> ((NodeImpl) s.raftGroupService(COUNTER_GROUP_0).getRaftNode())).filter(n -> n.getState() == STATE_LEADER).findFirst().orElse(null);
    assertNotNull(leader);
    try {
        client1.<Long>run(new IncrementAndGetCommand(3)).get();
        fail();
    } catch (Exception e) {
        // Expected.
        Throwable cause = e.getCause();
        assertTrue(cause instanceof RuntimeException);
        assertEquals(cause.getMessage(), "Expected message");
    }
    try {
        client1.<Long>run(new GetValueCommand()).get();
        fail();
    } catch (Exception e) {
        // Expected.
        Throwable cause = e.getCause();
        assertTrue(cause instanceof RuntimeException);
        assertEquals(cause.getMessage(), "Another expected message");
    }
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) TimeoutException(java.util.concurrent.TimeoutException) IgniteLogger(org.apache.ignite.lang.IgniteLogger) Future(java.util.concurrent.Future) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) RaftGroupService(org.apache.ignite.raft.client.service.RaftGroupService) JraftServerImpl(org.apache.ignite.internal.raft.server.impl.JraftServerImpl) TestUtils.getLocalAddress(org.apache.ignite.raft.jraft.test.TestUtils.getLocalAddress) Path(java.nio.file.Path) CommandClosure(org.apache.ignite.raft.client.service.CommandClosure) Collectors.toSet(java.util.stream.Collectors.toSet) STATE_ERROR(org.apache.ignite.raft.jraft.core.State.STATE_ERROR) Set(java.util.Set) ScheduledThreadPoolExecutor(java.util.concurrent.ScheduledThreadPoolExecutor) Collectors(java.util.stream.Collectors) TestUtils(org.apache.ignite.raft.jraft.test.TestUtils) ExecutorServiceHelper(org.apache.ignite.raft.jraft.util.ExecutorServiceHelper) Executors(java.util.concurrent.Executors) RaftServer(org.apache.ignite.internal.raft.server.RaftServer) ReadCommand(org.apache.ignite.raft.client.ReadCommand) Test(org.junit.jupiter.api.Test) List(java.util.List) Stream(java.util.stream.Stream) IgniteInternalException(org.apache.ignite.lang.IgniteInternalException) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) NotNull(org.jetbrains.annotations.NotNull) RaftGroupServiceImpl(org.apache.ignite.raft.jraft.rpc.impl.RaftGroupServiceImpl) Assertions.fail(org.junit.jupiter.api.Assertions.fail) IntStream(java.util.stream.IntStream) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) Assertions.assertNull(org.junit.jupiter.api.Assertions.assertNull) Loza(org.apache.ignite.internal.raft.Loza) Supplier(java.util.function.Supplier) NodeOptions(org.apache.ignite.raft.jraft.option.NodeOptions) ArrayList(java.util.ArrayList) TestUtils.waitForTopology(org.apache.ignite.raft.jraft.test.TestUtils.waitForTopology) WriteCommand(org.apache.ignite.raft.client.WriteCommand) IgniteUtils(org.apache.ignite.internal.util.IgniteUtils) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) Comparator.comparing(java.util.Comparator.comparing) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) ExecutorService(java.util.concurrent.ExecutorService) TestUtils.waitForCondition(org.apache.ignite.raft.jraft.test.TestUtils.waitForCondition) StateMachineAdapter(org.apache.ignite.raft.jraft.core.StateMachineAdapter) Iterator(java.util.Iterator) Files(java.nio.file.Files) IOException(java.io.IOException) NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl) WorkDirectory(org.apache.ignite.internal.testframework.WorkDirectory) NetworkAddress(org.apache.ignite.network.NetworkAddress) STATE_LEADER(org.apache.ignite.raft.jraft.core.State.STATE_LEADER) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) Collectors.toList(java.util.stream.Collectors.toList) Peer(org.apache.ignite.raft.client.Peer) AfterEach(org.junit.jupiter.api.AfterEach) ClusterService(org.apache.ignite.network.ClusterService) NamedThreadFactory(org.apache.ignite.internal.thread.NamedThreadFactory) WorkDirectoryExtension(org.apache.ignite.internal.testframework.WorkDirectoryExtension) RaftException(org.apache.ignite.raft.jraft.rpc.impl.RaftException) NodeImpl(org.apache.ignite.raft.jraft.core.NodeImpl) RaftGroupService(org.apache.ignite.raft.client.service.RaftGroupService) TimeoutException(java.util.concurrent.TimeoutException) IgniteInternalException(org.apache.ignite.lang.IgniteInternalException) IOException(java.io.IOException) RaftException(org.apache.ignite.raft.jraft.rpc.impl.RaftException) CommandClosure(org.apache.ignite.raft.client.service.CommandClosure) Test(org.junit.jupiter.api.Test)

Aggregations

NodeImpl (org.apache.ignite.raft.jraft.core.NodeImpl)6 IgniteInternalException (org.apache.ignite.lang.IgniteInternalException)3 StateMachineAdapter (org.apache.ignite.raft.jraft.core.StateMachineAdapter)3 NodeOptions (org.apache.ignite.raft.jraft.option.NodeOptions)3 IOException (java.io.IOException)2 Files (java.nio.file.Files)2 Path (java.nio.file.Path)2 ArrayList (java.util.ArrayList)2 Comparator.comparing (java.util.Comparator.comparing)2 Iterator (java.util.Iterator)2 List (java.util.List)2 Set (java.util.Set)2 ExecutorService (java.util.concurrent.ExecutorService)2 Executors (java.util.concurrent.Executors)2 Future (java.util.concurrent.Future)2 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)2 ScheduledThreadPoolExecutor (java.util.concurrent.ScheduledThreadPoolExecutor)2 TimeUnit (java.util.concurrent.TimeUnit)2 TimeoutException (java.util.concurrent.TimeoutException)2 Consumer (java.util.function.Consumer)2