Search in sources :

Example 31 with RaftClient

use of org.apache.ratis.client.RaftClient in project incubator-ratis by apache.

the class CounterClient method main.

@SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
public static void main(String[] args) throws IOException, InterruptedException {
    // indicate the number of INCREMENT command, set 10 if no parameter passed
    int increment = args.length > 0 ? Integer.parseInt(args[0]) : 10;
    // build the counter cluster client
    RaftClient raftClient = buildClient();
    // use a executor service with 10 thread to send INCREMENT commands
    // concurrently
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    // send INCREMENT commands concurrently
    System.out.printf("Sending %d increment command...%n", increment);
    for (int i = 0; i < increment; i++) {
        executorService.submit(() -> raftClient.io().send(Message.valueOf("INCREMENT")));
    }
    // shutdown the executor service and wait until they finish their work
    executorService.shutdown();
    executorService.awaitTermination(increment * 500L, TimeUnit.MILLISECONDS);
    // send GET command and print the response
    RaftClientReply count = raftClient.io().sendReadOnly(Message.valueOf("GET"));
    String response = count.getMessage().getContent().toString(Charset.defaultCharset());
    System.out.println(response);
}
Also used : RaftClientReply(org.apache.ratis.protocol.RaftClientReply) ExecutorService(java.util.concurrent.ExecutorService) RaftClient(org.apache.ratis.client.RaftClient) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 32 with RaftClient

use of org.apache.ratis.client.RaftClient in project incubator-ratis by apache.

the class GroupManagementBaseTest method testGroupRemoveWhenRename.

@Test
public void testGroupRemoveWhenRename() throws Exception {
    final MiniRaftCluster cluster1 = getCluster(1);
    RaftServerConfigKeys.setRemovedGroupsDir(cluster1.getProperties(), Files.createTempDirectory("groups").toFile());
    final MiniRaftCluster cluster2 = getCluster(3);
    cluster1.start();
    final RaftPeer peer1 = cluster1.getPeers().get(0);
    final RaftPeerId peerId1 = peer1.getId();
    final RaftGroup group1 = RaftGroup.valueOf(cluster1.getGroupId(), peer1);
    final RaftGroup group2 = RaftGroup.valueOf(cluster2.getGroupId(), peer1);
    try (final RaftClient client = cluster1.createClient()) {
        Assert.assertEquals(group1, cluster1.getDivision(peerId1).getGroup());
        try {
            // Group2 is added to one of the peers in Group1
            final GroupManagementApi api1 = client.getGroupManagementApi(peerId1);
            api1.add(group2);
            List<RaftGroupId> groupIds1 = cluster1.getServer(peerId1).getGroupIds();
            Assert.assertEquals(groupIds1.size(), 2);
            // Group2 is renamed from the peer1 of Group1
            api1.remove(group2.getGroupId(), false, true);
            groupIds1 = cluster1.getServer(peerId1).getGroupIds();
            Assert.assertEquals(groupIds1.size(), 1);
            cluster1.restart(false);
            List<RaftGroupId> groupIdsAfterRestart = cluster1.getServer(peerId1).getGroupIds();
            Assert.assertEquals(groupIds1.size(), groupIdsAfterRestart.size());
            File renamedGroup = new File(RaftServerConfigKeys.removedGroupsDir(cluster1.getProperties()), group2.getGroupId().getUuid().toString());
            Assert.assertTrue(renamedGroup.isDirectory());
        } catch (IOException ex) {
            Assert.fail();
        } finally {
            cluster1.shutdown();
            // Clean up
            FileUtils.deleteFully(RaftServerConfigKeys.removedGroupsDir(cluster1.getProperties()));
        }
    }
}
Also used : GroupManagementApi(org.apache.ratis.client.api.GroupManagementApi) RaftGroupId(org.apache.ratis.protocol.RaftGroupId) RaftPeerId(org.apache.ratis.protocol.RaftPeerId) RaftGroup(org.apache.ratis.protocol.RaftGroup) IOException(java.io.IOException) RaftPeer(org.apache.ratis.protocol.RaftPeer) File(java.io.File) RaftClient(org.apache.ratis.client.RaftClient) Test(org.junit.Test) BaseTest(org.apache.ratis.BaseTest)

Example 33 with RaftClient

use of org.apache.ratis.client.RaftClient in project incubator-ratis by apache.

