Skip to content

Commit acfadbf

Browse files
Avoid spamming retries in nexusOperationApplicationFailureFailureConversion (#2272)
Avoid spamming retries in nexusOperationApplicationFailureFailureConversion
1 parent cda0471 commit acfadbf

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

temporal-sdk/src/test/java/io/temporal/workflow/nexus/OperationFailureConversionTest.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@
2828
import io.temporal.client.WorkflowFailedException;
2929
import io.temporal.failure.ApplicationFailure;
3030
import io.temporal.failure.NexusOperationFailure;
31-
import io.temporal.failure.TimeoutFailure;
3231
import io.temporal.testing.internal.SDKTestWorkflowRule;
3332
import io.temporal.workflow.*;
3433
import io.temporal.workflow.shared.TestNexusServices;
3534
import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1;
3635
import java.time.Duration;
36+
import java.util.Map;
37+
import java.util.concurrent.ConcurrentHashMap;
3738
import org.junit.Assert;
3839
import org.junit.Rule;
3940
import org.junit.Test;
@@ -82,7 +83,10 @@ public void nexusOperationApplicationFailureFailureConversion() {
8283
WorkflowFailedException.class, () -> workflowStub.execute("ApplicationFailure"));
8384
Assert.assertTrue(exception.getCause() instanceof NexusOperationFailure);
8485
NexusOperationFailure nexusFailure = (NexusOperationFailure) exception.getCause();
85-
Assert.assertTrue(nexusFailure.getCause() instanceof TimeoutFailure);
86+
Assert.assertTrue(nexusFailure.getCause() instanceof ApplicationFailure);
87+
ApplicationFailure applicationFailure = (ApplicationFailure) nexusFailure.getCause();
88+
Assert.assertTrue(
89+
applicationFailure.getOriginalMessage().contains("exceeded invocation count"));
8690
}
8791

8892
public static class TestNexus implements TestWorkflow1 {
@@ -104,11 +108,21 @@ public String execute(String testcase) {
104108

105109
@ServiceImpl(service = TestNexusServices.TestNexusService1.class)
106110
public class TestNexusServiceImpl {
111+
Map<String, Integer> invocationCount = new ConcurrentHashMap<>();
112+
107113
@OperationImpl
108114
public OperationHandler<String, String> operation() {
109115
return OperationHandler.sync(
110116
(ctx, details, name) -> {
117+
invocationCount.put(
118+
details.getRequestId(),
119+
invocationCount.getOrDefault(details.getRequestId(), 0) + 1);
111120
if (name.equals("ApplicationFailure")) {
121+
// Limit the number of retries to 2 to avoid overwhelming the test server
122+
if (invocationCount.get(details.getRequestId()) >= 2) {
123+
throw ApplicationFailure.newNonRetryableFailure(
124+
"exceeded invocation count", "ExceededInvocationCount");
125+
}
112126
throw ApplicationFailure.newFailure("failed to call operation", "TestFailure");
113127
} else if (name.equals("ApplicationFailureNonRetryable")) {
114128
throw ApplicationFailure.newNonRetryableFailure(

0 commit comments

Comments
 (0)