This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 8477a27eb2d24960b9340eb57a30e03b0c706a00 Author: Alex Heneveld <[email protected]> AuthorDate: Tue Sep 14 17:46:59 2021 +0100 tidy up a few more places where we get warns on unmanaging add a new marker to tell us if we are unmanaging --- .../main/java/org/apache/brooklyn/core/entity/Entities.java | 9 +++++++-- .../brooklyn/core/entity/lifecycle/ServiceStateLogic.java | 11 ++++++++--- .../brooklyn/core/mgmt/internal/EntityManagementSupport.java | 10 +++++++++- .../apache/brooklyn/util/core/task/BasicExecutionManager.java | 7 ++++--- .../apache/brooklyn/policy/failover/ElectPrimaryPolicy.java | 2 +- .../brooklyn/policy/failover/PrimaryRunningEnricher.java | 5 +++++ 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java index 43a5104..52d611f 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java @@ -799,12 +799,17 @@ public class Entities { /** If entity is under management and the management node is the primary for this entity, i.e. not read-only. */ public static boolean isManagedActive(Entity e) { - return ((EntityInternal)e).getManagementSupport().isDeployed() && ((EntityInternal)e).getManagementContext().isRunning() && !isReadOnly(e); + return ((EntityInternal)e).getManagementSupport().isActive() && ((EntityInternal)e).getManagementContext().isRunning() && !isReadOnly(e); + } + + /** If entity is under management or coming up and the management node is the primary for this entity, i.e. not read-only. */ + public static boolean isManagedActiveOrComingUp(Entity e) { + return (isManagedActive(e) || !((EntityInternal)e).getManagementSupport().wasDeployed()) && !isReadOnly(e); } /** If entity is under management either as primary or in read-only (hot-standby) state. */ public static boolean isManagedOrReadOnly(Entity e) { - return ((EntityInternal)e).getManagementSupport().isDeployed() && ((EntityInternal)e).getManagementContext().isRunning(); + return ((EntityInternal)e).getManagementSupport().isActive() && ((EntityInternal)e).getManagementContext().isRunning(); } public static boolean isNoLongerManaged(Entity e) { diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java b/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java index 8ab3d27..2fc948f 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/lifecycle/ServiceStateLogic.java @@ -185,7 +185,7 @@ public class ServiceStateLogic { private static void waitBrieflyForServiceUpIfStateIsRunning(Entity entity, Lifecycle state) { if (state==Lifecycle.RUNNING) { Boolean up = entity.getAttribute(Attributes.SERVICE_UP); - if (!Boolean.TRUE.equals(up) && !Entities.isReadOnly(entity)) { + if (!Boolean.TRUE.equals(up) && Entities.isManagedActive(entity)) { // pause briefly to allow any recent problem-clearing processing to complete Stopwatch timer = Stopwatch.createStarted(); boolean nowUp = Repeater.create() @@ -196,8 +196,10 @@ public class ServiceStateLogic { if (nowUp) { log.debug("Had to wait "+Duration.of(timer)+" for "+entity+" "+Attributes.SERVICE_UP+" to be true before setting "+state); } else { - log.warn("Service is not up when setting "+state+" on "+entity+"; delayed "+Duration.of(timer)+" " - + "but "+Attributes.SERVICE_UP+" did not recover from "+up+"; not-up-indicators="+entity.getAttribute(Attributes.SERVICE_NOT_UP_INDICATORS)); + if (Entities.isManagedActive(entity)) { + log.warn("Service is not up when setting " + state + " on " + entity + "; delayed " + Duration.of(timer) + " " + + "but " + Attributes.SERVICE_UP + " did not recover from " + up + "; not-up-indicators=" + entity.getAttribute(Attributes.SERVICE_NOT_UP_INDICATORS)); + } } } } @@ -322,6 +324,9 @@ public class ServiceStateLogic { if (Boolean.TRUE.equals(serviceUp) && (problems==null || problems.isEmpty())) { return Maybe.of(Lifecycle.RUNNING); } else { + if (!Entities.isManagedActive(entity)) { + return Maybe.absent("entity not managed active"); + } if (!Lifecycle.ON_FIRE.equals(entity.getAttribute(SERVICE_STATE_ACTUAL))) { Lifecycle.Transition serviceExpected = entity.getAttribute(SERVICE_STATE_EXPECTED); // very occasional race here; might want to give a grace period if entity has just transitioned, diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java index 7bb36fd..7dd074e 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/EntityManagementSupport.java @@ -91,6 +91,7 @@ public class EntityManagementSupport { protected transient volatile ExecutionContext executionContext; protected final AtomicBoolean managementContextUsable = new AtomicBoolean(false); + protected final AtomicBoolean currentlyStopping = new AtomicBoolean(false); protected final AtomicBoolean currentlyDeployed = new AtomicBoolean(false); protected final AtomicBoolean everDeployed = new AtomicBoolean(false); protected Boolean readOnly = null; @@ -107,12 +108,17 @@ public class EntityManagementSupport { } /** - * Use this instead of !Entities.isManaged(entity) to avoid skipping publishing ov values that to be published before the entity starts. + * Use this instead of negating {@link Entities#isManaged(Entity)} to avoid skipping publishing of values that to be published before the entity is deployed; + * or (better) see {@link Entities#isManagedActiveOrComingUp(Entity)} */ public boolean isNoLongerManaged() { return wasDeployed() && !isDeployed(); } + public boolean isActive() { return !isUnmanaging() && isDeployed(); } + + public boolean isUnmanaging() { return currentlyStopping.get(); } + /** whether entity has ever been deployed (managed) */ public boolean wasDeployed() { return everDeployed.get(); @@ -304,6 +310,7 @@ public class EntityManagementSupport { @SuppressWarnings("deprecation") public void onManagementStopping(ManagementTransitionInfo info, boolean wasDryRun) { synchronized (this) { + currentlyStopping.set(true); if (!wasDryRun) { if (managementContext != info.getManagementContext()) { throw new IllegalStateException("onManagementStopping encountered different management context for " + entity + @@ -383,6 +390,7 @@ public class EntityManagementSupport { entityChangeListener = EntityChangeListener.NOOP; managementContextUsable.set(false); currentlyDeployed.set(false); + currentlyStopping.set(false); executionContext = null; subscriptionContext = null; } diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java index 88812e0..0498c4f 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java @@ -418,13 +418,14 @@ public class BasicExecutionManager implements ExecutionManager { if (context != null && !Entities.isManaged(context)) { log.debug("Deleting active task on unmanagement of " + context + ": " + removed); } else { - if (removed.isDone()) { + boolean debugOnly = removed.isDone(); + + if (debugOnly) { log.debug("Deleting cancelled task before completion: " + removed + "; this task will continue to run in the background outwith " + this); } else { log.warn("Deleting submitted task before completion: " + removed + " (tags " + removed.getTags() + "); this task will continue to run in the background outwith " + this + ", but perhaps it should have been cancelled?"); - + log.debug("Active task deletion trace", new Throwable("Active task deletion trace")); } - log.debug("Active task deletion trace", new Throwable("Active task deletion trace")); } } task.getTags().forEach(t -> { diff --git a/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java b/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java index ac9531d..35adfbf 100644 --- a/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java +++ b/policy/src/main/java/org/apache/brooklyn/policy/failover/ElectPrimaryPolicy.java @@ -261,7 +261,7 @@ public class ElectPrimaryPolicy extends AbstractPolicy implements ElectPrimaryCo } } catch (Throwable e) { Exceptions.propagateIfFatal(e); - if (Entities.isNoLongerManaged(entity)) throw Exceptions.propagate(e); + if (!Entities.isManagedActive(entity)) throw Exceptions.propagate(e); Throwable root = Throwables.getRootCause(e); if (root instanceof UserFacingException) { diff --git a/policy/src/main/java/org/apache/brooklyn/policy/failover/PrimaryRunningEnricher.java b/policy/src/main/java/org/apache/brooklyn/policy/failover/PrimaryRunningEnricher.java index 0353aa8..0c8b08c 100644 --- a/policy/src/main/java/org/apache/brooklyn/policy/failover/PrimaryRunningEnricher.java +++ b/policy/src/main/java/org/apache/brooklyn/policy/failover/PrimaryRunningEnricher.java @@ -24,6 +24,7 @@ import org.apache.brooklyn.api.sensor.SensorEventListener; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.enricher.AbstractEnricher; import org.apache.brooklyn.core.entity.Attributes; +import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceNotUpLogic; @@ -55,6 +56,10 @@ public class PrimaryRunningEnricher extends AbstractEnricher implements SensorEv @Override public void onEvent(SensorEvent<Object> event) { + if (!Entities.isManagedActive(entity)) { + return; + } + Entity primary = entity.getAttribute( Sensors.newSensor(Entity.class, config().get(PRIMARY_SENSOR_NAME)) ); if (primary==null) { ServiceNotUpLogic.updateNotUpIndicator(entity, "primary.enricher", "no primary found");
