package org.infinispan.manager;
import static org.testng.AssertJUnit.assertEquals;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.test.Exceptions;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.Test;
/**
* @author wburns
* @since 9.0
*/
@Test(groups = {"functional", "smoke"}, testName = "manager.FailOverClusterExecutorTest")
public class FailOverClusterExecutorTest extends MultipleCacheManagersTest {
private static AtomicInteger failureCount = new AtomicInteger();
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
addClusterEnabledCacheManager(builder);
addClusterEnabledCacheManager(builder);
addClusterEnabledCacheManager(builder);
waitForClusterToForm();
}
@Test
public void testSimpleFailover() throws InterruptedException, ExecutionException, TimeoutException {
int failOverAllowed = 2;
failureCount.set(failOverAllowed);
CompletableFuture<Void> fut = cacheManagers.get(0).executor().singleNodeSubmission(failOverAllowed).submit(() -> {
if (failureCount.decrementAndGet() != 0) {
throw new IllegalArgumentException();
}
});
fut.get(10, TimeUnit.SECONDS);
assertEquals(0, failureCount.get());
}
@Test
public void testTimeoutOccursWithRetry() throws InterruptedException, ExecutionException, TimeoutException {
CompletableFuture<Void> fut = cacheManagers.get(0).executor().timeout(10, TimeUnit.MILLISECONDS)
.singleNodeSubmission(2).submit(() -> {
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(2));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
Exceptions.expectExecutionException(org.infinispan.util.concurrent.TimeoutException.class, fut);
}
}