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>

Reply via email to