the class GroupManagementBaseTest method testSingleGroupRestart.

@Test
public void testSingleGroupRestart() throws Exception {
    final MiniRaftCluster cluster = getCluster(0);
    LOG.info("Start testMultiGroup" + cluster.printServers());
    // Start server with null group
    final List<RaftPeerId> ids = Arrays.stream(MiniRaftCluster.generateIds(3, 0)).map(RaftPeerId::valueOf).collect(Collectors.toList());
    ids.forEach(id -> cluster.putNewServer(id, null, true));
    LOG.info("putNewServer: " + cluster.printServers());
    cluster.start();
    // Make sure that there are no leaders.
    TimeUnit.SECONDS.sleep(1);
    LOG.info("start: " + cluster.printServers());
    Assert.assertNull(cluster.getLeader());
    // Add groups
    final RaftGroup newGroup = RaftGroup.valueOf(RaftGroupId.randomId(), cluster.getPeers());
    LOG.info("add new group: " + newGroup);
    try (final RaftClient client = cluster.createClient(newGroup)) {
        for (RaftPeer p : newGroup.getPeers()) {
            client.getGroupManagementApi(p.getId()).add(newGroup);
        }
    }
    Assert.assertNotNull(RaftTestUtil.waitForLeader(cluster));
    TimeUnit.SECONDS.sleep(1);
    // restart the servers with null group
    LOG.info("restart servers");
    for (RaftPeer p : newGroup.getPeers()) {
        cluster.restartServer(p.getId(), null, false);
    }
    // the servers should retrieve the conf from the log.
    Assert.assertNotNull(RaftTestUtil.waitForLeader(cluster));
    cluster.shutdown();
}
Also used : RaftPeerId(org.apache.ratis.protocol.RaftPeerId) RaftGroup(org.apache.ratis.protocol.RaftGroup) RaftPeer(org.apache.ratis.protocol.RaftPeer) RaftClient(org.apache.ratis.client.RaftClient) Test(org.junit.Test) BaseTest(org.apache.ratis.BaseTest)

Example 34 with RaftClient

use of org.apache.ratis.client.RaftClient in project incubator-ratis by apache.

the class GroupManagementBaseTest method testGroupRemoveWhenDelete.

@Test
public void testGroupRemoveWhenDelete() throws Exception {
    final MiniRaftCluster cluster1 = getCluster(1);
    RaftServerConfigKeys.setRemovedGroupsDir(cluster1.getProperties(), Files.createTempDirectory("groups").toFile());
    final MiniRaftCluster cluster2 = getCluster(3);
    cluster1.start();
    final RaftPeer peer1 = cluster1.getPeers().get(0);
    final RaftPeerId peerId1 = peer1.getId();
    final RaftGroup group1 = RaftGroup.valueOf(cluster1.getGroupId(), peer1);
    final RaftGroup group2 = RaftGroup.valueOf(cluster2.getGroupId(), peer1);
    try (final RaftClient client = cluster1.createClient()) {
        Assert.assertEquals(group1, cluster1.getDivision(peerId1).getGroup());
        try {
            // Group2 is added again to one of the peers in Group1
            final GroupManagementApi api1 = client.getGroupManagementApi(peerId1);
            api1.add(group2);
            List<RaftGroupId> groupIds1 = cluster1.getServer(peerId1).getGroupIds();
            Assert.assertEquals(groupIds1.size(), 2);
            // Group2 is deleted from the peer1 of Group1
            api1.remove(group2.getGroupId(), true, false);
            groupIds1 = cluster1.getServer(peerId1).getGroupIds();
            Assert.assertEquals(groupIds1.size(), 1);
            cluster1.restart(false);
            List<RaftGroupId> groupIdsAfterRestart = cluster1.getServer(peerId1).getGroupIds();
            Assert.assertEquals(groupIds1.size(), groupIdsAfterRestart.size());
        } catch (IOException ex) {
            Assert.fail();
        } finally {
            cluster1.shutdown();
            FileUtils.deleteFully(RaftServerConfigKeys.removedGroupsDir(cluster1.getProperties()));
        }
    }
}
Also used : GroupManagementApi(org.apache.ratis.client.api.GroupManagementApi) RaftGroupId(org.apache.ratis.protocol.RaftGroupId) RaftPeerId(org.apache.ratis.protocol.RaftPeerId) RaftGroup(org.apache.ratis.protocol.RaftGroup) IOException(java.io.IOException) RaftPeer(org.apache.ratis.protocol.RaftPeer) RaftClient(org.apache.ratis.client.RaftClient) Test(org.junit.Test) BaseTest(org.apache.ratis.BaseTest)

