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 2017/10/03 14:23:42 UTC

[05/35] brooklyn-server git commit: optimization: skip tags copy on common simple lookups

optimization: skip tags copy on common simple lookups


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

Branch: refs/heads/master
Commit: 438846c2967a64e109395a258effbf5b4db2cfd4
Parents: 16c788e
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Tue Sep 12 22:11:56 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Sep 15 10:29:07 2017 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java | 12 ++++++------
 .../core/mgmt/internal/BrooklynGarbageCollector.java    |  5 +++--
 .../brooklyn/util/core/task/BasicExecutionManager.java  |  8 ++++----
 .../org/apache/brooklyn/util/core/task/BasicTask.java   |  1 +
 .../org/apache/brooklyn/util/core/task/TaskTags.java    | 10 +++++++++-
 .../java/org/apache/brooklyn/util/core/task/Tasks.java  |  2 +-
 6 files changed, 24 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/438846c2/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
index 7d721d0..5cb1027 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java
@@ -140,7 +140,7 @@ public class BrooklynTaskTags extends TaskTags {
 
     public static WrappedEntity getWrappedEntityTagOfType(Task<?> t, String wrappingType) {
         if (t==null) return null;
-        return getWrappedEntityTagOfType(t.getTags(), wrappingType);
+        return getWrappedEntityTagOfType( getTagsFast(t), wrappingType);
     }
     public static WrappedEntity getWrappedEntityTagOfType(Collection<?> tags, String wrappingType) {
         for (Object x: tags)
@@ -196,7 +196,7 @@ public class BrooklynTaskTags extends TaskTags {
     }
 
     public static ManagementContext getManagementContext(Task<?> task) {
-        for (Object tag : task.getTags())
+        for (Object tag : getTagsFast(task))
             if ((tag instanceof ManagementContext))
                 return (ManagementContext) tag;
         return null;
@@ -297,7 +297,7 @@ public class BrooklynTaskTags extends TaskTags {
     /** returns the set of tags indicating the streams available on a task */
     public static Set<WrappedStream> streams(Task<?> task) {
         Set<WrappedStream> result = new LinkedHashSet<BrooklynTaskTags.WrappedStream>();
-        for (Object tag: task.getTags()) {
+        for (Object tag: getTagsFast(task)) {
             if (tag instanceof WrappedStream) {
                 result.add((WrappedStream)tag);
             }
@@ -308,7 +308,7 @@ public class BrooklynTaskTags extends TaskTags {
     /** returns the tag for the indicated stream, or null */
     public static WrappedStream stream(Task<?> task, String streamType) {
         if (task==null) return null;
-        for (Object tag: task.getTags())
+        for (Object tag: getTagsFast(task))
             if ((tag instanceof WrappedStream) && ((WrappedStream)tag).streamType.equals(streamType))
                 return (WrappedStream)tag;
         return null;
@@ -432,7 +432,7 @@ public class BrooklynTaskTags extends TaskTags {
     public static EffectorCallTag getEffectorCallTag(Task<?> task, boolean recurse) {
         Task<?> t = task;
         while (t!=null) {
-            for (Object tag: t.getTags()) {
+            for (Object tag: getTagsFast(task)) {
                 if (tag instanceof EffectorCallTag)
                     return (EffectorCallTag)tag;
             }
@@ -473,7 +473,7 @@ public class BrooklynTaskTags extends TaskTags {
 
     public static EntitlementContext getEntitlement(Task<?> task) {
         if (task==null) return null;
-        return getEntitlement(task.getTags());
+        return getEntitlement(getTagsFast(task));
     }
     
     public static EntitlementContext getEntitlement(Collection<?> tags) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/438846c2/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
index 98dfd90..203c3a5 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/internal/BrooklynGarbageCollector.java
@@ -52,6 +52,7 @@ import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.collections.MutableSet;
 import org.apache.brooklyn.util.core.task.BasicExecutionManager;
 import org.apache.brooklyn.util.core.task.ExecutionListener;
+import org.apache.brooklyn.util.core.task.TaskTags;
 import org.apache.brooklyn.util.core.task.Tasks;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.guava.Maybe.SoftlyPresent;
@@ -301,7 +302,7 @@ public class BrooklynGarbageCollector {
     protected boolean shouldDeleteTaskImmediately(Task<?> task) {
         if (!task.isDone()) return false;
         
-        Set<Object> tags = task.getTags();
+        Set<Object> tags = BrooklynTaskTags.getTagsFast(task);
         if (tags.contains(ManagementContextInternal.TRANSIENT_TASK_TAG))
             return true;
         if (tags.contains(ManagementContextInternal.EFFECTOR_TAG) || tags.contains(ManagementContextInternal.NON_TRANSIENT_TASK_TAG))
@@ -533,7 +534,7 @@ public class BrooklynGarbageCollector {
             for (Task<?> task: tasks) {
                 if (!task.isDone()) continue;
                 
-                Set<Object> tags = task.getTags();
+                Set<Object> tags = TaskTags.getTagsFast(task);
 
                 int categoryTags = 0, tooFullCategoryTags = 0;
                 for (Object tag: tags) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/438846c2/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionManager.java
----------------------------------------------------------------------
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 aa16e7b..729639d 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
@@ -239,7 +239,7 @@ public class BasicExecutionManager implements ExecutionManager {
     }
 
     protected boolean deleteTaskNonRecursive(Task<?> task) {
-        Set<?> tags = checkNotNull(task, "task").getTags();
+        Set<?> tags = TaskTags.getTagsFast(checkNotNull(task, "task"));
         for (Object tag : tags) {
             synchronized (tasksByTag) {
                 Set<Task<?>> tasks = tasksWithTagLiveOrNull(tag);
@@ -669,7 +669,7 @@ public class BasicExecutionManager implements ExecutionManager {
     protected <T> Task<T> submitNewTask(final Map<?,?> flags, final Task<T> task) {
         if (log.isTraceEnabled()) {
             log.trace("Submitting task {} ({}), with flags {}, and tags {}, job {}; caller {}", 
-                new Object[] {task.getId(), task, Sanitizer.sanitize(flags), task.getTags(), 
+                new Object[] {task.getId(), task, Sanitizer.sanitize(flags), BrooklynTaskTags.getTagsFast(task), 
                 (task instanceof TaskInternal ? ((TaskInternal<T>)task).getJob() : "<unavailable>"),
                 Tasks.current() });
             if (Tasks.current()==null && BrooklynTaskTags.isTransient(task)) {
@@ -692,7 +692,7 @@ public class BasicExecutionManager implements ExecutionManager {
         
         // If there's a scheduler then use that; otherwise execute it directly
         Set<TaskScheduler> schedulers = null;
-        for (Object tago: task.getTags()) {
+        for (Object tago: BrooklynTaskTags.getTagsFast(task)) {
             TaskScheduler scheduler = getTaskSchedulerForTag(tago);
             if (scheduler!=null) {
                 if (schedulers==null) schedulers = new LinkedHashSet<TaskScheduler>(2);
@@ -738,7 +738,7 @@ public class BasicExecutionManager implements ExecutionManager {
         if (flags.get("tag")!=null) ((TaskInternal<?>)task).getMutableTags().add(flags.remove("tag"));
         if (flags.get("tags")!=null) ((TaskInternal<?>)task).getMutableTags().addAll((Collection<?>)flags.remove("tags"));
 
-        for (Object tag: ((TaskInternal<?>)task).getTags()) {
+        for (Object tag: BrooklynTaskTags.getTagsFast(task)) {
             tasksWithTagCreating(tag).add(task);
         }
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/438846c2/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
index 5e63c68..4398675 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicTask.java
@@ -917,6 +917,7 @@ public class BasicTask<T> implements TaskInternal<T> {
     @SuppressWarnings({ "unchecked", "rawtypes" })
     @Override
     public void setSubmittedByTask(Task<?> task) {
+        // possible optimization, store details but don't create task until later
         submittedByTask = Maybe.softThen((Task)task, (Maybe)Maybe.of(BasicTask.newGoneTaskFor(task)));
     }
     

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/438846c2/core/src/main/java/org/apache/brooklyn/util/core/task/TaskTags.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/TaskTags.java b/core/src/main/java/org/apache/brooklyn/util/core/task/TaskTags.java
index 4319796..c62ace4 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/TaskTags.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/TaskTags.java
@@ -25,6 +25,7 @@ import javax.annotation.Nullable;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
 
+import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 
 public class TaskTags {
@@ -63,7 +64,7 @@ public class TaskTags {
 
     public static boolean hasTag(Task<?> task, Object tag) {
         if (task==null) return false;
-        return task.getTags().contains(tag);
+        return getTagsFast(task).contains(tag);
     }
     
     public static <U,V extends TaskAdaptable<U>> V markInessential(V task) {
@@ -71,4 +72,11 @@ public class TaskTags {
         return task;
     }
 
+    @Beta
+    public static Set<Object> getTagsFast(Task<?> task) {
+        if (task==null) return null;
+        if (task instanceof BasicTask) return ((BasicTask<?>)task).getMutableTags();
+        return task.getTags();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/438846c2/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java b/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
index 66c4068..2db73df 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
@@ -253,7 +253,7 @@ public class Tasks {
     public static <T> T tag(@Nullable Task<?> task, Class<T> type, boolean recurseHierarchy) {
         // support null task to make it easier for callers to walk hierarchies
         if (task==null) return null;
-        for (Object tag: task.getTags())
+        for (Object tag: TaskTags.getTagsFast(task))
             if (type.isInstance(tag)) return (T)tag;
         if (!recurseHierarchy) return null;
         return tag(task.getSubmittedByTask(), type, true);