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 da5e8360e58371334635dd9329793c135fea0392 Author: Alex Heneveld <[email protected]> AuthorDate: Sun Jun 18 01:45:07 2023 +0100 use weak map to access more tasks in memory sometimes tasks are brooklyn GC'd, ie removed from the map, but still referenced elsewhere, giving a lot more "task GC'd" messages than necessary. by using weak refs, if there are still child references, a direct request will find the task even if brooklyn has determined it can be GC'd --- .../util/core/task/BasicExecutionManager.java | 23 +++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) 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 005ba07336..e2cde9a050 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 @@ -21,16 +21,9 @@ package org.apache.brooklyn.util.core.task; import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.Iterables; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; + +import java.lang.ref.WeakReference; +import java.util.*; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; import java.util.concurrent.ConcurrentHashMap; @@ -50,6 +43,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; + +import com.google.common.collect.MapMaker; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.internal.BrooklynLoggingCategories; import org.apache.brooklyn.api.mgmt.ExecutionContext; @@ -270,7 +265,8 @@ public class BasicExecutionManager implements ExecutionManager { //NB CopyOnWriteArraySet is a perf bottleneck, and the simple map makes it easier to remove when a tag is empty private Map<Object, Set<Task<?>>> tasksByTag = new HashMap<Object, Set<Task<?>>>(); - private ConcurrentMap<String, Task<?>> tasksById = new ConcurrentHashMap<String, Task<?>>(); + private Map<String, Task<?>> tasksById = new ConcurrentHashMap<String, Task<?>>(); + private Map<String, Task<?>> tasksByIdWeak = Collections.synchronizedMap(new MapMaker().weakValues().makeMap()); private ConcurrentMap<Object, TaskScheduler> schedulerByTag = new ConcurrentHashMap<Object, TaskScheduler>(); @@ -593,7 +589,9 @@ public class BasicExecutionManager implements ExecutionManager { @Override public Task<?> getTask(String id) { - return tasksById.get(id); + Task<?> result = tasksById.get(id); + if (result==null) result = tasksByIdWeak.get(id); + return result; } /** @@ -1123,6 +1121,7 @@ public class BasicExecutionManager implements ExecutionManager { } tasksById.put(task.getId(), task); + tasksByIdWeak.put(task.getId(), task); totalTaskCount.incrementAndGet(); }
