preserve errors as much as possible when submitted to run in same thread

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

Branch: refs/heads/master
Commit: 24250a5e2c4e380b06e72fc9db52d3e5989fd00e
Parents: 26dffef
Author: Alex Heneveld <[email protected]>
Authored: Sat Sep 16 04:43:31 2017 +0100
Committer: Alex Heneveld <[email protected]>
Committed: Sat Sep 16 04:44:12 2017 +0100

----------------------------------------------------------------------
 .../util/core/task/BasicExecutionContext.java   | 51 +++++++++++---------
 1 file changed, 28 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/24250a5e/core/src/main/java/org/apache/brooklyn/util/core/task/BasicExecutionContext.java
----------------------------------------------------------------------
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 73baef2..7953b14 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
@@ -133,16 +133,15 @@ public class BasicExecutionContext extends 
AbstractExecutionContext {
             }
         }
 
-        return runInSameThread(t, new Callable<Maybe<T>>() {
-            public Maybe<T> call() {
-                try {
+        try {
+            return runInSameThread(t, new Callable<Maybe<T>>() {
+                public Maybe<T> call() throws Exception {
                     return Maybe.of(t.getJob().call());
-                } catch (Exception e) {
-                    Exceptions.propagateIfFatal(e);
-                    return Maybe.absent(e);
                 }
-            }
-        }).get();
+            }).get();
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
     }
     
     private static class SimpleFuture<T> implements Future<T> {
@@ -190,7 +189,7 @@ public class BasicExecutionContext extends 
AbstractExecutionContext {
         }
     }
     
-    private <T> Maybe<T> runInSameThread(final Task<T> task, 
Callable<Maybe<T>> job) {
+    private <T> Maybe<T> runInSameThread(final Task<T> task, 
Callable<Maybe<T>> job) throws Exception {
         ((TaskInternal<T>)task).getMutableTags().addAll(tags);
         
         Task<?> previousTask = 
BasicExecutionManager.getPerThreadCurrentTask().get();
@@ -209,9 +208,11 @@ public class BasicExecutionContext extends 
AbstractExecutionContext {
             return future.set(job.call());
             
         } catch (Exception e) {
-            error = e;
             future.set(Maybe.absent(e));
-            throw Exceptions.propagate(e);
+            Exceptions.propagateIfInterrupt(e);
+            error = e;
+            // error above will be rethrown by `afterEnd`
+            return null;  // not actually returned
             
         } finally {
             try {
@@ -252,19 +253,23 @@ public class BasicExecutionContext extends 
AbstractExecutionContext {
         fakeTaskForContext.tags.add(BrooklynTaskTags.IMMEDIATE_TASK_TAG);
         fakeTaskForContext.tags.add(BrooklynTaskTags.TRANSIENT_TASK_TAG);
 
-        return runInSameThread(fakeTaskForContext, new Callable<Maybe<T>>() {
-            public Maybe<T> call() {
-                fakeTaskForContext.cancel();
-                
-                boolean wasAlreadyInterrupted = Thread.interrupted();
-                try {
-                    return job.getImmediately();
-                } finally {
-                    if (wasAlreadyInterrupted) {
-                        Thread.currentThread().interrupt();
+        try {
+            return runInSameThread(fakeTaskForContext, new 
Callable<Maybe<T>>() {
+                public Maybe<T> call() {
+                    fakeTaskForContext.cancel();
+                    
+                    boolean wasAlreadyInterrupted = Thread.interrupted();
+                    try {
+                        return job.getImmediately();
+                    } finally {
+                        if (wasAlreadyInterrupted) {
+                            Thread.currentThread().interrupt();
+                        }
                     }
-                }
-            } });
+                } });
+        } catch (Exception e) {
+            throw Exceptions.propagate(e);
+        }
     }
     
     @SuppressWarnings({ "unchecked", "rawtypes" })

Reply via email to