Search in sources :

Example 1 with ReadIndexClosure

use of com.alipay.sofa.jraft.closure.ReadIndexClosure in project sofa-jraft by sofastack.

the class NodeTest method testReadIndex.

@Test
public void testReadIndex() throws Exception {
    final List<PeerId> peers = TestUtils.generatePeers(3);
    final TestCluster cluster = new TestCluster("unittest", this.dataPath, peers);
    for (final PeerId peer : peers) {
        assertTrue(cluster.start(peer.getEndpoint(), false, 300, true));
    }
    // elect leader
    cluster.waitLeader();
    // get leader
    final Node leader = cluster.getLeader();
    assertNotNull(leader);
    assertEquals(3, leader.listPeers().size());
    // apply tasks to leader
    this.sendTestTaskAndWait(leader);
    // first call will fail-fast when no connection
    if (!assertReadIndex(leader, 11)) {
        assertTrue(assertReadIndex(leader, 11));
    }
    // read from follower
    for (final Node follower : cluster.getFollowers()) {
        assertNotNull(follower);
        assertReadIndex(follower, 11);
    }
    // read with null request context
    final CountDownLatch latch = new CountDownLatch(1);
    leader.readIndex(null, new ReadIndexClosure() {

        @Override
        public void run(final Status status, final long index, final byte[] reqCtx) {
            assertNull(reqCtx);
            assertTrue(status.isOk());
            latch.countDown();
        }
    });
    latch.await();
    cluster.stopAll();
}
Also used : Status(com.alipay.sofa.jraft.Status) ReadIndexClosure(com.alipay.sofa.jraft.closure.ReadIndexClosure) Node(com.alipay.sofa.jraft.Node) CountDownLatch(java.util.concurrent.CountDownLatch) PeerId(com.alipay.sofa.jraft.entity.PeerId) Test(org.junit.Test)

Example 2 with ReadIndexClosure

use of com.alipay.sofa.jraft.closure.ReadIndexClosure in project sofa-jraft by sofastack.

the class NodeTest method testReadIndexChaos.

