You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by dr...@apache.org on 2017/02/23 11:07:22 UTC

[2/3] brooklyn-server git commit: fix the problem in the previous test

fix the problem in the previous test

where failure in custom start behaviour in applications does not cause an app to go on fire


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/4e0be7f6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/4e0be7f6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/4e0be7f6

Branch: refs/heads/master
Commit: 4e0be7f696325adad0389aac3b756c043cb268d9
Parents: 1bbe475
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Feb 22 17:23:02 2017 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Feb 22 17:26:20 2017 +0000

----------------------------------------------------------------------
 .../core/entity/AbstractApplication.java        | 51 +++++++++++++++-----
 1 file changed, 38 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e0be7f6/core/src/main/java/org/apache/brooklyn/core/entity/AbstractApplication.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractApplication.java b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractApplication.java
index 857635d..55b0c27 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/AbstractApplication.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/AbstractApplication.java
@@ -147,24 +147,35 @@ public abstract class AbstractApplication extends AbstractEntity implements Star
         Collection<? extends Location> locationsToUse = locations==null ? ImmutableSet.<Location>of() : locations;
         ServiceProblemsLogic.clearProblemsIndicator(this, START);
         ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator(this, Attributes.SERVICE_STATE_ACTUAL, "Application starting");
+        ServiceStateLogic.ServiceNotUpLogic.clearNotUpIndicator(this, START.getName());
         setExpectedStateAndRecordLifecycleEvent(Lifecycle.STARTING);
         try {
-            preStart(locationsToUse);
-
-            // Opportunity to block startup until other dependent components are available
-            Object val = config().get(START_LATCH);
-            if (val != null) log.debug("{} finished waiting for start-latch; continuing...", this);
-
-            doStart(locationsToUse);
-            postStart(locationsToUse);
-
+            try {
+                
+                preStart(locationsToUse);
+                
+                // Opportunity to block startup until other dependent components are available
+                Object val = config().get(START_LATCH);
+                if (val != null) log.debug("{} finished waiting for start-latch; continuing...", this);
+                
+                doStart(locationsToUse);
+                postStart(locationsToUse);
+                
+            } catch (ProblemStartingChildrenException e) {
+                throw Exceptions.propagate(e);
+            } catch (Exception e) {
+                // should remember problems, apart from those that happened starting children
+                // fixed bug introduced by the fix in dacf18b831e1e5e1383d662a873643a3c3cabac6
+                // where failures in special code at application root don't cause app to go on fire 
+                ServiceStateLogic.ServiceNotUpLogic.updateNotUpIndicator(this, START.getName(), Exceptions.collapseText(e));
+                throw Exceptions.propagate(e);
+            }
+            
         } catch (Exception e) {
-            // TODO should probably remember these problems then clear?  if so, do it here ... or on all effectors?
-            // ServiceProblemsLogic.updateProblemsIndicator(this, START, e);
-
             recordApplicationEvent(Lifecycle.ON_FIRE);
             // no need to log here; the effector invocation should do that
             throw Exceptions.propagate(e);
+            
         } finally {
             ServiceStateLogic.ServiceNotUpLogic.clearNotUpIndicator(this, Attributes.SERVICE_STATE_ACTUAL);
             ServiceStateLogic.setExpectedState(this, Lifecycle.RUNNING);
@@ -180,9 +191,23 @@ public abstract class AbstractApplication extends AbstractEntity implements Star
     }
     
     protected void doStart(Collection<? extends Location> locations) {
-        StartableMethods.start(this, locations);        
+        doStartChildren(locations);        
+    }
+    
+    protected void doStartChildren(Collection<? extends Location> locations) {
+        try {
+            StartableMethods.start(this, locations);
+        } catch (Exception e) {
+            Exceptions.propagateIfFatal(e);
+            throw new ProblemStartingChildrenException(e);
+        }
     }
 
+    private static class ProblemStartingChildrenException extends RuntimeException {
+        private static final long serialVersionUID = 7710856289284536803L;
+        private ProblemStartingChildrenException(Exception cause) { super(cause); }
+    }
+    
     /**
      * Default is no-op. Subclasses can override.
      * */