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/28 15:02:11 UTC

[3/7] brooklyn-server git commit: Add locking on cachedTask for DSL effector

Add locking on cachedTask for DSL effector


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

Branch: refs/heads/master
Commit: 3bb0397cac9c2d62d757f5e27547a28c789cf2f4
Parents: 8efc762
Author: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Authored: Wed Aug 10 09:04:04 2016 +0100
Committer: Andrew Donald Kennedy <an...@cloudsoftcorp.com>
Committed: Tue Feb 28 14:26:43 2017 +0000

----------------------------------------------------------------------
 .../brooklyn/spi/dsl/methods/DslComponent.java  | 35 ++++++++++++++------
 1 file changed, 25 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/3bb0397c/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
index 891f1f2..3df68db 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/methods/DslComponent.java
@@ -539,12 +539,14 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> implements
         private final Map<String, ?> args;
         private final List<? extends Object> argList;
         private Task<?> cachedTask;
+
         public ExecuteEffector(DslComponent component, String effectorName, Map<String, ?> args) {
             this.component = Preconditions.checkNotNull(component);
             this.effectorName = effectorName;
             this.args = args;
             this.argList = null;
         }
+
         public ExecuteEffector(DslComponent component, String effectorName, List<? extends Object> args) {
             this.component = Preconditions.checkNotNull(component);
             this.effectorName = effectorName;
@@ -560,20 +562,26 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> implements
             if (targetEffector.isAbsentOrNull()) {
                 throw new IllegalArgumentException("Effector " + effectorName + " not found on entity: " + targetEntity);
             }
-            if (cachedTask == null) {
-                if (argList == null) {
-                    cachedTask = Entities.invokeEffector(targetEntity, targetEntity, targetEffector.get(), args);
-                } else {
-                    cachedTask = invokeWithDeferredArgs(targetEntity, targetEffector.get(), argList);
+            synchronized (this) {
+                if (cachedTask == null) {
+                    if (argList == null) {
+                        cachedTask = Entities.invokeEffector(targetEntity, targetEntity, targetEffector.get(), args);
+                    } else {
+                        cachedTask = invokeWithDeferredArgs(targetEntity, targetEffector.get(), argList);
+                    }
                 }
             }
             return (Task<Object>) cachedTask;
         }
+
         private Task<Object> invokeWithDeferredArgs(final Entity targetEntity, final Effector<?> targetEffector, final List<? extends Object> args) {
             List<TaskAdaptable<Object>> taskArgs = Lists.newArrayList();
             for (Object arg : args) {
-                if (arg instanceof TaskAdaptable) taskArgs.add((TaskAdaptable<Object>) arg);
-                else if (arg instanceof TaskFactory) taskArgs.add(((TaskFactory<TaskAdaptable<Object>>) arg).newTask());
+                if (arg instanceof TaskAdaptable) {
+                    taskArgs.add((TaskAdaptable<Object>) arg);
+                } else if (arg instanceof TaskFactory) {
+                    taskArgs.add(((TaskFactory<TaskAdaptable<Object>>) arg).newTask());
+                }
             }
 
             return DependentConfiguration.transformMultiple(
@@ -585,9 +593,13 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> implements
                             Object[] vv = new Object[args.size()];
                             int i=0;
                             for (Object arg : args) {
-                                if (arg instanceof TaskAdaptable || arg instanceof TaskFactory) vv[i] = tri.next();
-                                else if (arg instanceof DeferredSupplier) vv[i] = ((DeferredSupplier<?>) arg).get();
-                                else vv[i] = arg;
+                                if (arg instanceof TaskAdaptable || arg instanceof TaskFactory) {
+                                    vv[i] = tri.next();
+                                } else if (arg instanceof DeferredSupplier) {
+                                    vv[i] = ((DeferredSupplier<?>) arg).get();
+                                } else {
+                                    vv[i] = arg;
+                                }
                                 i++;
                             }
                             return Entities.invokeEffectorWithArgs(targetEntity, targetEntity, targetEffector, vv);
@@ -595,10 +607,12 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> implements
                     },
                     taskArgs);
         }
+
         @Override
         public int hashCode() {
             return Objects.hashCode(component, effectorName);
         }
+
         @Override
         public boolean equals(Object obj) {
             if (this == obj) return true;
@@ -607,6 +621,7 @@ public class DslComponent extends BrooklynDslDeferredSupplier<Entity> implements
             return Objects.equal(this.component, that.component) &&
                     Objects.equal(this.effectorName, that.effectorName);
         }
+
         @Override
         public String toString() {
             return (component.scope==Scope.THIS ? "" : component.toString()+".") +