package org.infinispan.manager;
import static org.testng.AssertJUnit.assertEquals;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.configuration.global.TransportConfiguration;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.test.MultipleCacheManagersTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Tests to verify that execution policy is applied properly when using a cluster executor
* @author wburns
* @since 9.1
*/
@Test(groups = {"functional", "smoke"}, testName = "manager.AllClusterExecutorExecutionPolicyTest")
public class AllClusterExecutorExecutionPolicyTest extends MultipleCacheManagersTest {
@Override
public String toString() {
return super.toString();
}
private static final AtomicInteger actualInvocations = new AtomicInteger();
@DataProvider(name="params")
public Object[][] dataProvider() {
return new Object[][] {
// Policy, Site #, Rack #, Machine #, Expected invocation Count
{ ClusterExecutionPolicy.ALL, 0, 0, 0, 25 },
{ ClusterExecutionPolicy.ALL, 2, 1, 1, 25 },
{ ClusterExecutionPolicy.DIFFERENT_MACHINE, 1, 0, 1, 24 },
{ ClusterExecutionPolicy.DIFFERENT_MACHINE, 0, 1, 4, 24 },
{ ClusterExecutionPolicy.SAME_MACHINE, 2, 1, 1, 1 },
{ ClusterExecutionPolicy.SAME_MACHINE, 0, 0, 1, 1 },
{ ClusterExecutionPolicy.DIFFERENT_RACK, 2, 2, 3, 21 },
{ ClusterExecutionPolicy.DIFFERENT_RACK, 1, 0, 1, 21 },
{ ClusterExecutionPolicy.DIFFERENT_RACK, 0, 1, 4, 18 },
{ ClusterExecutionPolicy.SAME_RACK, 2, 1, 1, 2 },
{ ClusterExecutionPolicy.SAME_RACK, 1, 0, 1, 4 },
{ ClusterExecutionPolicy.SAME_RACK, 0, 2, 0, 1 },
{ ClusterExecutionPolicy.DIFFERENT_SITE, 2, 0, 4, 14 },
{ ClusterExecutionPolicy.DIFFERENT_SITE, 1, 0, 3, 21 },
{ ClusterExecutionPolicy.DIFFERENT_SITE, 0, 1, 6, 15 },
{ ClusterExecutionPolicy.SAME_SITE, 2, 0, 2, 11 },
{ ClusterExecutionPolicy.SAME_SITE, 1, 0, 0, 4 },
{ ClusterExecutionPolicy.SAME_SITE, 0, 1, 4, 10 },
};
}
@Override
protected void createCacheManagers() throws Throwable {
// Array where top level divides by site
// Second array divide by rack
// and the number within is how many machines are in each rack
int[][] topology = {
// Site 1
{
// Rack 1 machine count
2,
// Rack 2 machine count
7,
// Rack 3 machine count
1
},
// Site 2
{
// Only 1 rack with this many machines
4
},
// Site 3
{
// Rack 1 machine count
5,
// Rack 2 machine count
2,
// Rack 3 machine count
4
},
};
for (int siteNumber = 0; siteNumber < topology.length; ++siteNumber) {
int[] racksForSite = topology[siteNumber];
for (int rackNumber = 0; rackNumber < racksForSite.length; ++rackNumber) {
int machines = racksForSite[rackNumber];
for (int machineNumber = 0; machineNumber < machines; ++machineNumber) {
ConfigurationBuilderHolder holder = new ConfigurationBuilderHolder();
GlobalConfigurationBuilder globalConfigurationBuilder = holder.getGlobalConfigurationBuilder().clusteredDefault();
globalConfigurationBuilder.transport()
.machineId(String.valueOf(machineNumber))
.rackId(String.valueOf(rackNumber))
.siteId(String.valueOf(siteNumber));
addClusterEnabledCacheManager(holder);
}
}
}
}
@Test(dataProvider = "params")
public void runTest(ClusterExecutionPolicy policy, int site, int rack, int machine, int invocationCount) throws InterruptedException, ExecutionException, TimeoutException {
actualInvocations.set(0);
EmbeddedCacheManager cacheManager = cacheManagers.stream().filter(cm -> {
TransportConfiguration tc = cm.getCacheManagerConfiguration().transport();
return Integer.valueOf(tc.siteId()) == site && Integer.valueOf(tc.rackId()) == rack && Integer.valueOf(tc.machineId()) == machine;
}).findFirst().orElseThrow(() -> new AssertionError("No cache manager matches site: " + site + " rack: " + rack + " machine: " + machine));
cacheManager.executor().filterTargets(policy).submit(() -> actualInvocations.incrementAndGet()).get(10, TimeUnit.SECONDS);
assertEquals(invocationCount, actualInvocations.get());
}
}