package org.infinispan.server.hotrod;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.serverPort;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.startHotRodServer;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.startHotRodServerWithDelay;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.server.core.test.ServerTestingUtil;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.test.fwk.TestResourceTracker;
import org.testng.annotations.Test;
/**
* Tests concurrent Hot Rod server startups
*
* @author Galder ZamarreƱo
* @since 4.2
*/
@Test(groups = "functional", testName = "server.hotrod.HotRodConcurrentStartTest")
public class HotRodConcurrentStartTest extends MultipleCacheManagersTest {
private int numberOfServers = 2;
private String cacheName = "hotRodConcurrentStart";
@Override
protected void createCacheManagers() {
for (int i = 0; i < numberOfServers; i++) {
EmbeddedCacheManager cm = TestCacheManagerFactory.createClusteredCacheManager(hotRodCacheConfiguration());
cacheManagers.add(cm);
ConfigurationBuilder cfg =
hotRodCacheConfiguration(getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false));
cm.defineConfiguration(cacheName, cfg.build());
}
}
public void testConcurrentStartup() throws InterruptedException, ExecutionException, TimeoutException {
int initialPort = serverPort();
List<HotRodServer> servers = new ArrayList<>();
try {
List<Future<HotRodServer>> futures = new ArrayList<>();
futures.add(fork(() -> {
TestResourceTracker.testThreadStarted(this);
HotRodServer server = startHotRodServerWithDelay(getCacheManagers().get(0), initialPort, 2000);
servers.add(server);
return server;
}));
for (int i = 1; i < numberOfServers; i++) {
int finalI = i;
futures.add(fork(() -> {
TestResourceTracker.testThreadStarted(this);
HotRodServer server = startHotRodServer(getCacheManagers().get(finalI), initialPort + (finalI * 10));
servers.add(server);
return server;
}));
}
for (Future<HotRodServer> hotRodServerFuture : futures) {
hotRodServerFuture.get(30, TimeUnit.SECONDS);
}
} finally {
servers.forEach(ServerTestingUtil::killServer);
}
}
}