package org.infinispan.distexec; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.infinispan.Cache; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.remoting.transport.TopologyAwareAddress; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.annotations.Test; /** * Tests are added for testing execution policy for distributed executors. * * @author Anna Manukyan */ @Test(groups = "functional", testName = "distexec.DistributedExecutorExecutionPolicyTest") public class DistributedExecutorExecutionPolicyTest extends MultipleCacheManagersTest { public static final String CACHE_NAME = "TestCache"; public DistributedExecutorExecutionPolicyTest() { cleanup = CleanupPhase.AFTER_METHOD; } @Override protected void createCacheManagers() throws Throwable { } public EmbeddedCacheManager createCacheManager(int counter, int siteId, int machineId, int rackId) { ConfigurationBuilder builder = getDefaultClusteredCacheConfig(getCacheMode(), false); GlobalConfigurationBuilder globalConfigurationBuilder = GlobalConfigurationBuilder.defaultClusteredBuilder(); globalConfigurationBuilder.transport().machineId("m" + (machineId > 0 ? machineId : counter)) .rackId("r" + (rackId > 0 ? rackId : counter)).siteId("s" + (siteId > 0 ? siteId : counter)); EmbeddedCacheManager cm1 = TestCacheManagerFactory.createClusteredCacheManager(globalConfigurationBuilder, builder); cm1.defineConfiguration(CACHE_NAME, builder.build()); return cm1; } public CacheMode getCacheMode() { return CacheMode.DIST_SYNC; } public void testExecutionPolicyNotSameMachine() throws ExecutionException, InterruptedException { for(int i = 1; i <= 2; i++) { cacheManagers.add(createCacheManager(i, 0, 0 ,0)); } waitForClusterToForm(); executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy.SAME_MACHINE); } public void testExecutionPolicySameMachine() throws ExecutionException, InterruptedException { cacheManagers.add(createCacheManager(1, 0, 0 ,0)); cacheManagers.add(createCacheManager(2, 1, 1 ,1)); waitForClusterToForm(); executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy.SAME_MACHINE); } public void testExecutionPolicyNotSameSiteFilter() throws ExecutionException, InterruptedException { for(int i = 1; i <= 2; i++) { cacheManagers.add(createCacheManager(i, 0, 0 ,0)); } waitForClusterToForm(); executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy.SAME_SITE); } public void testExecutionPolicySameSiteFilter() throws ExecutionException, InterruptedException { cacheManagers.add(createCacheManager(1, 0, 0 ,0)); cacheManagers.add(createCacheManager(2, 1, 0 ,0)); waitForClusterToForm(); executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy.SAME_SITE); } public void testExecutionPolicyNotSameRackFilter() throws ExecutionException, InterruptedException { for(int i = 1; i <= 2; i++) { cacheManagers.add(createCacheManager(i, 0, 0 ,0)); } waitForClusterToForm(); executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy.SAME_RACK); } public void testExecutionPolicySameRackFilter() throws ExecutionException, InterruptedException { cacheManagers.add(createCacheManager(1, 0, 0 ,0)); cacheManagers.add(createCacheManager(2, 1, 0 ,1)); waitForClusterToForm(); executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy.SAME_RACK); } private void executeDifferentExecutionPolicies(DistributedTaskExecutionPolicy policy) throws ExecutionException, InterruptedException { assert address(0) instanceof TopologyAwareAddress; assert address(1) instanceof TopologyAwareAddress; Cache<Object, Object> cache1 = cache(0, CACHE_NAME); Cache<Object, Object> cache2 = cache(1, CACHE_NAME); cache1.put("key1", "value1"); cache1.put("key2", "value2"); cache1.put("key3", "value3"); cache1.put("key4", "value4"); cache2.put("key5", "value5"); cache2.put("key6", "value6"); //initiate task from cache1 and select cache2 as target DistributedExecutorService des = new DefaultExecutorService(cache1); try { //the same using DistributedTask API DistributedTaskBuilder<Boolean> taskBuilder = des.createDistributedTaskBuilder(new LocalDistributedExecutorTest.SimpleDistributedCallable(true)); taskBuilder.executionPolicy(policy); DistributedTask<Boolean> distributedTask = taskBuilder.build(); Future<Boolean> future = des.submit(distributedTask, "key1", "key6"); assert future.get(); } finally { des.shutdownNow(); } } }