package org.infinispan.client.hotrod.stress;
import java.net.SocketAddress;
import org.infinispan.client.hotrod.RemoteCache;
import org.infinispan.client.hotrod.RemoteCacheManager;
import org.infinispan.client.hotrod.impl.consistenthash.ConsistentHash;
import org.infinispan.client.hotrod.impl.transport.tcp.TcpTransportFactory;
import org.infinispan.client.hotrod.test.MultiHotRodServersTest;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.test.TestingUtil;
import org.testng.annotations.Test;
/**
* Test the performance of ConsistentHashV1/V2.
*
* @author Dan Berindei
* @since 5.3
*/
@Test(groups = "profiling", testName = "client.hotrod.stress.ClientConsistentHashPerfTest")
public class ClientConsistentHashPerfTest extends MultiHotRodServersTest {
private static final int NUM_SERVERS = 64;
private static final int ITERATIONS = 10000000;
private static final int NUM_KEYS = 100000;
@Override
protected void createCacheManagers() throws Throwable {
ConfigurationBuilder config = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, false);
createHotRodServers(NUM_SERVERS, config);
}
public void testConsistentHashPerf() throws Exception {
RemoteCacheManager rcm = client(0);
RemoteCache<Object, Object> cache = rcm.getCache();
// This will initialize the consistent hash
cache.put("k", "v");
TcpTransportFactory transportFactory = TestingUtil.extractField(rcm, "transportFactory");
ConsistentHash ch = transportFactory.getConsistentHash(RemoteCacheManager.cacheNameBytes());
byte[][] keys = new byte[NUM_KEYS][];
for (int i = 0; i < NUM_KEYS; i++) {
keys[i] = String.valueOf(i).getBytes("UTF-8");
}
SocketAddress aServer = null;
// warm-up
for (int i = 0; i < ITERATIONS/10; i++) {
SocketAddress server = ch.getServer(keys[i % keys.length]);
if (server != null) aServer = server;
}
long startNanos = System.nanoTime();
for (int i = 0; i < ITERATIONS; i++) {
SocketAddress server = ch.getServer(keys[i % keys.length]);
if (server != null) aServer = server;
}
double duration = System.nanoTime() - startNanos;
log.infof("Test took %.3f s, average CH lookup was %.3f ns", duration / 1000000000L, duration / ITERATIONS);
}
}