You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by im...@apache.org on 2014/12/16 06:13:47 UTC

stratos git commit: Fixing application locking logic

Repository: stratos
Updated Branches:
  refs/heads/4.1.0-test 9333708ec -> 3b49fb848


Fixing application locking logic


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/3b49fb84
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/3b49fb84
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/3b49fb84

Branch: refs/heads/4.1.0-test
Commit: 3b49fb848db62084ac0f3f449bda40365fe5d95f
Parents: 9333708
Author: Imesh Gunaratne <im...@apache.org>
Authored: Tue Dec 16 10:34:23 2014 +0530
Committer: Imesh Gunaratne <im...@apache.org>
Committed: Tue Dec 16 10:43:40 2014 +0530

----------------------------------------------------------------------
 .../autoscaler/api/AutoScalerServiceImpl.java   | 72 +++++++++++---------
 .../applications/topic/ApplicationBuilder.java  |  2 +-
 .../context/cluster/VMClusterContext.java       |  2 +-
 .../AutoscalerTopologyEventReceiver.java        |  4 +-
 .../autoscaler/monitor/MonitorFactory.java      | 20 +++---
 .../monitor/component/GroupMonitor.java         |  3 +-
 .../component/ParentComponentMonitor.java       |  2 +-
 .../ClusterStatusTerminatedProcessor.java       |  2 -
 .../stratos/autoscaler/util/AutoscalerUtil.java |  3 +-
 9 files changed, 54 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
index d5c92e9..7bf93c0 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/api/AutoScalerServiceImpl.java
@@ -32,7 +32,7 @@ import org.apache.stratos.autoscaler.exception.AutoScalerException;
 import org.apache.stratos.autoscaler.exception.InvalidArgumentException;
 import org.apache.stratos.autoscaler.exception.application.ApplicationDefinitionException;
 import org.apache.stratos.autoscaler.exception.application.TopologyInConsistentException;
-import org.apache.stratos.autoscaler.exception.kubernetes.*;
+import org.apache.stratos.autoscaler.exception.kubernetes.InvalidServiceGroupException;
 import org.apache.stratos.autoscaler.exception.partition.PartitionValidationException;
 import org.apache.stratos.autoscaler.exception.policy.InvalidPolicyException;
 import org.apache.stratos.autoscaler.interfaces.AutoScalerServiceInterface;
