package org.infinispan.server.hotrod;
import static org.infinispan.server.hotrod.Constants.INTELLIGENCE_BASIC;
import static org.infinispan.server.hotrod.Constants.INTELLIGENCE_HASH_DISTRIBUTION_AWARE;
import static org.infinispan.server.hotrod.Constants.INTELLIGENCE_TOPOLOGY_AWARE;
import static org.infinispan.server.hotrod.OperationStatus.Success;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.assertStatus;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.assertSuccess;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.assertTopologyReceived;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.hotRodCacheConfiguration;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.k;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.killClient;
import static org.infinispan.server.hotrod.test.HotRodTestingUtil.v;
import static org.testng.AssertJUnit.assertEquals;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.server.hotrod.test.HotRodClient;
import org.infinispan.server.hotrod.test.TestResponse;
import org.infinispan.test.TestingUtil;
import org.infinispan.topology.ClusterCacheStatus;
import org.testng.annotations.Test;
/**
* Tests Hot Rod replication mode using Hot Rod's 1.1 protocol.
*
* @author Galder ZamarreƱo
* @since 5.1
*/
@Test(groups = "functional", testName = "server.hotrod.HotRod11ReplicationTest")
public class HotRod11ReplicationTest extends HotRodMultiNodeTest {
@Override
protected String cacheName() {
return "replicateVersion11";
}
@Override
protected ConfigurationBuilder createCacheConfig() {
return hotRodCacheConfiguration(getDefaultClusteredCacheConfig(CacheMode.REPL_SYNC, false));
}
@Override
protected byte protocolVersion() {
return 11;
}
protected int virtualNodes() {
return 1;
}
public void testDistributedPutWithTopologyChanges(Method m) {
HotRodClient client1 = clients().get(0);
HotRodClient client2 = clients().get(1);
TestResponse resp = client1.ping(INTELLIGENCE_HASH_DISTRIBUTION_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, servers(), currentServerTopologyId());
// Client intelligence is now 1, which means no topology updates
resp = client1.put(k(m), 0, 0, v(m), INTELLIGENCE_BASIC, 0);
assertStatus(resp, Success);
assertEquals(resp.topologyResponse, null);
assertSuccess(client2.get(k(m), 0), v(m));
resp = client1.put(k(m), 0, 0, v(m, "v1-"), INTELLIGENCE_TOPOLOGY_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, servers(), currentServerTopologyId());
resp = client2.put(k(m), 0, 0, v(m, "v2-"), INTELLIGENCE_TOPOLOGY_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, servers(), currentServerTopologyId());
resp = client1.put(k(m), 0, 0, v(m, "v3-"), INTELLIGENCE_TOPOLOGY_AWARE,
ClusterCacheStatus.INITIAL_TOPOLOGY_ID + 2 * nodeCount());
assertStatus(resp, Success);
assertEquals(resp.topologyResponse, null);
assertSuccess(client2.get(k(m), 0), v(m, "v3-"));
resp = client1.put(k(m), 0, 0, v(m, "v4-"), INTELLIGENCE_HASH_DISTRIBUTION_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, servers(), currentServerTopologyId());
assertSuccess(client2.get(k(m), 0), v(m, "v4-"));
resp = client2.put(k(m), 0, 0, v(m, "v5-"), INTELLIGENCE_HASH_DISTRIBUTION_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, servers(), currentServerTopologyId());
assertSuccess(client2.get(k(m), 0), v(m, "v5-"));
HotRodServer newServer = startClusteredServer(servers().get(1).getPort() + 25);
HotRodClient newClient = new HotRodClient(
"127.0.0.1", newServer.getPort(), cacheName(), 60, protocolVersion());
List<HotRodServer> allServers =
Stream.concat(Stream.of(newServer), servers().stream()).collect(Collectors.toList());
try {
log.trace("New client started, modify key to be v6-*");
resp = newClient.put(k(m), 0, 0, v(m, "v6-"), INTELLIGENCE_HASH_DISTRIBUTION_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, allServers, currentServerTopologyId());
log.trace("Get key from other client and verify that's v6-*");
assertSuccess(client2.get(k(m), 0), v(m, "v6-"));
resp = client2.put(k(m), 0, 0, v(m, "v7-"), INTELLIGENCE_HASH_DISTRIBUTION_AWARE, 0);
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, allServers, currentServerTopologyId());
assertSuccess(newClient.get(k(m), 0), v(m, "v7-"));
} finally {
log.trace("Stopping new server");
killClient(newClient);
stopClusteredServer(newServer);
TestingUtil.waitForNoRebalance(cache(0, cacheName()), cache(1, cacheName()));
log.trace("New server stopped");
}
resp = client2.put(k(m), 0, 0, v(m, "v8-"), INTELLIGENCE_HASH_DISTRIBUTION_AWARE,
ClusterCacheStatus.INITIAL_TOPOLOGY_ID + 2 * nodeCount());
assertStatus(resp, Success);
assertTopologyReceived(resp.topologyResponse, servers(), currentServerTopologyId());
assertSuccess(client1.get(k(m), 0), v(m, "v8-"));
}
}