package org.infinispan.persistence; import static org.infinispan.test.TestingUtil.extractComponent; import static org.infinispan.test.TestingUtil.getFirstWriter; import static org.infinispan.test.TestingUtil.waitForNoRebalance; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.util.EnumMap; import java.util.List; import java.util.Map; import org.infinispan.Cache; import org.infinispan.commons.marshall.StreamingMarshaller; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.context.Flag; import org.infinispan.distribution.DistributionInfo; import org.infinispan.distribution.Ownership; import org.infinispan.interceptors.AsyncInterceptorChain; import org.infinispan.interceptors.impl.CacheLoaderInterceptor; import org.infinispan.interceptors.locking.ClusteringDependentLogic; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.marshall.core.MarshalledEntry; import org.infinispan.marshall.core.MarshalledEntryImpl; import org.infinispan.persistence.dummy.DummyInMemoryStore; import org.infinispan.persistence.dummy.DummyInMemoryStoreConfigurationBuilder; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.annotations.Test; /** * Tests if the conditional commands correctly fetch the value from cache loader even with the skip cache load/store * flags. * <p/> * The configuration used is a non-tx distributed cache without passivation. * * @author Pedro Ruivo * @since 7.0 */ @Test(groups = "functional", testName = "persistence.ClusteredConditionalCommandTest") public class ClusteredConditionalCommandTest extends MultipleCacheManagersTest { private static final String PRIVATE_STORE_CACHE_NAME = "private-store-cache"; private static final String SHARED_STORE_CACHE_NAME = "shared-store-cache"; private final String key = getClass().getSimpleName() + "-key"; private final String value1 = getClass().getSimpleName() + "-value1"; private final String value2 = getClass().getSimpleName() + "-value2"; private final boolean passivation; public ClusteredConditionalCommandTest() { this(false, false); } protected ClusteredConditionalCommandTest(boolean transactional, boolean passivation) { this.transactional = transactional; this.passivation = passivation; } private static ConfigurationBuilder createConfiguration(String storeName, boolean shared, boolean transactional, boolean passivation, int storePrefix) { ConfigurationBuilder builder = getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC, transactional); builder.jmxStatistics().enable(); builder.clustering() .hash().numOwners(2); builder.persistence() .passivation(passivation) .addStore(DummyInMemoryStoreConfigurationBuilder.class) .storeName(storeName + (shared ? "-shared" : storePrefix)) .fetchPersistentState(false) .purgeOnStartup(true) .shared(shared); builder.locking().isolationLevel(IsolationLevel.READ_COMMITTED); return builder; } private static <K, V> void writeToStore(CacheHelper<K, V> cacheHelper, Ownership ownership, K key, V value) { cacheHelper.cacheStore(ownership).write(marshalledEntry(key, value, cacheHelper.marshaller(ownership))); } private static <K, V> MarshalledEntry<K, V> marshalledEntry(K key, V value, StreamingMarshaller marshaller) { return new MarshalledEntryImpl<>(key, value, null, marshaller); } private <K, V> CacheHelper<K, V> create(List<Cache<K, V>> cacheList) { CacheHelper<K, V> cacheHelper = new CacheHelper<>(); for (Cache<K, V> cache : cacheList) { ClusteringDependentLogic clusteringDependentLogic = extractComponent(cache, ClusteringDependentLogic.class); DistributionInfo distributionInfo = clusteringDependentLogic.getCacheTopology().getDistribution(key); log.debugf("owners for key %s are %s", key, distributionInfo.writeOwners()); if (distributionInfo.isPrimary()) { log.debug("Cache " + address(cache) + " is the primary owner"); assertTrue(cacheHelper.addCache(Ownership.PRIMARY, cache)); } else if (distributionInfo.isWriteBackup()) { log.debug("Cache " + address(cache) + " is the backup owner"); assertTrue(cacheHelper.addCache(Ownership.BACKUP, cache)); } else { log.debug("Cache " + address(cache) + " is the non owner"); assertTrue(cacheHelper.addCache(Ownership.NON_OWNER, cache)); } } return cacheHelper; } private void doTest(List<Cache<String, String>> cacheList, ConditionalOperation operation, Ownership ownership, Flag flag, boolean shared) { waitForNoRebalance(cacheList); final CacheHelper<String, String> cacheHelper = create(cacheList); final boolean skipLoad = flag == Flag.SKIP_CACHE_LOAD || flag == Flag.SKIP_CACHE_STORE; assertEmpty(cacheList); initStore(cacheHelper, shared); try { if (flag != null) { operation.execute(cacheHelper.cache(ownership).getAdvancedCache().withFlags(flag), key, value1, value2); } else { operation.execute(cacheHelper.cache(ownership), key, value1, value2); } } catch (Exception e) { //some operation are allowed to fail. e.g. putIfAbsent. //we only check the final value log.debug(e); } assertLoadAfterOperation(cacheHelper, operation, ownership, skipLoad); assertEquals(operation.finalValue(value1, value2, skipLoad), cacheHelper.cache(Ownership.PRIMARY).get(key)); assertEquals(operation.finalValue(value1, value2, skipLoad), cacheHelper.cache(Ownership.BACKUP).get(key)); //don't test in non_owner because it generates remote gets and they can cross tests causing random failures. } protected <K, V> void assertLoadAfterOperation(CacheHelper<K, V> cacheHelper, ConditionalOperation operation, Ownership ownership, boolean skipLoad) { //in non-transactional caches, only the primary owner will load from store // backup will load only in case that it is origin (and needs previous value) assertLoad(cacheHelper, skipLoad ? 0 : 1, 0, 0); } protected final <K, V> void assertLoad(CacheHelper<K, V> cacheHelper, int primaryOwner, int backupOwner, int nonOwner) { assertEquals("primary owner load", primaryOwner, cacheHelper.loads(Ownership.PRIMARY)); assertEquals("backup owner load", backupOwner, cacheHelper.loads(Ownership.BACKUP)); assertEquals("non owner load", nonOwner, cacheHelper.loads(Ownership.NON_OWNER)); } private <K, V> void assertEmpty(List<Cache<K, V>> cacheList) { for (Cache<K, V> cache : cacheList) { assertTrue(cache + ".isEmpty()", cache.isEmpty()); } } private void initStore(CacheHelper<String, String> cacheHelper, boolean shared) { if (shared) { writeToStore(cacheHelper, Ownership.PRIMARY, key, value1); assertTrue(cacheHelper.cacheStore(Ownership.PRIMARY).contains(key)); assertTrue(cacheHelper.cacheStore(Ownership.BACKUP).contains(key)); assertTrue(cacheHelper.cacheStore(Ownership.NON_OWNER).contains(key)); } else { writeToStore(cacheHelper, Ownership.PRIMARY, key, value1); writeToStore(cacheHelper, Ownership.BACKUP, key, value1); assertTrue(cacheHelper.cacheStore(Ownership.PRIMARY).contains(key)); assertTrue(cacheHelper.cacheStore(Ownership.BACKUP).contains(key)); assertFalse(cacheHelper.cacheStore(Ownership.NON_OWNER).contains(key)); } cacheHelper.resetStats(Ownership.PRIMARY); cacheHelper.resetStats(Ownership.BACKUP); cacheHelper.resetStats(Ownership.NON_OWNER); } @Override protected void createCacheManagers() throws Throwable { createCluster(getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC), 3); int index = 0; for (EmbeddedCacheManager cacheManager : cacheManagers) { cacheManager.defineConfiguration(SHARED_STORE_CACHE_NAME, createConfiguration(getClass().getSimpleName(), true, transactional, passivation, index).build()); cacheManager.defineConfiguration(PRIVATE_STORE_CACHE_NAME, createConfiguration(getClass().getSimpleName(), false, transactional, passivation, index).build()); index++; } } public void testPutIfAbsentOnPrimaryOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, true); } public void testPutIfAbsentOnPrimaryOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, false); } public void testPutIfAbsentOnPrimaryOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, true); } public void testPutIfAbsentOnPrimaryOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, false); } public void testPutIfAbsentOnPrimaryOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.PRIMARY, null, true); } public void testPutIfAbsentOnPrimaryOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.PRIMARY, null, false); } public void testPutIfAbsentOnBackupOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, true); } public void testPutIfAbsentOnBackupOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, false); } public void testPutIfAbsentOnBackupOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, true); } public void testPutIfAbsentOnBackupOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, false); } public void testPutIfAbsentOnBackupOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.BACKUP, null, true); } public void testPutIfAbsentOnBackupOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.BACKUP, null, false); } public void testPutIfAbsentOnNonOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, true); } public void testPutIfAbsentOnNonOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, false); } public void testPutIfAbsentOnNonOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, true); } public void testPutIfAbsentOnNonOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, false); } public void testPutIfAbsentOnNonOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.NON_OWNER, null, true); } public void testPutIfAbsentOnNonOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.PUT_IF_ABSENT, Ownership.NON_OWNER, null, false); } public void testReplaceOnPrimaryOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, true); } public void testReplaceOnPrimaryOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, false); } public void testReplaceOnPrimaryOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, true); } public void testReplaceOnPrimaryOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, false); } public void testReplaceOnPrimaryOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.PRIMARY, null, true); } public void testReplaceOnPrimaryOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.PRIMARY, null, false); } public void testReplaceOnBackupOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, true); } public void testReplaceOnBackupOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, false); } public void testReplaceOnBackupOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, true); } public void testReplaceOnBackupOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, false); } public void testReplaceOnBackupOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.BACKUP, null, true); } public void testReplaceOnBackupOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.BACKUP, null, false); } public void testReplaceOnNonOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, true); } public void testReplaceOnNonOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, false); } public void testReplaceOnNonOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, true); } public void testReplaceOnNonOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, false); } public void testReplaceOnNonOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.NON_OWNER, null, true); } public void testReplaceOnNonOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE, Ownership.NON_OWNER, null, false); } public void testReplaceIfOnPrimaryOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, true); } public void testReplaceIfOnPrimaryOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, false); } public void testReplaceIfOnPrimaryOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, true); } public void testReplaceIfOnPrimaryOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, false); } public void testReplaceIfOnPrimaryOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.PRIMARY, null, true); } public void testReplaceIfOnPrimaryOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.PRIMARY, null, false); } public void testReplaceIfOnBackupOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, true); } public void testReplaceIfOnBackupOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, false); } public void testReplaceIfOnBackupOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, true); } public void testReplaceIfOnBackupOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, false); } public void testReplaceIfOnBackupOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.BACKUP, null, true); } public void testReplaceIfOnBackupOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.BACKUP, null, false); } public void testReplaceIfOnNonOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, true); } public void testReplaceIfOnNonOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, false); } public void testReplaceIfOnNonOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, true); } public void testReplaceIfOnNonOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, false); } public void testReplaceIfOnNonOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.NON_OWNER, null, true); } public void testReplaceIfOnNonOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REPLACE_IF, Ownership.NON_OWNER, null, false); } public void testRemoveIfOnPrimaryOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, true); } public void testRemoveIfOnPrimaryOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.PRIMARY, Flag.SKIP_CACHE_LOAD, false); } public void testRemoveIfOnPrimaryOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, true); } public void testRemoveIfOnPrimaryOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.PRIMARY, Flag.IGNORE_RETURN_VALUES, false); } public void testRemoveIfOnPrimaryOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.PRIMARY, null, true); } public void testRemoveIfOnPrimaryOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.PRIMARY, null, false); } public void testRemoveIfOnBackupOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, true); } public void testRemoveIfOnBackupOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.BACKUP, Flag.SKIP_CACHE_LOAD, false); } public void testRemoveIfOnBackupOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, true); } public void testRemoveIfOnBackupOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.BACKUP, Flag.IGNORE_RETURN_VALUES, false); } public void testRemoveIfOnBackupOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.BACKUP, null, true); } public void testRemoveIfOnBackupOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.BACKUP, null, false); } public void testRemoveIfOnNonOwnerWithSkipCacheLoaderShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, true); } public void testRemoveIfOnNonOwnerWithSkipCacheLoader() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.NON_OWNER, Flag.SKIP_CACHE_LOAD, false); } public void testRemoveIfOnNonOwnerWithIgnoreReturnValuesShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, true); } public void testRemoveIfOnNonOwnerWithIgnoreReturnValues() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.NON_OWNER, Flag.IGNORE_RETURN_VALUES, false); } public void testRemoveIfOnNonOwnerShared() { doTest(this.caches(SHARED_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.NON_OWNER, null, true); } public void testRemoveIfOnNonOwner() { doTest(this.caches(PRIVATE_STORE_CACHE_NAME), ConditionalOperation.REMOVE_IF, Ownership.NON_OWNER, null, false); } protected enum ConditionalOperation { PUT_IF_ABSENT { @Override public <K, V> void execute(Cache<K, V> cache, K key, V value1, V value2) { cache.putIfAbsent(key, value2); } @Override public <V> V finalValue(V value1, V value2, boolean skipLoad) { return skipLoad ? value2 : value1; } }, REPLACE { @Override public <K, V> void execute(Cache<K, V> cache, K key, V value1, V value2) { cache.replace(key, value2); } @Override public <V> V finalValue(V value1, V value2, boolean skipLoad) { return skipLoad ? value1 : value2; } }, REPLACE_IF { @Override public <K, V> void execute(Cache<K, V> cache, K key, V value1, V value2) { cache.replace(key, value1, value2); } @Override public <V> V finalValue(V value1, V value2, boolean skipLoad) { return skipLoad ? value1 : value2; } }, REMOVE_IF { @Override public <K, V> void execute(Cache<K, V> cache, K key, V value1, V value2) { cache.remove(key, value1); } @Override public <V> V finalValue(V value1, V value2, boolean skipLoad) { return skipLoad ? value1 : null; } }; public abstract <K, V> void execute(Cache<K, V> cache, K key, V value1, V value2); public abstract <V> V finalValue(V value1, V value2, boolean skipLoad); } protected static class CacheHelper<K, V> { private final Map<Ownership, Cache<K, V>> cacheEnumMap; private CacheHelper() { cacheEnumMap = new EnumMap<>(Ownership.class); } public boolean addCache(Ownership ownership, Cache<K, V> cache) { boolean contains = cacheEnumMap.containsKey(ownership); if (!contains) { cacheEnumMap.put(ownership, cache); } return !contains; } private Cache<K, V> cache(Ownership ownership) { return cacheEnumMap.get(ownership); } private DummyInMemoryStore cacheStore(Ownership ownership) { return getFirstWriter(cache(ownership)); } private StreamingMarshaller marshaller(Ownership ownership) { return cacheEnumMap.get(ownership).getAdvancedCache().getComponentRegistry().getCacheMarshaller(); } protected long loads(Ownership ownership) { AsyncInterceptorChain chain = extractComponent(cache(ownership), AsyncInterceptorChain.class); CacheLoaderInterceptor interceptor = chain.findInterceptorExtending(CacheLoaderInterceptor.class); return interceptor.getCacheLoaderLoads(); } private void resetStats(Ownership ownership) { AsyncInterceptorChain chain = extractComponent(cache(ownership), AsyncInterceptorChain.class); CacheLoaderInterceptor interceptor = chain.findInterceptorExtending( CacheLoaderInterceptor.class); interceptor.resetStatistics(); } } }