do recursive management in active->active case if it's a mistaken dual promotion

prevents subsequent failure due to dangling pre-registered child entity


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9f5e738f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9f5e738f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9f5e738f

Branch: refs/heads/master
Commit: 9f5e738f944f9049b2aeb264af80cf23a16db40d
Parents: d04d560
Author: Alex Heneveld <[email protected]>
Authored: Fri Mar 20 15:34:39 2015 +0000
Committer: Alex Heneveld <[email protected]>
Committed: Fri Mar 20 15:36:06 2015 +0000

----------------------------------------------------------------------
 .../internal/EntityManagementSupport.java         |  2 +-
 .../management/internal/LocalEntityManager.java   | 18 +++++++++++++++---
 .../internal/ManagementTransitionInfo.java        |  5 +++++
 .../ha/HighAvailabilityManagerInMemoryTest.java   |  1 -
 4 files changed, 21 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f5e738f/core/src/main/java/brooklyn/management/internal/EntityManagementSupport.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/internal/EntityManagementSupport.java 
b/core/src/main/java/brooklyn/management/internal/EntityManagementSupport.java
index f0f8074..cdf21dc 100644
--- 
a/core/src/main/java/brooklyn/management/internal/EntityManagementSupport.java
+++ 
b/core/src/main/java/brooklyn/management/internal/EntityManagementSupport.java
@@ -270,7 +270,7 @@ public class EntityManagementSupport {
             if (managementContext != info.getManagementContext()) {
                 throw new IllegalStateException("onManagementStopping 
encountered different management context for "+entity+
                     (!wasDeployed() ? " (wasn't deployed)" : !isDeployed() ? " 
(no longer deployed)" : "")+
-                    ": "+managementContext+"; expected 
"+info.getManagementContext());
+                    ": "+managementContext+"; expected 
"+info.getManagementContext()+" (may be a pre-registered entity which was never 
properly managed)");
             }
             Stopwatch startTime = Stopwatch.createStarted();
             while (!managementFailed.get() && 
nonDeploymentManagementContext!=null && 

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f5e738f/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java 
b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
index 08ce0de..2438f57 100644
--- a/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
+++ b/core/src/main/java/brooklyn/management/internal/LocalEntityManager.java
@@ -304,6 +304,7 @@ public class LocalEntityManager implements 
EntityManagerInternal {
      * (and the non-recursive RO path here could maybe be dropped)
      */
     
+    /** Applies management lifecycle callbacks (onManagementStarting, for all 
beforehand, then onManagementStopped, for all after) */
     protected void manageRecursive(Entity e, final ManagementTransitionMode 
initialMode) {
         checkManagementAllowed(e);
 
@@ -355,11 +356,22 @@ public class LocalEntityManager implements 
EntityManagerInternal {
             it.getManagementSupport().onManagementStarting( new 
ManagementTransitionInfo(managementContext, mode) ); 
             return manageNonRecursive(it, mode);
         } };
+        boolean isRecursive = true;
         if (initialMode.wasPrimary() && initialMode.isPrimary()) {
             // already managed, so this shouldn't be recursive 
-            // (in ActivePartialRebind we cheat calling in to this method; 
-            // the TODO above removing manageRebindRoot would allow us to 
avoid this cheat!)
-            log.debug("Managing "+e+" but skipping recursion, as mode is 
"+initialMode);
+            // (in ActivePartialRebind we cheat, calling in to this method 
then skipping recursion).
+            // it also falls through to here when doing a redundant promotion,
+            // in that case we *should* be recursive; determine by checking 
whether a child exists and is preregistered.
+            // the TODO above removing manageRebindRoot in favour of explicit 
mgmt list would clean this up a lot!
+            Entity aChild = Iterables.getFirst(e.getChildren(), null);
+            if (aChild!=null && isPreRegistered(aChild)) {
+                log.debug("Managing "+e+" in mode "+initialMode+", doing this 
recursively because a child is preregistered");
+            } else {
+                log.debug("Managing "+e+" but skipping recursion, as mode is 
"+initialMode);
+                isRecursive = false;
+            }
+        }
+        if (!isRecursive) {
             manageEntity.apply( (EntityInternal)e );
         } else {
             recursively(e, manageEntity);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f5e738f/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java 
b/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java
index 8b3c43d..e1eb51c 100644
--- 
a/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java
+++ 
b/core/src/main/java/brooklyn/management/internal/ManagementTransitionInfo.java
@@ -40,4 +40,9 @@ public class ManagementTransitionInfo {
     public ManagementTransitionMode getMode() {
         return mode;
     }
+    
+    @Override
+    public String toString() {
+        return super.toString()+"["+mgmtContext+";"+mode+"]";
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9f5e738f/core/src/test/java/brooklyn/management/ha/HighAvailabilityManagerInMemoryTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/brooklyn/management/ha/HighAvailabilityManagerInMemoryTest.java
 
b/core/src/test/java/brooklyn/management/ha/HighAvailabilityManagerInMemoryTest.java
index c647f19..c8b03b8 100644
--- 
a/core/src/test/java/brooklyn/management/ha/HighAvailabilityManagerInMemoryTest.java
+++ 
b/core/src/test/java/brooklyn/management/ha/HighAvailabilityManagerInMemoryTest.java
@@ -114,7 +114,6 @@ public class HighAvailabilityManagerInMemoryTest extends 
HighAvailabilityManager
         Assert.assertEquals(ll2b.getConfig(TestEntity.CONF_NAME), "sample1");
         Assert.assertNotNull(ll2b.getParent(), "Parent not set after dodgy 
promoteToMaster");
         Assert.assertEquals(ll2b.getParent().getConfig(TestEntity.CONF_NAME), 
"sample1");
-        
     }
 
     private void checkEntitiesHealthy(TestApplication app, TestEntity entity) {

Reply via email to