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 88fc1a57ce8144a8a19210385957b643ff7f146e
Author: Alex Heneveld <[email protected]>
AuthorDate: Mon Sep 13 22:17:42 2021 +0100

    GC periodic-persistence tasks immediately
    
    cut down debug logging about GC when system is doing nothing
---
 .../mgmt/internal/BrooklynGarbageCollector.java    | 22 ++++++++++++++++------
 .../util/core/task/BasicExecutionManager.java      |  9 +++++++--
 2 files changed, 23 insertions(+), 8 deletions(-)

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 2d932fd..ca1e075 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
@@ -18,6 +18,7 @@
  */
 package org.apache.brooklyn.core.mgmt.internal;
 
+import com.google.common.annotations.VisibleForTesting;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -35,6 +36,7 @@ import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import java.util.stream.Collectors;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
 import org.apache.brooklyn.api.mgmt.HasTaskChildren;
@@ -154,6 +156,7 @@ public class BrooklynGarbageCollector {
             return (end1 < end2) ? -1 : ((end1 == end2) ? 0 : 1);
         }
     };
+    protected final static Comparator<Task<?>> TASKS_NEWEST_FIRST_COMPARATOR = 
(t1,t2) -> -TASKS_OLDEST_FIRST_COMPARATOR.compare(t1, t2);
     
     private final BasicExecutionManager executionManager;
     @SuppressWarnings("unused")  // TODO remove BrooklynStorage altogether?
@@ -330,7 +333,8 @@ public class BrooklynGarbageCollector {
      * Deletes old tasks. The age/number of tasks to keep is controlled by 
fields like 
      * {@link #MAX_TASKS_PER_TAG} and {@link #MAX_TASKS_PER_TAG}.
      */
-    protected synchronized int gcTasks() {
+    @VisibleForTesting
+    public synchronized int gcTasks() {
         // NB: be careful with memory usage here: have seen OOME if we get 
crazy lots of tasks.
         // hopefully the use new limits, filters, and use of live lists in 
some places (added Sep 2014) will help.
         // 
@@ -607,13 +611,19 @@ public class BrooklynGarbageCollector {
             LOG.debug("Got CME inspecting tasks, with 
"+tasksToConsiderDeleting.size()+" found for deletion: "+e);
         }
 
-        if (LOG.isDebugEnabled())
-            LOG.debug("brooklyn-gc detected 
"+taskTagsInCategoryOverCapacity.size()+" "+category+" "
+        Collections.sort(tasksToConsiderDeleting, 
TASKS_OLDEST_FIRST_COMPARATOR);
+
+        if (LOG.isDebugEnabled()) {
+            MutableList<Task<?>> tasksToConsiderDeletingNewest = 
MutableList.copyOf(tasksToConsiderDeleting);
+            Collections.sort(tasksToConsiderDeletingNewest, 
TASKS_NEWEST_FIRST_COMPARATOR);
+            LOG.debug("brooklyn-gc detected " + 
taskTagsInCategoryOverCapacity.size() + " " + category + " "
                     + "tags over capacity, expiring old tasks; "
-                    + tasksToConsiderDeleting.size()+" tasks under 
consideration; categories are: "
-                    + taskTagsInCategoryOverCapacity);
+                    + tasksToConsiderDeleting.size() + " tasks under 
consideration; categories are: "
+                    + taskTagsInCategoryOverCapacity + "; including "
+                    + 
tasksToConsiderDeleting.stream().limit(5).collect(Collectors.toList()) + " ... "
+                    + 
tasksToConsiderDeletingNewest.stream().limit(5).collect(Collectors.toList()) );
+        }
 
-        Collections.sort(tasksToConsiderDeleting, 
TASKS_OLDEST_FIRST_COMPARATOR);
         // now try deleting tasks which are overcapacity for each (non-entity) 
tag
         int deleted = 0;
         for (Task<?> task: tasksToConsiderDeleting) {
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 f1496fc..d7af2c0 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
@@ -108,7 +108,7 @@ public class BasicExecutionManager implements 
ExecutionManager {
     public static final String LOGGING_MDC_KEY_ENTITY_IDS = "entity.ids";
     public static final String LOGGING_MDC_KEY_TASK_ID = "task.id";
 
-    private static final boolean SCHEDULED_TASKS_COUNT_AS_ACTIVE = false;
+    private static final boolean SCHEDULED_TASKS_COUNT_AS_ACTIVE = true;
 
     private boolean jitterThreads = 
BrooklynFeatureEnablement.isEnabled(BrooklynFeatureEnablement.FEATURE_JITTER_THREADS);
     private int jitterThreadsMaxDelay = 
Integer.getInteger(JITTER_THREADS_MAX_DELAY_PROPERTY, 200);
@@ -967,7 +967,7 @@ public class BasicExecutionManager implements 
ExecutionManager {
      * but before doing any of the task's work, so that we can update 
bookkeeping and notify callbacks */
     protected void internalBeforeStart(Map<?,?> flags, Task<?> task, boolean 
skipIncrementCounter, boolean allowJitter, boolean 
startingThisThreadMightEndElsewhere) {
         int count = skipIncrementCounter ? activeTaskCount.get() : 
activeTaskCount.incrementAndGet();
-        if (count % 1000==0) {
+        if (count % 1000==0 && count>0) {
             log.warn("High number of active tasks: task #"+count+" is "+task);
         }
         
@@ -1119,6 +1119,11 @@ public class BasicExecutionManager implements 
ExecutionManager {
             }
             ((TaskInternal<?>)task).setThread(null);
 
+            // if uninteresting and transient and scheduled, go ahead and 
remove from task tags also, so it won't be reported as GC'd
+            if (BrooklynTaskTags.isTransient(task) && 
UNINTERESTING_TASK_NAMES.contains(task.getDisplayName()) && 
task.getSubmittedByTask() instanceof ScheduledTask) {
+                deleteTask(task);
+            }
+
         } finally {
             try {
                 if (error!=null) {

Reply via email to