package org.infinispan.api; import javax.transaction.TransactionManager; import org.infinispan.Cache; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.context.Flag; import org.infinispan.distribution.MagicKey; import org.infinispan.remoting.rpc.RpcManager; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.TestingUtil; import org.infinispan.util.CountingRpcManager; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.AssertJUnit; import org.testng.annotations.Test; /** * @author Pedro Ruivo * @since 6.0 */ @Test(groups = "functional", testName = "api.RepeatableReadRemoteGetCountTest") public class RepeatableReadRemoteGetCountTest extends MultipleCacheManagersTest { @Override protected void createCacheManagers() throws Throwable { ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, true); builder.locking().isolationLevel(IsolationLevel.REPEATABLE_READ); builder.clustering().hash().numOwners(1); createClusteredCaches(2, builder); } public void testOnKeyInitialized() throws Exception { doTest(true); } public void testOnKeyNonInitialized() throws Exception { doTest(false); } public void testWithoutReading() throws Exception { final Object key = new MagicKey("key", cache(0)); final Cache<Object, Object> cache = cache(1); final TransactionManager tm = tm(1); final CountingRpcManager rpcManager = replaceRpcManager(cache); cache(0).put(key, "v0"); tm.begin(); rpcManager.resetStats(); cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).put(key, "v1"); AssertJUnit.assertEquals("Wrong number of gets after put.", 0, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong value read.", "v1", cache.get(key)); AssertJUnit.assertEquals("Wrong number of gets after read.", 0, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong put return value.", "v1", cache.put(key, "v2")); AssertJUnit.assertEquals("Wrong number of gets after put.", 0, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong replace return value.", "v2", cache.replace(key, "v3")); AssertJUnit.assertEquals("Wrong number of gets after replace.", 0, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong conditional replace return value.", true, cache.replace(key, "v3", "v4")); AssertJUnit.assertEquals("Wrong number of gets after conditional replace.", 0, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong conditional remove return value.", true, cache.remove(key, "v4")); AssertJUnit.assertEquals("Wrong number of gets after conditional remove.", 0, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong conditional put return value.", null, cache.putIfAbsent(key, "v5")); AssertJUnit.assertEquals("Wrong number of gets after conditional put.", 0, rpcManager.clusterGet); tm.commit(); } private void doTest(boolean initialized) throws Exception { final Object key = new MagicKey("key", cache(0)); final Cache<Object, Object> cache = cache(1); final TransactionManager tm = tm(1); final CountingRpcManager rpcManager = replaceRpcManager(cache); if (initialized) { cache(0).put(key, "v1"); } tm.begin(); rpcManager.resetStats(); AssertJUnit.assertEquals("Wrong value read.", initialized ? "v1" : null, cache.get(key)); AssertJUnit.assertEquals("Wrong number of gets after read.", 1, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong put return value.", initialized ? "v1" : null, cache.put(key, "v2")); AssertJUnit.assertEquals("Wrong number of gets after put.", 1, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong replace return value.", "v2", cache.replace(key, "v3")); AssertJUnit.assertEquals("Wrong number of gets after replace.", 1, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong conditional replace return value.", true, cache.replace(key, "v3", "v4")); AssertJUnit.assertEquals("Wrong number of gets after conditional replace.", 1, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong conditional remove return value.", true, cache.remove(key, "v4")); AssertJUnit.assertEquals("Wrong number of gets after conditional remove.", 1, rpcManager.clusterGet); AssertJUnit.assertEquals("Wrong conditional put return value.", null, cache.putIfAbsent(key, "v5")); AssertJUnit.assertEquals("Wrong number of gets after conditional put.", 1, rpcManager.clusterGet); tm.commit(); } private CountingRpcManager replaceRpcManager(Cache cache) { RpcManager current = TestingUtil.extractComponent(cache, RpcManager.class); if (current instanceof CountingRpcManager) { return (CountingRpcManager) current; } CountingRpcManager countingRpcManager = new CountingRpcManager(current); TestingUtil.replaceComponent(cache, RpcManager.class, countingRpcManager, true); return countingRpcManager; } }