Search in sources :

Example 1 with FutureGroup

use of com.alipay.sofa.jraft.rhea.client.FutureGroup in project sofa-jraft by sofastack.

the class AbstractChaosTest method chaosGetTest.

@Test
public void chaosGetTest() throws Exception {
    ChaosTestCluster cluster = null;
    PeerId p1 = null;
    PeerId p2 = null;
    for (int l = 0; l < RETRIES; l++) {
        final ExecutorService executor = Executors.newCachedThreadPool(new NamedThreadFactory("chaos-test", true));
        final List<CompletableFuture<Boolean>> allFutures = new CopyOnWriteArrayList<>();
        try {
            cluster = new ChaosTestCluster(TestUtil.generatePeers(INITIAL_PEER_COUNT), getStorageType(), isAllowBatching(), isOnlyLeaderRead());
            cluster.start();
            // Before writing data, remove a node (node1) and add it back later to verify that read consistency is guaranteed.
            p1 = cluster.getRandomPeer();
            cluster.removePeer(p1);
            final RheaKVStore store = cluster.getLeaderStore();
            // warm up
            store.bGet("test_key");
            for (int i = 0; i < LOOP_1; i++) {
                final int index = i;
                executor.execute(() -> {
                    for (int j = 0; j < LOOP_2; j++) {
                        allFutures.add(store.put("test_" + index + "_" + j, VALUE));
                    }
                });
            }
            // In the process of writing data, remove one node (node2)
            p2 = cluster.getRandomPeer();
            cluster.removePeer(p2);
            // Waiting for the write to be completed
            CompletableFuture.allOf(allFutures.toArray(new CompletableFuture[0])).get(30, TimeUnit.SECONDS);
            break;
        } catch (final Exception e) {
            System.err.println("Fail to put data, try again...");
            e.printStackTrace();
            new FutureGroup<>(allFutures).cancel(true);
            if (cluster != null) {
                cluster.stopAll();
            }
            cluster = null;
        } finally {
            ExecutorServiceHelper.shutdownAndAwaitTermination(executor);
        }
    }
    if (cluster == null) {
        throw new RuntimeException("fail to put data, can not check data");
    }
    try {
        chaosGetCheckData(cluster, p2, p1);
    } finally {
        cluster.stopAll();
    }
}
Also used : RheaKVStore(com.alipay.sofa.jraft.rhea.client.RheaKVStore) CompletableFuture(java.util.concurrent.CompletableFuture) NamedThreadFactory(com.alipay.sofa.jraft.util.NamedThreadFactory) ExecutorService(java.util.concurrent.ExecutorService) PeerId(com.alipay.sofa.jraft.entity.PeerId) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) FutureGroup(com.alipay.sofa.jraft.rhea.client.FutureGroup) Test(org.junit.Test)

Aggregations

PeerId (com.alipay.sofa.jraft.entity.PeerId)1 FutureGroup (com.alipay.sofa.jraft.rhea.client.FutureGroup)1 RheaKVStore (com.alipay.sofa.jraft.rhea.client.RheaKVStore)1 NamedThreadFactory (com.alipay.sofa.jraft.util.NamedThreadFactory)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)1 ExecutorService (java.util.concurrent.ExecutorService)1 Test (org.junit.Test)1