Example 35 with RaftClient

use of org.apache.ratis.client.RaftClient in project incubator-ratis by apache.

the class GroupManagementBaseTest method runMultiGroupTest.

public static <T extends Throwable> void runMultiGroupTest(MiniRaftCluster cluster, int[] idIndex, int chosen, CheckedBiConsumer<MiniRaftCluster, RaftGroup, T> checker) throws IOException, InterruptedException, T {
    if (chosen < 0) {
        chosen = ThreadLocalRandom.current().nextInt(idIndex.length);
    }
    final String type = JavaUtils.getClassSimpleName(cluster.getClass()) + Arrays.toString(idIndex) + "chosen=" + chosen;
    LOG.info("\n\nrunMultiGroupTest with " + type + ": " + cluster.printServers());
    // Start server with an empty conf
    final RaftGroup emptyGroup = RaftGroup.valueOf(cluster.getGroupId());
    final List<RaftPeerId> ids = Arrays.stream(MiniRaftCluster.generateIds(idIndex[idIndex.length - 1], 0)).map(RaftPeerId::valueOf).collect(Collectors.toList());
    LOG.info("ids: " + ids);
    ids.forEach(id -> cluster.putNewServer(id, emptyGroup, true));
    LOG.info("putNewServer: " + cluster.printServers());
    TimeUnit.SECONDS.sleep(1);
    cluster.start();
    // Make sure that there are no leaders.
    TimeUnit.SECONDS.sleep(1);
    LOG.info("start: " + cluster.printServers());
    Assert.assertNull(cluster.getLeader());
    // Reinitialize servers to three groups
    final List<RaftPeer> allPeers = cluster.getPeers();
    Collections.sort(allPeers, Comparator.comparing(p -> p.getId().toString()));
    final RaftGroup[] groups = new RaftGroup[idIndex.length];
    for (int i = 0; i < idIndex.length; i++) {
        final RaftGroupId gid = RaftGroupId.randomId();
        final int previous = i == 0 ? 0 : idIndex[i - 1];
        final RaftPeer[] peers = allPeers.subList(previous, idIndex[i]).toArray(RaftPeer.emptyArray());
        groups[i] = RaftGroup.valueOf(gid, peers);
        LOG.info(i + ") starting " + groups[i]);
        for (RaftPeer p : peers) {
            try (final RaftClient client = cluster.createClient(p.getId(), emptyGroup)) {
                client.getGroupManagementApi(p.getId()).add(groups[i]);
            }
        }
        Assert.assertNotNull(RaftTestUtil.waitForLeader(cluster, gid));
        checker.accept(cluster, groups[i]);
    }
    printThreadCount(type, "start groups");
    LOG.info("start groups: " + cluster.printServers());
    // randomly remove two of the groups
    LOG.info("chosen = " + chosen + ", " + groups[chosen]);
    for (int i = 0; i < groups.length; i++) {
        if (i != chosen) {
            final RaftGroup g = groups[i];
            LOG.info(i + ") close " + cluster.printServers(g.getGroupId()));
            for (RaftPeer p : g.getPeers()) {
                final RaftServer.Division d = cluster.getDivision(p.getId(), g.getGroupId());
                final File root = d.getRaftStorage().getStorageDir().getRoot();
                Assert.assertTrue(root.exists());
                Assert.assertTrue(root.isDirectory());
                final RaftClientReply r;
                try (final RaftClient client = cluster.createClient(p.getId(), g)) {
                    r = client.getGroupManagementApi(p.getId()).remove(g.getGroupId(), true, false);
                }
                Assert.assertTrue(r.isSuccess());
                Assert.assertFalse(root.exists());
            }
        }
    }
    printThreadCount(type, "close groups");
    LOG.info("close groups: " + cluster.printServers());
    // update chosen group to use all the peers
    final RaftGroup newGroup = RaftGroup.valueOf(groups[chosen].getGroupId());
    for (int i = 0; i < groups.length; i++) {
        if (i != chosen) {
            LOG.info(i + ") groupAdd: " + cluster.printServers(groups[i].getGroupId()));
            for (RaftPeer p : groups[i].getPeers()) {
                try (final RaftClient client = cluster.createClient(p.getId(), groups[i])) {
                    client.getGroupManagementApi(p.getId()).add(newGroup);
                }
            }
        }
    }
    LOG.info(chosen + ") setConfiguration: " + cluster.printServers(groups[chosen].getGroupId()));
    try (final RaftClient client = cluster.createClient(groups[chosen])) {
        client.admin().setConfiguration(allPeers.toArray(RaftPeer.emptyArray()));
    }
    Assert.assertNotNull(RaftTestUtil.waitForLeader(cluster));
    checker.accept(cluster, groups[chosen]);
    LOG.info("update groups: " + cluster.printServers());
    printThreadCount(type, "update groups");
    cluster.shutdown();
    printThreadCount(type, "shutdown");
}
Also used : Arrays(java.util.Arrays) RaftGroup(org.apache.ratis.protocol.RaftGroup) LoggerFactory(org.slf4j.LoggerFactory) Random(java.util.Random) RaftGroupId(org.apache.ratis.protocol.RaftGroupId) Log4jUtils(org.apache.ratis.util.Log4jUtils) GroupManagementApi(org.apache.ratis.client.api.GroupManagementApi) Level(org.apache.log4j.Level) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) CheckedBiConsumer(org.apache.ratis.util.function.CheckedBiConsumer) JavaUtils(org.apache.ratis.util.JavaUtils) Logger(org.slf4j.Logger) Files(java.nio.file.Files) RaftPeer(org.apache.ratis.protocol.RaftPeer) RaftPeerId(org.apache.ratis.protocol.RaftPeerId) RaftServerConfigKeys(org.apache.ratis.server.RaftServerConfigKeys) Test(org.junit.Test) IOException(java.io.IOException) BaseTest(org.apache.ratis.BaseTest) Collectors(java.util.stream.Collectors) AlreadyExistsException(org.apache.ratis.protocol.exceptions.AlreadyExistsException) File(java.io.File) RaftTestUtil(org.apache.ratis.RaftTestUtil) FileUtils(org.apache.ratis.util.FileUtils) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) RaftClientReply(org.apache.ratis.protocol.RaftClientReply) RaftProperties(org.apache.ratis.conf.RaftProperties) RaftServer(org.apache.ratis.server.RaftServer) RaftClient(org.apache.ratis.client.RaftClient) Assert(org.junit.Assert) Comparator(java.util.Comparator) Collections(java.util.Collections) TimeDuration(org.apache.ratis.util.TimeDuration) RaftServer(org.apache.ratis.server.RaftServer) RaftGroupId(org.apache.ratis.protocol.RaftGroupId) RaftGroup(org.apache.ratis.protocol.RaftGroup) RaftPeer(org.apache.ratis.protocol.RaftPeer) RaftClientReply(org.apache.ratis.protocol.RaftClientReply) RaftPeerId(org.apache.ratis.protocol.RaftPeerId) File(java.io.File) RaftClient(org.apache.ratis.client.RaftClient)

