package org.infinispan.distribution.ch;
import org.infinispan.distribution.ch.impl.DefaultConsistentHash;
import org.infinispan.distribution.ch.impl.SyncConsistentHashFactory;
import org.testng.annotations.Test;
/**
* Test the even distribution and number of moved segments after rebalance for {@link SyncConsistentHashFactory}
*
* @author Dan Berindei
* @since 5.2
*/
@Test(groups = "unit", testName = "distribution.ch.SyncConsistentHashFactoryTest")
public class SyncConsistentHashFactoryTest extends DefaultConsistentHashFactoryTest {
@Override
protected ConsistentHashFactory createConsistentHashFactory() {
return new SyncConsistentHashFactory();
}
// Disclaimer: These numbers just happen to work with our test addresses, they are by no means guaranteed
// by the SyncConsistentHashFactory algorithm. In theory it could trade stability of segments on join/leave
// in order to guarantee a better distribution, but I haven't done anything in that area yet.
@Override
protected float allowedDeviationPrimaryOwned(int numSegments, int numNodes, float totalCapacity, float maxCapacityFactor) {
return 1.25f * numSegments * maxCapacityFactor / totalCapacity;
}
@Override
protected float allowedDeviationOwned(int numSegments, int actualNumOwners, int numNodes, float totalCapacity,
float maxCapacityFactor) {
// if (numSegments < numNodes)
// return numSegments;
return 1.25f * actualNumOwners * numSegments * maxCapacityFactor / totalCapacity;
}
@Override
protected int allowedExtraMoves(DefaultConsistentHash oldCH, DefaultConsistentHash newCH, int leaverSegments) {
int minMembers = Math.min(oldCH.getMembers().size(), newCH.getMembers().size());
int diffMembers = symmetricalDiff(oldCH.getMembers(), newCH.getMembers()).size();
return oldCH.getNumSegments() * oldCH.getNumOwners() * (diffMembers / minMembers + 1);
}
}