package com.hazelcast.examples.splitbrain.higherhits; import com.hazelcast.cache.impl.HazelcastServerCachingProvider; import com.hazelcast.config.Config; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.examples.splitbrain.AbstractCacheSplitBrainSample; import javax.cache.Cache; import javax.cache.CacheManager; import javax.cache.spi.CachingProvider; import java.util.concurrent.CountDownLatch; import static com.hazelcast.examples.helper.CommonUtils.assertClusterSizeEventually; import static com.hazelcast.examples.helper.CommonUtils.assertEquals; import static com.hazelcast.examples.helper.CommonUtils.assertOpenEventually; /** * Base class for jcache split-brain sample based on `HIGHER_HITS` cache merge policy. * * `HIGHER_HITS` cache merge policy merges cache entry from source to destination cache * if source entry has more hits than the destination one. */ abstract class AbstractCacheSplitBrainSampleWithHigherHitsCacheMergePolicy extends AbstractCacheSplitBrainSample { private static final String CACHE_NAME = BASE_CACHE_NAME + "-higherhits"; protected abstract Config getConfig(); protected abstract Cache getCache(String cacheName, CacheManager cacheManager); protected void run() { try { Config config = getConfig(); HazelcastInstance h1 = Hazelcast.newHazelcastInstance(config); HazelcastInstance h2 = Hazelcast.newHazelcastInstance(config); CountDownLatch splitBrainCompletedLatch = simulateSplitBrain(h1, h2); CachingProvider cachingProvider1 = HazelcastServerCachingProvider.createCachingProvider(h1); CachingProvider cachingProvider2 = HazelcastServerCachingProvider.createCachingProvider(h2); CacheManager cacheManager1 = cachingProvider1.getCacheManager(); CacheManager cacheManager2 = cachingProvider2.getCacheManager(); Cache<String, String> cache1 = getCache(CACHE_NAME, cacheManager1); Cache<String, String> cache2 = getCache(CACHE_NAME, cacheManager2); // TODO: we assume that until here and also while doing get/put, cluster is still split // this assumptions seems fragile due to time sensitivity cache1.put("key1", "higherHitsValue"); cache1.put("key2", "value2"); // increase hits number assertEquals("higherHitsValue", cache1.get("key1")); assertEquals("higherHitsValue", cache1.get("key1")); cache2.put("key1", "value1"); cache2.put("key2", "higherHitsValue2"); // increase hits number assertEquals("higherHitsValue2", cache2.get("key2")); assertEquals("higherHitsValue2", cache2.get("key2")); assertOpenEventually(splitBrainCompletedLatch); assertClusterSizeEventually(2, h1); assertClusterSizeEventually(2, h2); Cache<String, String> cacheTest = cacheManager2.getCache(CACHE_NAME); assertEquals("higherHitsValue", cacheTest.get("key1")); assertEquals("higherHitsValue2", cacheTest.get("key2")); } finally { Hazelcast.shutdownAll(); } } }