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) {