@Test
public void testReadIndexChaos() throws Exception {
    final List<PeerId> peers = TestUtils.generatePeers(3);
    final TestCluster cluster = new TestCluster("unittest", this.dataPath, peers);
    for (final PeerId peer : peers) {
        assertTrue(cluster.start(peer.getEndpoint(), false, 300, true));
    }
    // elect leader
    cluster.waitLeader();
    // get leader
    final Node leader = cluster.getLeader();
    assertNotNull(leader);
    assertEquals(3, leader.listPeers().size());
    final CountDownLatch latch = new CountDownLatch(10);
    for (int i = 0; i < 10; i++) {
        new Thread() {

            @Override
            public void run() {
                try {
                    for (int i = 0; i < 100; i++) {
                        try {
                            sendTestTaskAndWait(leader);
                        } catch (final InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                        readIndexRandom(cluster);
                    }
                } finally {
                    latch.countDown();
                }
            }

            private void readIndexRandom(final TestCluster cluster) {
                final CountDownLatch readLatch = new CountDownLatch(1);
                final byte[] requestContext = TestUtils.getRandomBytes();
                cluster.getNodes().get(ThreadLocalRandom.current().nextInt(3)).readIndex(requestContext, new ReadIndexClosure() {

                    @Override
                    public void run(final Status status, final long index, final byte[] reqCtx) {
                        if (status.isOk()) {
                            assertTrue(status.toString(), status.isOk());
                            assertTrue(index > 0);
                            assertArrayEquals(requestContext, reqCtx);
                        }
                        readLatch.countDown();
                    }
                });
                try {
                    readLatch.await();
                } catch (final InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        }.start();
    }
    latch.await();
    cluster.ensureSame();
    for (final MockStateMachine fsm : cluster.getFsms()) {
        assertEquals(10000, fsm.getLogs().size());
    }
    cluster.stopAll();
}
Also used : Status(com.alipay.sofa.jraft.Status) ReadIndexClosure(com.alipay.sofa.jraft.closure.ReadIndexClosure) Node(com.alipay.sofa.jraft.Node) CountDownLatch(java.util.concurrent.CountDownLatch) Endpoint(com.alipay.sofa.jraft.util.Endpoint) PeerId(com.alipay.sofa.jraft.entity.PeerId) Test(org.junit.Test)

Example 3 with ReadIndexClosure

use of com.alipay.sofa.jraft.closure.ReadIndexClosure in project sofa-jraft by sofastack.

the class ReadOnlyServiceTest method testAddRequestOnResponseSuccess.

@Test
public void testAddRequestOnResponseSuccess() throws Exception {
    Mockito.when(this.fsmCaller.getLastAppliedIndex()).thenReturn(2L);
    final byte[] requestContext = TestUtils.getRandomBytes();
    final CountDownLatch latch = new CountDownLatch(1);
    this.readOnlyServiceImpl.addRequest(requestContext, new ReadIndexClosure() {

        @Override
        public void run(final Status status, final long index, final byte[] reqCtx) {
            assertTrue(status.isOk());
            assertEquals(index, 1);
            assertArrayEquals(reqCtx, requestContext);
            latch.countDown();
        }
    });
    this.readOnlyServiceImpl.flush();
    final ArgumentCaptor<RpcResponseClosure> closureCaptor = ArgumentCaptor.forClass(RpcResponseClosure.class);
    Mockito.verify(this.node).handleReadIndexRequest(Mockito.argThat(new ArgumentMatcher<ReadIndexRequest>() {

        @Override
        public boolean matches(final Object argument) {
            if (argument instanceof ReadIndexRequest) {
                final ReadIndexRequest req = (ReadIndexRequest) argument;
                return req.getGroupId().equals("test") && req.getServerId().equals("localhost:8081:0") && req.getEntriesCount() == 1 && Arrays.equals(requestContext, req.getEntries(0).toByteArray());
            }
            return false;
        }
    }), closureCaptor.capture());
    final RpcResponseClosure closure = closureCaptor.getValue();
    assertNotNull(closure);
    closure.setResponse(ReadIndexResponse.newBuilder().setIndex(1).setSuccess(true).build());
    closure.run(Status.OK());
    latch.await();
}
Also used : Status(com.alipay.sofa.jraft.Status) ReadIndexStatus(com.alipay.sofa.jraft.entity.ReadIndexStatus) ReadIndexRequest(com.alipay.sofa.jraft.rpc.RpcRequests.ReadIndexRequest) ReadIndexClosure(com.alipay.sofa.jraft.closure.ReadIndexClosure) ArgumentMatcher(org.mockito.ArgumentMatcher) RpcResponseClosure(com.alipay.sofa.jraft.rpc.RpcResponseClosure) CountDownLatch(java.util.concurrent.CountDownLatch) Test(org.junit.Test)

Example 4 with ReadIndexClosure

use of com.alipay.sofa.jraft.closure.ReadIndexClosure in project sofa-jraft by sofastack.

the class ReadOnlyServiceTest method testOnApplied.

@Test
public void testOnApplied() throws Exception {
    final ArrayList<ReadIndexState> states = new ArrayList<>();
    final byte[] reqContext = TestUtils.getRandomBytes();
    final CountDownLatch latch = new CountDownLatch(1);
    final ReadIndexState state = new ReadIndexState(new Bytes(reqContext), new ReadIndexClosure() {

        @Override
        public void run(final Status status, final long index, final byte[] reqCtx) {
            assertTrue(status.isOk());
            assertEquals(index, 1);
            assertArrayEquals(reqCtx, reqContext);
            latch.countDown();
        }
    }, Utils.monotonicMs());
    state.setIndex(1);
    states.add(state);
    final ReadIndexStatus readIndexStatus = new ReadIndexStatus(states, null, 1);
    this.readOnlyServiceImpl.getPendingNotifyStatus().put(1L, Arrays.asList(readIndexStatus));
    this.readOnlyServiceImpl.onApplied(2);
    latch.await();
    assertTrue(this.readOnlyServiceImpl.getPendingNotifyStatus().isEmpty());
}
Also used : Status(com.alipay.sofa.jraft.Status) ReadIndexStatus(com.alipay.sofa.jraft.entity.ReadIndexStatus) Bytes(com.alipay.sofa.jraft.util.Bytes) ReadIndexClosure(com.alipay.sofa.jraft.closure.ReadIndexClosure) ReadIndexStatus(com.alipay.sofa.jraft.entity.ReadIndexStatus) ReadIndexState(com.alipay.sofa.jraft.entity.ReadIndexState) ArrayList(java.util.ArrayList) CountDownLatch(java.util.concurrent.CountDownLatch) Test(org.junit.Test)

Example 5 with ReadIndexClosure

use of com.alipay.sofa.jraft.closure.ReadIndexClosure in project sofa-jraft by sofastack.

the class ReadOnlyServiceTest method testAddRequestOnResponsePending.

@Test
public void testAddRequestOnResponsePending() throws Exception {
    final byte[] requestContext = TestUtils.getRandomBytes();
    final CountDownLatch latch = new CountDownLatch(1);
    this.readOnlyServiceImpl.addRequest(requestContext, new ReadIndexClosure() {

        @Override
        public void run(final Status status, final long index, final byte[] reqCtx) {
            assertTrue(status.isOk());
            assertEquals(index, 1);
            assertArrayEquals(reqCtx, requestContext);
            latch.countDown();
        }
    });
    this.readOnlyServiceImpl.flush();
    final ArgumentCaptor<RpcResponseClosure> closureCaptor = ArgumentCaptor.forClass(RpcResponseClosure.class);
    Mockito.verify(this.node).handleReadIndexRequest(Mockito.argThat(new ArgumentMatcher<ReadIndexRequest>() {

        @Override
        public boolean matches(final Object argument) {
            if (argument instanceof ReadIndexRequest) {
                final ReadIndexRequest req = (ReadIndexRequest) argument;
                return req.getGroupId().equals("test") && req.getServerId().equals("localhost:8081:0") && req.getEntriesCount() == 1 && Arrays.equals(requestContext, req.getEntries(0).toByteArray());
            }
            return false;
        }
    }), closureCaptor.capture());
    final RpcResponseClosure closure = closureCaptor.getValue();
    assertNotNull(closure);
    closure.setResponse(ReadIndexResponse.newBuilder().setIndex(1).setSuccess(true).build());
    assertTrue(this.readOnlyServiceImpl.getPendingNotifyStatus().isEmpty());
    closure.run(Status.OK());
    assertEquals(this.readOnlyServiceImpl.getPendingNotifyStatus().size(), 1);
    this.readOnlyServiceImpl.onApplied(2);
    latch.await();
}
Also used : Status(com.alipay.sofa.jraft.Status) ReadIndexStatus(com.alipay.sofa.jraft.entity.ReadIndexStatus) ReadIndexRequest(com.alipay.sofa.jraft.rpc.RpcRequests.ReadIndexRequest) ReadIndexClosure(com.alipay.sofa.jraft.closure.ReadIndexClosure) ArgumentMatcher(org.mockito.ArgumentMatcher) RpcResponseClosure(com.alipay.sofa.jraft.rpc.RpcResponseClosure) CountDownLatch(java.util.concurrent.CountDownLatch) Test(org.junit.Test)

Aggregations

ReadIndexClosure (com.alipay.sofa.jraft.closure.ReadIndexClosure)18 Status (com.alipay.sofa.jraft.Status)15 CountDownLatch (java.util.concurrent.CountDownLatch)11 Test (org.junit.Test)10 ReadIndexStatus (com.alipay.sofa.jraft.entity.ReadIndexStatus)7 ReadIndexRequest (com.alipay.sofa.jraft.rpc.RpcRequests.ReadIndexRequest)6 Node (com.alipay.sofa.jraft.Node)5 ArgumentMatcher (org.mockito.ArgumentMatcher)5 PeerId (com.alipay.sofa.jraft.entity.PeerId)4 ReadIndexState (com.alipay.sofa.jraft.entity.ReadIndexState)4 RpcResponseClosure (com.alipay.sofa.jraft.rpc.RpcResponseClosure)4 Bytes (com.alipay.sofa.jraft.util.Bytes)2 Endpoint (com.alipay.sofa.jraft.util.Endpoint)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 RequestProcessor (com.alibaba.nacos.consistency.RequestProcessor)1 Response (com.alibaba.nacos.consistency.entity.Response)1 ConsistencyException (com.alibaba.nacos.consistency.exception.ConsistencyException)1 NoSuchRaftGroupException (com.alibaba.nacos.core.distributed.raft.exception.NoSuchRaftGroupException)1 FSMCaller (com.alipay.sofa.jraft.FSMCaller)1 LastAppliedLogIndexListener (com.alipay.sofa.jraft.FSMCaller.LastAppliedLogIndexListener)1