package org.infinispan.server.test.l1;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
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.server.test.client.memcached.MemcachedClient;
import org.jboss.arquillian.junit.Arquillian;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Tests for L1 caching.
*
* @author <a href="mailto:tsykora@redhat.com">Tomas Sykora</a>
* @author <a href="mailto:wburns@redhat.com">William Burns</a>
*/
@RunWith(Arquillian.class)
@WithRunningServer({@RunningServer(name = "l1-1"),@RunningServer(name = "l1-2")})
public class L1CachingIT {
final String CONTAINER1 = "l1-1";
final String CONTAINER2 = "l1-2";
@InfinispanResource(CONTAINER1)
RemoteInfinispanServer server1;
@InfinispanResource(CONTAINER2)
RemoteInfinispanServer server2;
static final String ENCODING = "UTF-8";
private MemcachedClient mc1;
private MemcachedClient mc2;
@Before
public void setUp() throws Exception {
mc1 = new MemcachedClient(ENCODING, server1.getMemcachedEndpoint().getInetAddress().getHostName(), server1
.getMemcachedEndpoint().getPort(), 10000);
mc2 = new MemcachedClient(ENCODING, server2.getMemcachedEndpoint().getInetAddress().getHostName(), server2
.getMemcachedEndpoint().getPort(), 10000);
mc1.delete("KeyA");
mc2.delete("KeyA");
mc1.delete("KeyB");
mc2.delete("KeyB");
mc2.delete("KeyBB");
mc2.delete("KeyBB");
mc1.delete("KeyC");
mc2.delete("KeyC");
}
@After
public void tearDown() throws Exception {
if (mc1 != null) {
mc1.close();
}
if (mc2 != null) {
mc2.close();
}
}
/*
* Entries in L1 cache are stored directly into "main" cache. They are fetched from remote (distribution) node.
* In TRACE we can see: "Doing a remote get for key KeyA" and "Caching remotely retrieved entry for key KeyA in L1"
*
* Number of hits is increased for cache on which is issued get. Hits on real-owner are still 0.
* For caching L1 entries there is NO increase for number of stores. (Only for number of entries)
*/
@Test
public void testL1CachingEnabled() throws Exception {
// I put to server1, then I issue get on server2 -> number of hits on server1 should be still 0
// but number of hits on server2 should increase (entry was fetched from server1 to server2 for
// this get)
int numKeys = 10;
for (int i = 0; i < numKeys; i++) {
mc1.set("Key" + i, "Value" + i);
}
assumeTrue("Distribution of entries is wrong (at least unexpected).",
server1.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries() > 0);
assumeTrue("Distribution of entries is wrong (at least unexpected).",
server2.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries() > 0);
assertEquals("More entries in caches than expected.", numKeys,
server1.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries() +
server2.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries());
for (int i = 0; i < numKeys; i++) {
assertEquals("Value" + i, mc2.get("Key" + i));
}
assertEquals("Number of hits on server 1 is wrong.", 0,
server1.getCacheManager("clustered").getCache("memcachedCache").getHits());
assertEquals("Number of hits on server 2 is wrong.", numKeys,
server2.getCacheManager("clustered").getCache("memcachedCache").getHits());
assertEquals("Number of stores on server 1 is wrong.", numKeys,
server1.getCacheManager("clustered").getCache("memcachedCache").getStores());
assertEquals("Number of stores on server 2 is wrong.", 0,
server2.getCacheManager("clustered").getCache("memcachedCache").getStores());
// main condition (some entries are in the L1 cache - its copy is there)
assertTrue("The are no entries in L1 cache! L1 seems to be disabled! Check TRACE [org.infinispan" +
".factories.ComponentRegistry] output.",
server1.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries() +
server2.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries() >
numKeys);
// *****************************
// do the same round for server1
for (int i = 0; i < numKeys; i++) {
assertEquals("Value" + i, mc1.get("Key" + i));
}
assertEquals("Number of hits on server 1 is wrong.", numKeys,
server1.getCacheManager("clustered").getCache("memcachedCache").getHits());
assertEquals("Number of hits on server 2 is wrong.", numKeys,
server2.getCacheManager("clustered").getCache("memcachedCache").getHits());
// should be still the same as on the start
assertEquals("Number of stores on server 1 is wrong.", numKeys,
server1.getCacheManager("clustered").getCache("memcachedCache").getStores());
assertEquals("Number of stores on server 2 is wrong.", 0,
server2.getCacheManager("clustered").getCache("memcachedCache").getStores());
// main condition: each key should exist as a proper entry on one node and as an L1 entry in the other
assertEquals("The are no entries in L1 cache! L1 seems to be disabled! Check TRACE [org.infinispan" +
".factories.ComponentRegistry] output.", 2 * numKeys,
server1.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries() +
server2.getCacheManager("clustered").getCache("memcachedCache").getNumberOfEntries());
}
}