package org.infinispan.client.hotrod.retry;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.fail;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.infinispan.client.hotrod.HitsAwareCacheManagersTest;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.exceptions.TransportException;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.server.hotrod.HotRodServer;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "client.hotrod.retry.CompleteShutdownDistRetryTest")
public class CompleteShutdownDistRetryTest extends HitsAwareCacheManagersTest {
List<SocketAddress> addrs;
List<byte[]> keys;
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder builder = getConfiguration();
createHotRodServers(3, builder);
}
@Override
protected void assertOnlyServerHit(SocketAddress serverAddress) {
super.assertOnlyServerHit(serverAddress);
resetStats(); // reset stats after checking that only server got hit
}
public void testRetryAfterCompleteShutdown() {
RemoteCache<byte[], String> client = client(0).getCache();
int initialServerPort = addr2hrServer.values().iterator().next().getPort();
addrs = getSocketAddressList();
keys = genKeys();
assertNoHits();
assertPutAndGet(client, 0, "zero");
assertPutAndGet(client, 1, "one");
assertPutAndGet(client, 2, "two");
killServer();
killServer();
assertEquals(null, client.get(keys.get(0))); // data gone
assertEquals(null, client.get(keys.get(1))); // data gone
resetStats();
assertEquals("two", client.get(keys.get(2)));
assertOnlyServerHit(addrs.get(2));
killServer();
try {
assertEquals("two", client.get(keys.get(2)));
fail("Should have thrown exception");
} catch (TransportException e) {
// Ignore, expected
}
resetStats();
addHotRodServer(getConfiguration(), initialServerPort);
addHotRodServer(getConfiguration());
addHotRodServer(getConfiguration());
addInterceptors();
keys = genKeys();
addrs = getSocketAddressList();
assertNoHits();
assertPutAndGet(client, 0, "zero");
assertPutAndGet(client, 1, "one");
assertPutAndGet(client, 2, "two");
}
private void assertPutAndGet(RemoteCache<byte[], String> client, int nodeIndex, String value) {
client.put(keys.get(nodeIndex), value);
assertOnlyServerHit(addrs.get(nodeIndex));
assertEquals(value, client.get(keys.get(nodeIndex)));
assertOnlyServerHit(addrs.get(nodeIndex));
}
private List<byte[]> genKeys() {
List<byte[]> keys = new ArrayList<byte[]>();
for (Map.Entry<SocketAddress, HotRodServer> entry : addr2hrServer.entrySet()) {
keys.add(HotRodClientTestingUtil.getKeyForServer(entry.getValue()));
}
return keys;
}
private List<SocketAddress> getSocketAddressList() {
List<SocketAddress> addrs = new ArrayList<SocketAddress>();
addrs.addAll(addr2hrServer.keySet());
return addrs;
}
private ConfigurationBuilder getConfiguration() {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
builder.clustering().hash().numOwners(1);
return hotRodCacheConfiguration(builder);
}
}