making ThreadExecutor class Singleton, Using a fair policy in ReentrantLock
Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/cb41ada0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/cb41ada0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/cb41ada0 Branch: refs/heads/master Commit: cb41ada070af96d0345fb38f3e3684778f8d2f72 Parents: 533665a Author: Nirmal Fernando <[email protected]> Authored: Mon Dec 16 21:57:02 2013 +0530 Committer: Nirmal Fernando <[email protected]> Committed: Mon Dec 16 22:05:38 2013 +0530 ---------------------------------------------------------------------- .../controller/concurrent/ThreadExecutor.java | 33 +++++++++++++++----- .../controller/deployers/CartridgeDeployer.java | 4 +-- .../impl/CloudControllerServiceImpl.java | 8 ++--- .../controller/topology/TopologyManager.java | 2 +- .../src/main/resources/META-INF/component.xml | 4 +-- 5 files changed, 33 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cb41ada0/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java index 82c6d12..6735c3f 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/ThreadExecutor.java @@ -20,6 +20,7 @@ package org.apache.stratos.cloud.controller.concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; /** * This class can be used to create a thread pool, and hand over new jobs to the pool. @@ -27,8 +28,16 @@ import java.util.concurrent.Executors; public class ThreadExecutor { private ExecutorService executor; - public ThreadExecutor() { - executor = Executors.newCachedThreadPool(); + private static class Holder { + private static final ThreadExecutor INSTANCE = new ThreadExecutor(); + } + + public static ThreadExecutor getInstance() { + return Holder.INSTANCE; + } + + private ThreadExecutor() { + executor = Executors.newFixedThreadPool(50); } public void execute(Runnable job){ @@ -43,11 +52,21 @@ public class ThreadExecutor { } public void shutdown() { - // This will make the executor accept no new threads - // and finish all existing threads in the queue - executor.shutdown(); - // Wait until all threads are finished - while (!executor.isTerminated()) {} + executor.shutdown(); // Disable new tasks from being submitted + try { + // Wait a while for existing tasks to terminate + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { + executor.shutdownNow(); // Cancel currently executing tasks + // Wait a while for tasks to respond to being cancelled + if (!executor.awaitTermination(60, TimeUnit.SECONDS)) + System.err.println("Pool did not terminate"); + } + } catch (InterruptedException ie) { + // (Re-)Cancel if current thread also interrupted + executor.shutdownNow(); + // Preserve interrupt status + Thread.currentThread().interrupt(); + } } http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cb41ada0/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java index 4e087b6..1e6f6cd 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/deployers/CartridgeDeployer.java @@ -87,14 +87,12 @@ public class CartridgeDeployer extends AbstractDeployer{ fileToCartridgeListMap.put(deploymentFileData.getAbsolutePath(), new ArrayList<Cartridge>(cartridges)); - ThreadExecutor exec = new ThreadExecutor(); + ThreadExecutor exec = ThreadExecutor.getInstance(); // create Jclouds objects, for each IaaS for (Cartridge cartridge : cartridges) { // jclouds object building is time consuming, hence I use Java executor framework exec.execute(new JcloudsObjectBuilder(cartridge, deploymentFileData)); } - // wait till the jobs finish. - exec.shutdown(); TopologyBuilder.handleServiceCreated(cartridges); log.info("Successfully deployed the Cartridge definition specified at " + deploymentFileData.getAbsolutePath()); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cb41ada0/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java index cb7abb0..30bfe9c 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java @@ -373,7 +373,7 @@ public class CloudControllerServiceImpl implements CloudControllerService { memberContext.setCartridgeType(cartridgeType); - final Lock lock = new ReentrantLock(); + final Lock lock = new ReentrantLock(true); IaasProvider iaasProvider = cartridge.getIaasProviderOfPartition(partitionId); if (iaasProvider == null) { @@ -572,9 +572,8 @@ public class CloudControllerServiceImpl implements CloudControllerService { throw new InvalidMemberException(msg); } - ThreadExecutor exec = new ThreadExecutor(); + ThreadExecutor exec = ThreadExecutor.getInstance(); exec.execute(new InstanceTerminator(ctxt)); - exec.shutdown(); } @@ -759,12 +758,11 @@ public class CloudControllerServiceImpl implements CloudControllerService { throw new InvalidClusterException(msg); } - ThreadExecutor exec = new ThreadExecutor(); + ThreadExecutor exec = ThreadExecutor.getInstance(); for (MemberContext memberContext : ctxts) { exec.execute(new InstanceTerminator(memberContext)); } - exec.shutdown(); // ServiceContext serviceCtxt = dataHolder // .getServiceContextFromDomain(clusterId); http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cb41ada0/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyManager.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyManager.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyManager.java index 81611da..c3abb10 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyManager.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/topology/TopologyManager.java @@ -37,7 +37,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; public class TopologyManager { private static final Log log = LogFactory.getLog(TopologyManager.class); - private volatile ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private volatile ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true); private volatile ReentrantReadWriteLock.ReadLock readLock = lock.readLock(); private volatile ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); private volatile Topology topology; http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/cb41ada0/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/component.xml ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/component.xml b/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/component.xml index f41dec9..1fb74b9 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/component.xml +++ b/components/org.apache.stratos.cloud.controller/src/main/resources/META-INF/component.xml @@ -23,11 +23,11 @@ <extension>xml</extension> <class>org.apache.stratos.cloud.controller.deployers.CloudControllerDeployer</class> </deployer> - <deployer> + <!-- >deployer> <directory>cartridges</directory> <extension>xml</extension> <class>org.apache.stratos.cloud.controller.deployers.CartridgeDeployer</class> - </deployer> + </deployer--> <!-- >deployer> <directory>services</directory> <extension>xml</extension>
