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 9b01234b667bcb7f8c7e2ff9458522236ea2ad22
Author: Alex Heneveld <[email protected]>
AuthorDate: Tue Jul 30 12:46:18 2024 +0100

    optimize immediate evaluation and task cancellation
---
 .../apache/brooklyn/core/config/ConfigConstraints.java   |  2 +-
 .../brooklyn/util/core/task/BasicExecutionContext.java   | 16 ++++++++++++----
 .../brooklyn/util/core/task/BasicExecutionManager.java   |  2 +-
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git 
a/core/src/main/java/org/apache/brooklyn/core/config/ConfigConstraints.java 
b/core/src/main/java/org/apache/brooklyn/core/config/ConfigConstraints.java
index b76d327119..0b0495b170 100644
--- a/core/src/main/java/org/apache/brooklyn/core/config/ConfigConstraints.java
+++ b/core/src/main/java/org/apache/brooklyn/core/config/ConfigConstraints.java
@@ -144,7 +144,7 @@ public abstract class ConfigConstraints<T> {
         if (exec!=null) {
             return exec.get(
                 BrooklynTaskTags.setTransient(   // set transient so gets GC 
and doesn't pollute the "top-level" view
-                    
Tasks.<Map<ConfigKey<?>,Throwable>>builder().dynamic(false).displayName("Validating
 config").body( () -> validateAll() ).build() ));
+                    
Tasks.<Map<ConfigKey<?>,Throwable>>builder().dynamic(false).displayName("Validating
 config of "+getSource()).body( () -> validateAll() ).build() ));
         } else {
             return validateAll();
         }
diff --git 
a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
 
b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
index fcbaf627ab..ff24b6fe2f 100644
--- 
a/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
+++ 
b/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
@@ -327,16 +327,24 @@ public class BasicExecutionContext extends 
AbstractExecutionContext {
         try {
             return runInSameThread(fakeTaskForContext, new 
Callable<Maybe<T>>() {
                 public Maybe<T> call() throws Exception {
+                    long count = -1;
+                    if (executionManager instanceof BasicExecutionManager) 
count = ((BasicExecutionManager)executionManager).getTotalTasksSubmitted();
                     try {
                         return 
Threads.runTemporarilyUninterrupted(job::getImmediately);
                     } finally {
                         // we've acknowledged that getImmediate may wreck 
(cancel) the task,
                         // their first priority is to prevent them from 
leaking;
-                        // however previously we did the cancel before 
running, 
-                        // doing it after means more tasks successfully 
execute 
-                        // (the interrupt is sufficient to prevent them 
blocking); 
+                        // however previously we did the cancel before running,
+                        // doing it after means more tasks successfully execute
+                        // (the interrupt is sufficient to prevent them 
blocking);
                         // see test 
EffectorSayHiTest.testInvocationGetImmediately
-                        fakeTaskForContext.cancel();
+
+                        if (count>=0 && 
(((BasicExecutionManager)executionManager).getTotalTasksSubmitted()==count || 
((BasicExecutionManager) executionManager).getNumIncompleteTasks() == 0)) {
+                            // skip interrupt if not necessary, to speed 
things up
+                            
fakeTaskForContext.cancel(TaskInternal.TaskCancellationMode.DO_NOT_INTERRUPT);
+                        } else {
+                            fakeTaskForContext.cancel();
+                        }
                     }
                 } });
         } catch (Exception e) {
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 8a73ad03e9..ead13412a8 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
@@ -982,7 +982,7 @@ public class BasicExecutionManager implements 
ExecutionManager {
                     }
                 }
                 for (Task<?> t : execMgmt.getAllTasks()) {
-                    if (task.equals(t.getSubmittedByTask())) {
+                    if (!t.isDone() && Objects.equals(task.getId(), 
t.getSubmittedByTaskId())) {
                         if (mode.isAllowedToInterruptAllSubmittedTasks() || 
BrooklynTaskTags.isTransient(t)) {
                             if (log.isTraceEnabled()) {
                                 log.trace("Cancelling " + t + " on recursive 
cancellation of " + task);

Reply via email to