Skip to content

Commit edf0b5e

Browse files
committed
Propagate cancellation of quickly cancelled async executions
1 parent f44cf97 commit edf0b5e

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

src/main/java/net/jodah/failsafe/FailsafeFuture.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class FailsafeFuture<T> extends CompletableFuture<T> {
3838
private Future<?> dependentStageFuture;
3939
private Runnable cancelFn;
4040
private List<Future<T>> timeoutFutures;
41+
private boolean cancelWithInterrupt;
4142

4243
FailsafeFuture(FailsafeExecutor<T> executor) {
4344
this.executor = executor;
@@ -68,6 +69,7 @@ public synchronized boolean cancel(boolean mayInterruptIfRunning) {
6869
if (isDone())
6970
return false;
7071

72+
this.cancelWithInterrupt = mayInterruptIfRunning;
7173
execution.cancelledIndex = Integer.MAX_VALUE;
7274
boolean cancelResult = super.cancel(mayInterruptIfRunning);
7375
cancelResult = cancelDependencies(mayInterruptIfRunning, cancelResult);
@@ -140,7 +142,11 @@ synchronized void injectPolicy(Future<?> policyExecFuture) {
140142
* Injects a {@code dependentStageFuture} to be cancelled when this future is cancelled.
141143
*/
142144
synchronized void injectStage(Future<?> dependentStageFuture) {
143-
this.dependentStageFuture = dependentStageFuture;
145+
// If outer future has already been cancelled, propagate the cancellation
146+
if (isCancelled())
147+
dependentStageFuture.cancel(cancelWithInterrupt);
148+
else
149+
this.dependentStageFuture = dependentStageFuture;
144150
}
145151

146152
/**

src/main/java/net/jodah/failsafe/Functions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ static <T> Supplier<CompletableFuture<ExecutionResult>> getPromiseOfStage(
153153
execution.preExecute();
154154
CompletionStage<? extends T> stage = supplier.get(execution);
155155
if (stage instanceof Future)
156-
execution.future.injectPolicy((Future) stage);
156+
execution.future.injectStage((Future) stage);
157157
stage.whenComplete((result, failure) -> {
158158
if (failure instanceof CompletionException)
159159
failure = failure.getCause();

0 commit comments

Comments
 (0)