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 <[email protected]> Authored: Tue Sep 12 22:11:56 2017 +0100 Committer: Alex Heneveld <[email protected]> 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);