Aggregations

RaftClient (org.apache.ratis.client.RaftClient)134 RaftClientReply (org.apache.ratis.protocol.RaftClientReply)66 RaftPeerId (org.apache.ratis.protocol.RaftPeerId)54 SimpleMessage (org.apache.ratis.RaftTestUtil.SimpleMessage)46 RaftServer (org.apache.ratis.server.RaftServer)46 Test (org.junit.Test)44 IOException (java.io.IOException)41 RaftPeer (org.apache.ratis.protocol.RaftPeer)33 BaseTest (org.apache.ratis.BaseTest)27 RaftTestUtil (org.apache.ratis.RaftTestUtil)22 ArrayList (java.util.ArrayList)20 RaftClientRpc (org.apache.ratis.client.RaftClientRpc)20 RaftGroup (org.apache.ratis.protocol.RaftGroup)16 CompletableFuture (java.util.concurrent.CompletableFuture)14 RaftProperties (org.apache.ratis.conf.RaftProperties)14 File (java.io.File)13 SimpleStateMachine4Testing (org.apache.ratis.statemachine.SimpleStateMachine4Testing)13 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)11 RaftClientRequest (org.apache.ratis.protocol.RaftClientRequest)11 MiniRaftCluster (org.apache.ratis.server.impl.MiniRaftCluster)11