You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:49:01 UTC

[15/50] brooklyn-server git commit: Fix EntityManagementSupport race for changeListener

Fix EntityManagementSupport race for changeListener

- Fixes race where effector called post-exec listener concurrent
  with app.stop(), which unmanaged the app.
  Caused exception, and thus test's tearDown to fail.


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

Branch: refs/heads/0.5.0
Commit: 19938ce8833b40c7b6ea990fcd77d04de3544cc9
Parents: 64da3fc
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 10 11:08:50 2013 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Apr 10 14:29:57 2013 +0100

----------------------------------------------------------------------
 .../NonDeploymentManagementContext.java         | 61 +++++++++++++++++++-
 1 file changed, 59 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/19938ce8/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
index aed0dbb..9b915aa 100644
--- a/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
+++ b/core/src/main/java/brooklyn/management/internal/NonDeploymentManagementContext.java
@@ -5,9 +5,12 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import java.net.URL;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 import brooklyn.catalog.BrooklynCatalog;
 import brooklyn.config.StringConfigMap;
@@ -17,6 +20,7 @@ import brooklyn.entity.Entity;
 import brooklyn.entity.basic.AbstractEntity;
 import brooklyn.entity.drivers.EntityDriverManager;
 import brooklyn.entity.drivers.downloads.DownloadResolverManager;
+import brooklyn.entity.rebind.ChangeListener;
 import brooklyn.entity.rebind.RebindManager;
 import brooklyn.location.LocationRegistry;
 import brooklyn.management.EntityManager;
@@ -24,6 +28,8 @@ import brooklyn.management.ExecutionContext;
 import brooklyn.management.ExecutionManager;
 import brooklyn.management.SubscriptionContext;
 import brooklyn.management.Task;
+import brooklyn.mementos.BrooklynMemento;
+import brooklyn.mementos.BrooklynMementoPersister;
 import brooklyn.util.task.AbstractExecutionContext;
 
 public class NonDeploymentManagementContext implements ManagementContextInternal {
@@ -140,8 +146,16 @@ public class NonDeploymentManagementContext implements ManagementContextInternal
 
     @Override
     public RebindManager getRebindManager() {
-        checkInitialManagementContextReal();
-        return initialManagementContext.getRebindManager();
+        // There was a race where EffectorUtils on invoking an effector calls:
+        //     mgmtSupport.getEntityChangeListener().onEffectorCompleted(eff);
+        // but where the entity/app may be being unmanaged concurrently (e.g. calling app.stop()).
+        // So now we allow the change-listener to be called.
+        
+        if (isInitialManagementContextReal()) {
+            return initialManagementContext.getRebindManager();
+        } else {
+            return new NonDeploymentRebindManager();
+        }
     }
 
     @Override
@@ -265,4 +279,47 @@ public class NonDeploymentManagementContext implements ManagementContextInternal
             throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
         }
     }
+    
+    /**
+     * For when the initial management context is not "real"; the changeListener is a no-op, but everything else forbidden.
+     * 
+     * @author aled
+     */
+    private class NonDeploymentRebindManager implements RebindManager {
+
+        @Override
+        public ChangeListener getChangeListener() {
+            return ChangeListener.NOOP;
+        }
+
+        @Override
+        public void setPersister(BrooklynMementoPersister persister) {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+
+        @Override
+        public BrooklynMementoPersister getPersister() {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+
+        @Override
+        public List<Application> rebind(BrooklynMemento memento) {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+
+        @Override
+        public List<Application> rebind(BrooklynMemento memento, ClassLoader classLoader) {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+
+        @Override
+        public void stop() {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+
+        @Override
+        public void waitForPendingComplete(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {
+            throw new IllegalStateException("Non-deployment context "+NonDeploymentManagementContext.this+" is not valid for this operation.");
+        }
+    }
 }