package org.infinispan.client.hotrod;
import static java.util.Arrays.stream;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.killServers;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.startHotRodServer;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.infinispan.test.TestingUtil.killCacheManagers;
import static org.infinispan.test.fwk.TestCacheManagerFactory.createClusteredCacheManager;
import static org.testng.AssertJUnit.assertTrue;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.server.hotrod.HotRodServer;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
/**
* @since 9.0
*/
@Test(testName = "client.hotrod.MultipleCacheTopologyChangeTest", groups = "functional")
public class MultipleCacheTopologyChangeTest extends MultipleCacheManagersTest {
private final List<Node> nodes = new ArrayList<>();
public void testRoundRobinLoadBalancing() throws InterruptedException, IOException {
String[] caches = new String[]{"cache1", "cache2"};
Node nodeA = startNewNode(caches);
Node nodeB = startNewNode(caches);
ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
clientBuilder.addServers(getServerList(nodeA, nodeB));
RemoteCacheManager client = new RemoteCacheManager(clientBuilder.build());
RemoteCache<Integer, String> cache1 = client.getCache("cache1");
RemoteCache<Integer, String> cache2 = client.getCache("cache2");
startNewNode(caches);
nodeB.kill();
assertTrue(cache1.isEmpty());
assertTrue(cache2.isEmpty());
nodeA.kill();
assertTrue(cache1.isEmpty());
assertTrue(cache2.isEmpty());
}
private String getServerList(Node... nodes) {
return String.join(";", stream(nodes).map(n -> "127.0.0.1:" + n.getPort()).collect(Collectors.toSet()));
}
@Override
protected void createCacheManagers() throws Throwable {
}
private Node startNewNode(String... caches) {
Node node = new Node(caches);
node.start();
waitForClusterToForm();
nodes.add(node);
return node;
}
class Node {
private final String[] cacheNames;
HotRodServer server;
EmbeddedCacheManager cacheManager;
private boolean stopped;
public Node(String... cacheNames) {
this.cacheNames = cacheNames;
}
public void start() {
cacheManager = createClusteredCacheManager(hotRodCacheConfiguration(getConfigurationBuilder()));
registerCacheManager(cacheManager);
stream(cacheNames).forEach(cacheName -> {
cacheManager.defineConfiguration(cacheName, getConfigurationBuilder().build());
cacheManager.getCache(cacheName);
});
server = startHotRodServer(cacheManager);
waitForClusterToForm(cacheNames);
}
public int getPort() {
return server.getPort();
}
void kill() {
if (!stopped) {
if (server != null) {
killServers(server);
}
killCacheManagers(cacheManager);
stopped = true;
}
}
}
protected org.infinispan.configuration.cache.ConfigurationBuilder getConfigurationBuilder() {
org.infinispan.configuration.cache.ConfigurationBuilder c =
new org.infinispan.configuration.cache.ConfigurationBuilder();
c.clustering().cacheMode(CacheMode.DIST_SYNC);
return c;
}
@AfterClass
@Override
protected void destroy() {
nodes.forEach(Node::kill);
}
}