package org.infinispan.counter;
import static org.infinispan.counter.EmbeddedCounterManagerFactory.asCounterManager;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.counter.api.CounterConfiguration;
import org.infinispan.counter.api.CounterManager;
import org.infinispan.counter.api.CounterType;
import org.infinispan.counter.api.WeakCounter;
import org.infinispan.counter.impl.BaseCounterTest;
import org.infinispan.counter.impl.CounterModuleLifecycle;
import org.infinispan.counter.impl.weak.WeakCounterImpl;
import org.infinispan.counter.impl.weak.WeakCounterKey;
import org.infinispan.distribution.DistributionManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.remoting.transport.Address;
import org.infinispan.test.fwk.CleanupAfterMethod;
import org.testng.AssertJUnit;
import org.testng.annotations.Test;
/**
* Tests the key distribution for {@link WeakCounter}.
*
* @author Pedro Ruivo
* @since 9.0
*/
@Test(groups = "functional", testName = "counter.WeakCounterKeyDistributionTest")
@CleanupAfterMethod
public class WeakCounterKeyDistributionTest extends BaseCounterTest {
private static final int CLUSTER_SIZE = 4;
private static void assertKeyDistribution(Cache<?, ?> cache, String counterName) {
WeakCounterImpl counter = getCounter(cache.getCacheManager(), counterName);
DistributionManager distributionManager = cache.getAdvancedCache().getDistributionManager();
Address cacheAddress = cache.getAdvancedCache().getRpcManager().getAddress();
Set<WeakCounterKey> preferredKeys = new HashSet<>();
WeakCounterKey[] keys = counter.getPreferredKeys();
if (keys != null) {
for (WeakCounterKey key : keys) {
AssertJUnit.assertTrue(distributionManager.getPrimaryLocation(key).equals(cacheAddress));
AssertJUnit.assertTrue(preferredKeys.add(key));
}
}
for (WeakCounterKey key : counter.getKeys()) {
if (!preferredKeys.remove(key)) {
AssertJUnit.assertFalse(distributionManager.getPrimaryLocation(key).equals(cacheAddress));
}
}
AssertJUnit.assertTrue(preferredKeys.isEmpty());
}
private static WeakCounterImpl getCounter(EmbeddedCacheManager manager, String counterName) {
CounterManager counterManager = asCounterManager(manager);
counterManager
.defineCounter(counterName, CounterConfiguration.builder(CounterType.WEAK).concurrencyLevel(128).build());
return (WeakCounterImpl) counterManager.getWeakCounter(counterName);
}
public void testKeyDistribution(Method method) {
final String counterName = method.getName();
assertKeyDistributionInAllManagers(counterName);
}
public void testKeyDistributionAfterJoin(Method method) {
final String counterName = method.getName();
assertKeyDistributionInAllManagers(counterName);
addClusterEnabledCacheManager(configure(cacheManagers.size()), getDefaultClusteredCacheConfig(CacheMode.DIST_SYNC));
waitForCounterCaches();
assertKeyDistributionInAllManagers(counterName);
}
public void testKeyDistributionAfterLeave(Method method) {
final String counterName = method.getName();
assertKeyDistributionInAllManagers(counterName);
killMember(1);
waitForCounterCaches();
assertKeyDistributionInAllManagers(counterName);
}
@Override
protected int clusterSize() {
return CLUSTER_SIZE;
}
private void assertKeyDistributionInAllManagers(String counterName) {
for (EmbeddedCacheManager manager : getCacheManagers()) {
assertKeyDistribution(manager.getCache(CounterModuleLifecycle.COUNTER_CACHE_NAME), counterName);
}
}
}