Search in sources :

Example 1 with CommandClosure

use of org.apache.ignite.raft.client.service.CommandClosure in project ignite-3 by apache.

the class RaftServerImpl method processQueue.

/**
 * Process the queue.
 *
 * @param queue The queue.
 * @param clo   The closure.
 * @param <T>   Command type.
 */
private <T extends Command> void processQueue(BlockingQueue<CommandClosureEx<T>> queue, BiConsumer<RaftGroupListener, Iterator<CommandClosure<T>>> clo) {
    while (!Thread.interrupted()) {
        try {
            CommandClosureEx<T> cmdClo = queue.take();
            RaftGroupListener lsnr = cmdClo.listener();
            clo.accept(lsnr, List.<CommandClosure<T>>of(cmdClo).iterator());
        } catch (InterruptedException e0) {
            return;
        } catch (Exception e) {
            LOG.error("Failed to process the command", e);
        }
    }
}
Also used : RaftGroupListener(org.apache.ignite.raft.client.service.RaftGroupListener) NodeStoppingException(org.apache.ignite.lang.NodeStoppingException) CommandClosure(org.apache.ignite.raft.client.service.CommandClosure)

Example 2 with CommandClosure

use of org.apache.ignite.raft.client.service.CommandClosure 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 3 with CommandClosure

use of org.apache.ignite.raft.client.service.CommandClosure 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

CommandClosure (org.apache.ignite.raft.client.service.CommandClosure)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 Supplier (java.util.function.Supplier)2 Collectors (java.util.stream.Collectors)2 Collectors.toList (java.util.stream.Collectors.toList)2