package org.infinispan.distribution.ch;
import static org.infinispan.test.TestingUtil.assertBetween;
import static org.testng.AssertJUnit.assertEquals;
import java.util.Map;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.distribution.ch.impl.DefaultConsistentHash;
import org.infinispan.distribution.ch.impl.OwnershipStatistics;
import org.infinispan.distribution.group.impl.PartitionerConsistentHash;
import org.infinispan.remoting.transport.Address;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.TestingUtil;
import org.testng.annotations.Test;
/**
* Test the capacity factors with the full stack.
*
* @author Dan Berindei
* @since 6.0
*/
@Test(groups = "functional", testName = "distribution.ch.CapacityFactorsFunctionalTest", enabled = false, description = "to be fixed by ISPN-6470")
public class CapacityFactorsFunctionalTest extends MultipleCacheManagersTest {
public static final int NUM_SEGMENTS = 60;
@Override
protected void createCacheManagers() throws Throwable {
// Do nothing here, create the cache managers in the test
}
public void testCapacityFactors() {
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.clustering().cacheMode(CacheMode.DIST_SYNC);
cb.clustering().hash().numSegments(NUM_SEGMENTS);
cb.clustering().hash().capacityFactor(0.5f);
addClusterEnabledCacheManager(cb);
waitForClusterToForm();
assertCapacityFactors(0.5f);
assertPrimaryOwned(NUM_SEGMENTS);
assertOwned(NUM_SEGMENTS);
cb.clustering().hash().capacityFactor(1.5f);
addClusterEnabledCacheManager(cb);
waitForClusterToForm();
assertCapacityFactors(0.5f, 1.5f);
assertPrimaryOwned(NUM_SEGMENTS / 4, NUM_SEGMENTS * 3 / 4);
assertOwned(NUM_SEGMENTS, NUM_SEGMENTS);
cb.clustering().hash().capacityFactor(0.0f);
addClusterEnabledCacheManager(cb);
waitForClusterToForm();
assertCapacityFactors(0.5f, 1.5f, 0.0f);
assertPrimaryOwned(NUM_SEGMENTS / 4, NUM_SEGMENTS * 3 / 4, 0);
assertOwned(NUM_SEGMENTS, NUM_SEGMENTS, 0);
cb.clustering().hash().capacityFactor(1.0f);
addClusterEnabledCacheManager(cb);
waitForClusterToForm();
assertCapacityFactors(0.5f, 1.5f, 0.0f, 1.0f);
assertPrimaryOwned(NUM_SEGMENTS / 6, NUM_SEGMENTS * 3 / 6, 0, NUM_SEGMENTS * 2 / 6);
assertOwned(NUM_SEGMENTS / 3, NUM_SEGMENTS, 0, NUM_SEGMENTS * 2 / 3);
}
private void assertCapacityFactors(float... expectedCapacityFactors) {
ConsistentHash ch = cache(0).getAdvancedCache().getDistributionManager().getReadConsistentHash();
DefaultConsistentHash dch =
(DefaultConsistentHash) TestingUtil.extractField(PartitionerConsistentHash.class, ch, "ch");
int numNodes = expectedCapacityFactors.length;
Map<Address,Float> capacityFactors = dch.getCapacityFactors();
for (int i = 0; i < numNodes; i++) {
assertEquals(expectedCapacityFactors[i], capacityFactors.get(address(i)), 0.0);
}
}
private void assertPrimaryOwned(int... expectedPrimaryOwned) {
ConsistentHash ch = cache(0).getAdvancedCache().getDistributionManager().getReadConsistentHash();
OwnershipStatistics stats = new OwnershipStatistics(ch, ch.getMembers());
int numNodes = expectedPrimaryOwned.length;
for (int i = 0; i < numNodes; i++) {
double delta = expectedPrimaryOwned[i] * 0.15;
assertBetween(expectedPrimaryOwned[i] - 2 * delta, expectedPrimaryOwned[i] + delta,
stats.getPrimaryOwned(address(i)));
}
}
private void assertOwned(int... expectedOwned) {
ConsistentHash ch = cache(0).getAdvancedCache().getDistributionManager().getReadConsistentHash();
OwnershipStatistics stats = new OwnershipStatistics(ch, ch.getMembers());
int numNodes = expectedOwned.length;
for (int i = 0; i < numNodes; i++) {
double delta = expectedOwned[i] * 0.25;
assertBetween(expectedOwned[i] - 2 * delta, expectedOwned[i] + delta, stats.getOwned(address(i)));
}
}
}