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" })