@@ -77,28 +77,29 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
     }
 
     private boolean validateDeploymentPolicy(DeploymentPolicy deploymentPolicy) {
-
-        for(ChildPolicy childPolicy : deploymentPolicy.getChildPolicies()) {
-            String alias = childPolicy.getId();
+        try {
             ApplicationHolder.acquireReadLock();
-            List<Partition> partitionList = new ArrayList<Partition>();
-            for(ChildLevelNetworkPartition networkPartition : childPolicy.getChildLevelNetworkPartitions()) {
-                Partition[] partitions = deploymentPolicy.getApplicationLevelNetworkPartition(
-                                                    networkPartition.getId()).getPartitions();
-                for(Partition partition : partitions) {
-                    partitionList.add(partition);
+
+            for (ChildPolicy childPolicy : deploymentPolicy.getChildPolicies()) {
+                String alias = childPolicy.getId();
+                List<Partition> partitionList = new ArrayList<Partition>();
+                for (ChildLevelNetworkPartition networkPartition : childPolicy.getChildLevelNetworkPartitions()) {
+                    Partition[] partitions = deploymentPolicy.getApplicationLevelNetworkPartition(
+                            networkPartition.getId()).getPartitions();
+                    for (Partition partition : partitions) {
+                        partitionList.add(partition);
+                    }
                 }
-            }
-            try {
+
                 Application application = ApplicationHolder.getApplications().
-                                getApplication(deploymentPolicy.getApplicationId());
+                        getApplication(deploymentPolicy.getApplicationId());
                 Partition[] partitions = new Partition[partitionList.size()];
-                if(application != null) {
+                if (application != null) {
                     Group group = application.getGroupRecursively(alias);
-                    if(group != null) {
+                    if (group != null) {
                         Set<ClusterDataHolder> clusterDataHolders = group.getClusterDataHoldersOfGroup();
                         //validating the group deployment policy against the leaf cartridges
-                        for(ClusterDataHolder clusterDataHolder : clusterDataHolders) {
+                        for (ClusterDataHolder clusterDataHolder : clusterDataHolders) {
                             CloudControllerClient.getInstance().validateDeploymentPolicy(
                                     clusterDataHolder.getServiceType(), partitionList.toArray(partitions));
                         }
@@ -106,7 +107,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                         //Validating the cartridge level deployment policy
                         ClusterDataHolder clusterDataHolder = application.
                                 getClusterDataHolderRecursivelyByAlias(alias);
-                        if(clusterDataHolder != null) {
+                        if (clusterDataHolder != null) {
                             CloudControllerClient.getInstance().validateDeploymentPolicy(
                                     clusterDataHolder.getServiceType(), partitionList.toArray(partitions));
                         } else {
@@ -118,23 +119,20 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                     }
                 } else {
                     String msg = "Error while retrieving the application for the Deployment policy: " +
-                    deploymentPolicy.getApplicationId();
+                            deploymentPolicy.getApplicationId();
                     log.error(msg);
                     throw new TopologyInConsistentException(msg);
                 }
-
-            } catch (PartitionValidationException e) {
-                log.error("Error while validating the deployment policy", e);
-                //TODO throw exception
-            } catch (TopologyInConsistentException e) {
-                log.error("Error while validating the deployment policy", e);
-                //TODO throw exception
-            } finally {
-                ApplicationHolder.releaseReadLock();
             }
-
+        } catch (PartitionValidationException e) {
+            log.error("Error while validating the deployment policy", e);
+            //TODO throw exception
+        } catch (TopologyInConsistentException e) {
+            log.error("Error while validating the deployment policy", e);
+            //TODO throw exception
+        } finally {
+            ApplicationHolder.releaseReadLock();
         }
-
         return true;
     }
 
@@ -166,12 +164,18 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
     @Override
     public void addApplication(ApplicationContext applicationContext)
             throws ApplicationDefinitionException {
+
+        if(log.isInfoEnabled()) {
+            log.info(String.format("Starting to add application: [application-id] ",
+                    applicationContext.getApplicationId()));
+        }
+
         ApplicationParser applicationParser = new DefaultApplicationParser();
         applicationParser.parse(applicationContext);
         applicationContext.setStatus(ApplicationContext.STATUS_CREATED);
         AutoscalerContext.getInstance().addApplicationContext(applicationContext);
         if(log.isInfoEnabled()) {
-            log.info(String.format("Application added successfully: [application-id] ",
+            log.info(String.format("Successfully added application: [application-id] ",
                     applicationContext.getApplicationId()));
         }
     }
@@ -201,16 +205,18 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
         try {
             String policyId = PolicyManager.getInstance().deployDeploymentPolicy(policy);
         } catch (InvalidPolicyException e) {
-            log.error("Error while deploying the deployment policy " + policy.getApplicationId(), e);
+            String message = "Could not deploy application: [application-id] " + policy.getApplicationId();
+            log.error(message, e);
+            throw new RuntimeException(message, e);
         }
 
         //Need to start the application Monitor after validation of the deployment policies.
         //FIXME add validation
         validateDeploymentPolicy(policy);
         //Check whether all the clusters are there
-        ApplicationHolder.acquireReadLock();
         boolean allClusterInitialized = false;
         try {
+            ApplicationHolder.acquireReadLock();
             application = ApplicationHolder.getApplications().getApplication(policy.getApplicationId());
             if (application != null) {
                 allClusterInitialized = AutoscalerUtil.allClustersInitialized(application);
@@ -228,7 +234,7 @@ public class AutoScalerServiceImpl implements AutoScalerServiceInterface {
                         "Waiting for them to be created");
             }
         } else {
-            log.info("The application Monitor has already been created for [Application] " + applicationId);
+            log.info("The application monitor has already been created: [application-id] " + applicationId);
         }
         applicationContext.setStatus(ApplicationContext.STATUS_DEPLOYED);
         AutoscalerContext.getInstance().updateApplicationContext(applicationContext);

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
index c85fe7f..a64d071 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/applications/topic/ApplicationBuilder.java
@@ -56,8 +56,8 @@ public class ApplicationBuilder {
             log.debug("Handling complete application event");
         }
 
-        ApplicationHolder.acquireReadLock();
         try {
+            ApplicationHolder.acquireReadLock();
             ApplicationsEventPublisher.sendCompleteApplicationsEvent(applications);
         } finally {
             ApplicationHolder.releaseReadLock();

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
index 47489a0..3f0feb4 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/context/cluster/VMClusterContext.java
@@ -241,8 +241,8 @@ public class VMClusterContext extends AbstractClusterContext {
         int maxInstances = 1;
         if (clusterInstanceContext == null) {
             int minInstances = 1;
-            ApplicationHolder.acquireReadLock();
             try {
+                ApplicationHolder.acquireReadLock();
                 Application application = ApplicationHolder.getApplications().
                         getApplication(cluster.getAppId());
                 ClusterDataHolder dataHolder = application.

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
index 08f5ca5..ad992ba 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/event/receiver/topology/AutoscalerTopologyEventReceiver.java
@@ -90,8 +90,8 @@ public class AutoscalerTopologyEventReceiver {
             protected void onEvent(Event event) {
                 if (!topologyInitialized) {
                     log.info("[CompleteTopologyEvent] Received: " + event.getClass());
-                    ApplicationHolder.acquireReadLock();
                     try {
+                        ApplicationHolder.acquireReadLock();
                         Applications applications = ApplicationHolder.getApplications();
                         if (applications != null) {
                             for (Application application : applications.getApplications().values()) {
@@ -536,7 +536,7 @@ public class AutoscalerTopologyEventReceiver {
                 try {
                     long start = System.currentTimeMillis();
                     if (log.isDebugEnabled()) {
-                        log.debug("application monitor is going to be started for [application] " +
+                        log.debug("Application monitor is going to be started for [application] " +
                                 appId);
                     }
                     try {

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
index 264f440..3291ea9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/MonitorFactory.java
@@ -99,9 +99,9 @@ public class MonitorFactory {
             TopologyInConsistentException {
         GroupMonitor groupMonitor;
         boolean initialStartup = false;
-        //acquiring read lock to create the monitor
-        ApplicationHolder.acquireReadLock();
         try {
+            //acquiring read lock to create the monitor
+            ApplicationHolder.acquireReadLock();
             Group group = ApplicationHolder.getApplications().
                     getApplication(appId).getGroupRecursively(context.getId());
 
@@ -128,7 +128,6 @@ public class MonitorFactory {
             }
         } finally {
             ApplicationHolder.releaseReadLock();
-
         }
 
         Group group = ApplicationHolder.getApplications().
@@ -158,33 +157,31 @@ public class MonitorFactory {
      * This will create a new app monitor based on the give appId by getting the
      * application from Topology
      *
-     * @param appId appId of the application which requires to create app monitor
+     * @param applicationId appId of the application which requires to create app monitor
      * @return ApplicationMonitor
      * @throws DependencyBuilderException    throws while building dependency for app monitor
      * @throws TopologyInConsistentException throws while traversing thr topology
      */
-    public static ApplicationMonitor getApplicationMonitor(String appId)
+    public static ApplicationMonitor getApplicationMonitor(String applicationId)
             throws DependencyBuilderException,
             TopologyInConsistentException, PolicyValidationException {
         ApplicationMonitor applicationMonitor;
-        boolean initialStartup = false;
         Application application;
-        //acquiring read lock to start the monitor
-        ApplicationHolder.acquireReadLock();
         try {
-            application = ApplicationHolder.getApplications().getApplication(appId);
+            //acquiring read lock to start the monitor
+            ApplicationHolder.acquireReadLock();
+            application = ApplicationHolder.getApplications().getApplication(applicationId);
             if (application != null) {
                 applicationMonitor = new ApplicationMonitor(application);
                 applicationMonitor.setHasStartupDependents(false);
 
 
             } else {
-                String msg = "[Application] " + appId + " cannot be found in the Topology";
+                String msg = "Application not found in the topology: [application-id] " + applicationId;
                 throw new TopologyInConsistentException(msg);
             }
         } finally {
             ApplicationHolder.releaseReadLock();
-
         }
 
         applicationMonitor.startMinimumDependencies(application);
@@ -202,7 +199,6 @@ public class MonitorFactory {
         }*/
 
         return applicationMonitor;
-
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
index 0b2c21f..f69a05a 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/GroupMonitor.java
@@ -136,8 +136,8 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
         // notify parent
         log.info("[Group] " + this.id + "is notifying the [parent] " + this.parent.getId());
         if (this.isGroupScalingEnabled()) {
-            ApplicationHolder.acquireReadLock();
             try {
+                ApplicationHolder.acquireReadLock();
                 Application application = ApplicationHolder.getApplications().
                         getApplication(this.appId);
                 if (application != null) {
@@ -148,7 +148,6 @@ public class GroupMonitor extends ParentComponentMonitor implements Runnable {
                         GroupInstance context = group.getInstanceContexts(instanceId);
                         MonitorStatusEventBuilder.handleGroupStatusEvent(this.parent,
                                 status, this.id, context.getParentId());
-
                     }
                 }
             } finally {

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
index 16e8330..e9f20c9 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/monitor/component/ParentComponentMonitor.java
@@ -453,8 +453,8 @@ public abstract class ParentComponentMonitor extends Monitor {
 
                 if (monitor instanceof GroupMonitor) {
                     GroupMonitor monitor1 = (GroupMonitor) monitor;
-                    ApplicationHolder.acquireReadLock();
                     try {
+                        ApplicationHolder.acquireReadLock();
                         if (monitor1.verifyGroupStatus(instanceId, GroupStatus.Active)) {
                             parentsActive = true;
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
index 3cf5121..1d0b82e 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/status/processor/cluster/ClusterStatusTerminatedProcessor.java
@@ -103,8 +103,6 @@ public class ClusterStatusTerminatedProcessor extends ClusterStatusProcessor {
                     }
                 }
             }
-
-
         } finally {
             TopologyManager.releaseReadLockForCluster(monitor.getServiceId(), monitor.getClusterId());
 

http://git-wip-us.apache.org/repos/asf/stratos/blob/3b49fb84/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
index 7c8dd2d..144d062 100644
--- a/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
+++ b/components/org.apache.stratos.autoscaler/src/main/java/org/apache/stratos/autoscaler/util/AutoscalerUtil.java
@@ -411,8 +411,7 @@ public class AutoscalerUtil {
                 }*/
                 try {
                     long start = System.currentTimeMillis();
-                    log.info("application monitor is going to be started for [application] " +
-                            appId);
+                    log.info("Application monitor is going to be started for [application] " + appId);
                     try {
                         applicationMonitor = MonitorFactory.getApplicationMonitor(appId);
                     } catch (PolicyValidationException e) {