Search in sources :

Example 1 with STATE_ERROR

use of org.apache.ignite.raft.jraft.core.State.STATE_ERROR 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)

Aggregations

IOException (java.io.IOException)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1 ArrayList (java.util.ArrayList)1 Comparator.comparing (java.util.Comparator.comparing)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Set (java.util.Set)1 ExecutorService (java.util.concurrent.ExecutorService)1 Executors (java.util.concurrent.Executors)1 Future (java.util.concurrent.Future)1 ScheduledExecutorService (java.util.concurrent.ScheduledExecutorService)1 ScheduledThreadPoolExecutor (java.util.concurrent.ScheduledThreadPoolExecutor)1 TimeUnit (java.util.concurrent.TimeUnit)1 TimeoutException (java.util.concurrent.TimeoutException)1 Consumer (java.util.function.Consumer)1 Supplier (java.util.function.Supplier)1 Collectors (java.util.stream.Collectors)1 Collectors.toList (java.util.stream.Collectors.toList)1 Collectors.toSet (java.util.stream.Collectors.toSet)1