package org.infinispan.client.hotrod.retry;
import static org.infinispan.client.hotrod.test.HotRodClientTestingUtil.getLoadBalancer;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.marshall;
import java.net.SocketAddress;
import org.infinispan.AdvancedCache;
import org.infinispan.client.hotrod.HitsAwareCacheManagersTest;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.impl.RemoteCacheImpl;
import org.infinispan.client.hotrod.impl.consistenthash.ConsistentHash;
import org.infinispan.client.hotrod.impl.transport.tcp.RoundRobinBalancingStrategy;
import org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.client.hotrod.test.InternalRemoteCacheManager;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.server.hotrod.HotRodServer;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.testng.annotations.AfterMethod;
/**
* @author Mircea.Markus@jboss.com
* @since 4.1
*/
public abstract class AbstractRetryTest extends HitsAwareCacheManagersTest {
protected HotRodServer hotRodServer1;
protected HotRodServer hotRodServer2;
protected HotRodServer hotRodServer3;
RemoteCacheImpl<Object, Object> remoteCache;
protected RemoteCacheManager remoteCacheManager;
protected TcpTransportFactory tcpTransportFactory;
protected ConfigurationBuilder config;
protected RoundRobinBalancingStrategy strategy;
public AbstractRetryTest() {
cleanup = CleanupPhase.AFTER_METHOD;
}
@Override
protected void createCacheManagers() throws Throwable {
config = hotRodCacheConfiguration(getCacheConfig());
EmbeddedCacheManager cm1 = TestCacheManagerFactory.createClusteredCacheManager(config);
EmbeddedCacheManager cm2 = TestCacheManagerFactory.createClusteredCacheManager(config);
EmbeddedCacheManager cm3 = TestCacheManagerFactory.createClusteredCacheManager(config);
registerCacheManager(cm1);
registerCacheManager(cm2);
registerCacheManager(cm3);
hotRodServer1 = createStartHotRodServer(manager(0));
addr2hrServer.put(getAddress(hotRodServer1), hotRodServer1);
hotRodServer2 = createStartHotRodServer(manager(1));
addr2hrServer.put(getAddress(hotRodServer2), hotRodServer2);
hotRodServer3 = createStartHotRodServer(manager(2));
addr2hrServer.put(getAddress(hotRodServer3), hotRodServer3);
waitForClusterToForm();
remoteCacheManager = createRemoteCacheManager(hotRodServer1.getPort());
remoteCache = (RemoteCacheImpl) remoteCacheManager.getCache();
tcpTransportFactory = (TcpTransportFactory) ((InternalRemoteCacheManager) remoteCacheManager).getTransportFactory();
strategy = getLoadBalancer(remoteCacheManager);
addInterceptors();
assert super.cacheManagers.size() == 3;
}
protected RemoteCacheManager createRemoteCacheManager(int port) {
org.infinispan.client.hotrod.configuration.ConfigurationBuilder builder =
new org.infinispan.client.hotrod.configuration.ConfigurationBuilder();
builder
.forceReturnValues(true)
.connectionTimeout(5)
.connectionPool().maxActive(1) //this ensures that only one server is active at a time
.addServer().host("127.0.0.1").port(port);
return new InternalRemoteCacheManager(builder.build());
}
protected HotRodServer createStartHotRodServer(EmbeddedCacheManager manager) {
return HotRodClientTestingUtil.startHotRodServer(manager);
}
@AfterMethod(alwaysRun = true)
@Override
protected void clearContent() throws Throwable {
if (cleanupAfterMethod()) {
HotRodClientTestingUtil.killRemoteCacheManagers(remoteCacheManager);
HotRodClientTestingUtil.killServers(hotRodServer1, hotRodServer2, hotRodServer3);
}
super.clearContent();
}
protected abstract ConfigurationBuilder getCacheConfig();
protected AdvancedCache<?, ?> cacheToHit(Object key) {
ConsistentHash consistentHash = tcpTransportFactory.getConsistentHash(RemoteCacheManager.cacheNameBytes());
SocketAddress expectedServer = consistentHash.getServer(marshall(key));
return addr2hrServer.get(expectedServer).getCacheManager().getCache().getAdvancedCache();
}
}