package org.infinispan.server.test.cache.clustered; import static org.infinispan.server.test.util.ITestUtils.eventually; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.infinispan.arquillian.core.InfinispanResource; import org.infinispan.arquillian.core.RemoteInfinispanServer; import org.infinispan.arquillian.core.RunningServer; import org.infinispan.arquillian.core.WithRunningServer; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.client.hotrod.configuration.Configuration; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.client.hotrod.exceptions.HotRodClientException; import org.infinispan.server.test.client.memcached.MemcachedClient; import org.infinispan.server.test.util.ITestUtils; import org.jboss.arquillian.junit.Arquillian; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * Test queue-size, queue-flush-interval, remote-timeout and owners attributes of a cache. * Please note that the queue related attributes are only aplicable to replicated-cache and remote-timeout only for SYNC mode. * Using hotrod client except for the queue-flush-interval, where it's more convenient to use memcached. * * @author <a href="mailto:mgencur@redhat.com">Martin Gencur</a> * @author <a href="mailto:jmarkos@redhat.com">Jakub Markos</a> * */ @RunWith(Arquillian.class) @WithRunningServer({@RunningServer(name="clusteredcache-1"), @RunningServer(name = "clusteredcache-2")}) public class ClusteredCacheConfigurationIT { @InfinispanResource("clusteredcache-1") RemoteInfinispanServer server1; @InfinispanResource("clusteredcache-2") RemoteInfinispanServer server2; RemoteCacheManager rcm1; RemoteCacheManager rcm2; @Before public void setUp() { if (rcm1 == null) { Configuration conf = new ConfigurationBuilder().addServer().host(server1.getHotrodEndpoint().getInetAddress().getHostName()) .port(server1.getHotrodEndpoint().getPort()).build(); Configuration conf2 = new ConfigurationBuilder().addServer().host(server2.getHotrodEndpoint().getInetAddress().getHostName()) .port(server2.getHotrodEndpoint().getPort()).build(); rcm1 = new RemoteCacheManager(conf); rcm2 = new RemoteCacheManager(conf2); } } @Test public void testReplicationTimeout() throws Exception { RemoteCache<String, String> rc1 = rcm1.getCache("remoteTimeoutCache"); try { // create a big object StringBuilder sb = new StringBuilder(10000000); for (int i = 0; i < 1000000; i++) { sb.append("0123456789"); } rc1.put("k1", sb.toString()); fail("A timeout exception expected but not thrown"); } catch (HotRodClientException he) { assertTrue(he.getMessage().contains("TimeoutException")); } } // only testing owners=1, owners=2 is tested all across the testsuite (it's also the default) @Test public void testNumOwners() throws Exception { RemoteCache<String, String> rc1 = rcm1.getCache("numOwners1"); rc1.put("entry1", "value1"); rc1.put("entry2", "value2"); long server1Entries = server1.getCacheManager("clustered").getCache("numOwners1").getNumberOfEntries(); long server2Entries = server2.getCacheManager("clustered").getCache("numOwners1").getNumberOfEntries(); assertEquals(2, (server1Entries + server2Entries)); } @Test public void testAsyncReplicationMemcached() throws Exception { final MemcachedClient mc1 = new MemcachedClient(server1.getMemcachedEndpoint().getInetAddress().getHostName(), server1.getMemcachedEndpoint() .getPort()); final MemcachedClient mc2 = new MemcachedClient(server2.getMemcachedEndpoint().getInetAddress().getHostName(), server2.getMemcachedEndpoint() .getPort()); // The write is going to happen immediately on the primary owner and asynchronously on the other node, // but we don't know which node is the primary because SyncConsistentHashFactory is non-deterministic. mc1.set("k1", "v1"); eventually(new ITestUtils.Condition() { @Override public boolean isSatisfied() throws Exception { return mc1.get("k1") != null && mc2.get("k1") != null; } }, 1000); assertEquals("v1", mc1.get("k1")); assertEquals("v1", mc2.get("k1")); } }