package org.infinispan.distribution.ch; import static org.infinispan.configuration.cache.CacheMode.DIST_SYNC; import static org.testng.AssertJUnit.assertEquals; import java.io.Serializable; import java.util.stream.IntStream; import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.distribution.LocalizedCacheTopology; import org.infinispan.distribution.ch.impl.AffinityPartitioner; import org.infinispan.marshall.core.ExternalPojo; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.Test; /** * @author gustavonalle * @since 8.2 */ @Test(groups = "functional", testName = "distribution.ch.AffinityPartitionerTest") public class AffinityPartitionerTest extends MultipleCacheManagersTest { @Override protected void createCacheManagers() throws Throwable { final ConfigurationBuilder conf = getConfigurationBuilder(); createCluster(conf, 2); waitForClusterToForm(); } @Test public void testAffinityPartitioner() throws Exception { Cache<AffinityKey, String> cache = cacheManagers.get(0).getCache(); IntStream.range(0, 10).boxed().forEach(num -> cache.put(new AffinityKey(num), "value")); addClusterEnabledCacheManager(getConfigurationBuilder()); waitForClusterToForm(); cacheManagers.stream().map(cm -> cm.getCache().getAdvancedCache()).forEach(advancedCache -> { LocalizedCacheTopology cacheTopology = advancedCache.getDistributionManager().getCacheTopology(); advancedCache.getDataContainer().keySet().forEach(key -> { int keySegmentId = ((AffinityKey) key).segmentId; assertEquals(cacheTopology.getSegment(key), keySegmentId); }); }); } private ConfigurationBuilder getConfigurationBuilder() { final ConfigurationBuilder conf = getDefaultClusteredCacheConfig(DIST_SYNC, false); conf.clustering().hash().keyPartitioner(new AffinityPartitioner()).numSegments(10).numOwners(1); return conf; } static class AffinityKey implements AffinityTaggedKey, Serializable, ExternalPojo { final int segmentId; public AffinityKey(int segmentId) { this.segmentId = segmentId; } @Override public int getAffinitySegmentId() { return segmentId; } } }