Skip to content

Commit 58a461d

Browse files
committed
fix: catch exceptions in the StatusResultRetryProcess (eclipse-edc#4458)
1 parent a6138aa commit 58a461d

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

core/common/lib/state-machine-lib/src/main/java/org/eclipse/edc/statemachine/retry/StatusResultRetryProcess.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.function.Supplier;
2525

2626
import static java.lang.String.format;
27+
import static org.eclipse.edc.spi.response.ResponseStatus.FATAL_ERROR;
2728

2829
/**
2930
* Provides retry capabilities to a synchronous process that returns a {@link StatusResult} object
@@ -45,7 +46,13 @@ public StatusResultRetryProcess(E entity, Supplier<StatusResult<C>> process, Mon
4546
@Override
4647
boolean process(E entity, String description) {
4748
monitor.debug(format("%s: ID %s. %s", entity.getClass().getSimpleName(), entity.getId(), description));
48-
var result = process.get();
49+
50+
StatusResult<C> result;
51+
try {
52+
result = process.get();
53+
} catch (Exception e) {
54+
result = StatusResult.failure(FATAL_ERROR, "Unexpected exception thrown %s: %s".formatted(e, e.getMessage()));
55+
}
4956

5057
handleResult(entity, description, result);
5158

core/common/lib/state-machine-lib/src/test/java/org/eclipse/edc/statemachine/retry/StatusResultRetryProcessTest.java

+19
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
package org.eclipse.edc.statemachine.retry;
1616

17+
import org.eclipse.edc.spi.EdcException;
1718
import org.eclipse.edc.spi.monitor.Monitor;
1819
import org.eclipse.edc.spi.response.ResponseFailure;
1920
import org.eclipse.edc.spi.response.StatusResult;
@@ -29,8 +30,11 @@
2930
import static org.assertj.core.api.Assertions.assertThat;
3031
import static org.eclipse.edc.spi.response.ResponseStatus.ERROR_RETRY;
3132
import static org.eclipse.edc.spi.response.ResponseStatus.FATAL_ERROR;
33+
import static org.mockito.ArgumentMatchers.any;
34+
import static org.mockito.ArgumentMatchers.same;
3235
import static org.mockito.Mockito.mock;
3336
import static org.mockito.Mockito.verify;
37+
import static org.mockito.Mockito.verifyNoInteractions;
3438
import static org.mockito.Mockito.when;
3539

3640
class StatusResultRetryProcessTest {
@@ -93,4 +97,19 @@ void shouldExecuteOnRetry_whenFailureAndRetriesHaveNotBeenExhausted() {
9397

9498
verify(onFailure).accept(entity, statusResult.getFailure());
9599
}
100+
101+
102+
@Test
103+
void shouldCallFatalError_whenExceptionIsThrown() {
104+
when(process.get()).thenThrow(new EdcException("code throws an exception"));
105+
var entity = TestEntity.Builder.newInstance().id(UUID.randomUUID().toString()).clock(clock).build();
106+
var retryProcess = new StatusResultRetryProcess<>(entity, process, mock(Monitor.class), clock, configuration);
107+
108+
var result = retryProcess.onSuccess(onSuccess).onFatalError(onFatalError).execute("any");
109+
110+
assertThat(result).isTrue();
111+
verify(process).get();
112+
verify(onFatalError).accept(same(entity), any());
113+
verifyNoInteractions(onSuccess);
114+
}
96115
}

0 commit comments

Comments
 (0)