package org.infinispan.client.hotrod;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import org.infinispan.client.hotrod.test.HotRodClientTestingUtil;
import org.infinispan.client.hotrod.test.MultiHotRodServersTest;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.server.hotrod.HotRodServer;
import org.infinispan.test.TestingUtil;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "client.hotrod.DistTopologyChangeUnderLoadSingleOwnerTest")
public class DistTopologyChangeUnderLoadSingleOwnerTest extends MultiHotRodServersTest {
@Override
protected void createCacheManagers() throws Throwable {
createHotRodServers(2, getCacheConfiguration());
}
private ConfigurationBuilder getCacheConfiguration() {
ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
builder.clustering().hash().numOwners(1);
return hotRodCacheConfiguration(builder);
}
@Override
protected int maxRetries() {
return 1;
}
public void testRestartServerWhilePutting() throws Exception {
RemoteCache<Integer, String> remote = client(0).getCache();
remote.put(1, "v1");
assertEquals("v1", remote.get(1));
PutHammer putHammer = new PutHammer();
Future<Void> putHammerFuture = fork(putHammer);
// Kill server
HotRodServer toKillServer = servers.get(0);
HotRodClientTestingUtil.killServers(toKillServer);
servers.remove(toKillServer);
EmbeddedCacheManager toKillCacheManager = cacheManagers.get(0);
TestingUtil.killCacheManagers(toKillCacheManager);
cacheManagers.remove(toKillCacheManager);
TestingUtil.waitForNoRebalance(cache(0));
// Start server
addHotRodServer(getCacheConfiguration());
putHammer.stop = true;
putHammerFuture.get();
}
private class PutHammer implements Callable<Void> {
private final Random r = new Random();
volatile boolean stop;
@Override
public Void call() throws Exception {
RemoteCache<Integer, String> remote = client(0).getCache();
while (!stop) {
int i = r.nextInt(10);
remote.put(i, "v" + i);
}
return null;
}
}
}