diff --git a/src/main/java/io/temporal/internal/replay/ReplayWorkflowContext.java b/src/main/java/io/temporal/internal/replay/ReplayWorkflowContext.java index 0dc8564951..b9978aac8e 100644 --- a/src/main/java/io/temporal/internal/replay/ReplayWorkflowContext.java +++ b/src/main/java/io/temporal/internal/replay/ReplayWorkflowContext.java @@ -262,4 +262,6 @@ void getVersion( /** Updates or inserts search attributes used to index workflows. */ void upsertSearchAttributes(SearchAttributes searchAttributes); + + int getAttempt(); } diff --git a/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java b/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java index 5b9217c82b..690d6c4433 100644 --- a/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java +++ b/src/main/java/io/temporal/internal/replay/ReplayWorkflowContextImpl.java @@ -339,4 +339,9 @@ public void upsertSearchAttributes(SearchAttributes searchAttributes) { workflowStateMachines.upsertSearchAttributes(searchAttributes); workflowContext.mergeSearchAttributes(searchAttributes); } + + @Override + public int getAttempt() { + return workflowContext.getAttempt(); + } } diff --git a/src/main/java/io/temporal/internal/replay/WorkflowContext.java b/src/main/java/io/temporal/internal/replay/WorkflowContext.java index d2ac2e8509..335b1a41b9 100644 --- a/src/main/java/io/temporal/internal/replay/WorkflowContext.java +++ b/src/main/java/io/temporal/internal/replay/WorkflowContext.java @@ -151,6 +151,10 @@ SearchAttributes getSearchAttributes() { : searchAttributes.build(); } + int getAttempt() { + return startedAttributes.getAttempt(); + } + public List getContextPropagators() { return contextPropagators; } diff --git a/src/main/java/io/temporal/internal/sync/DeterministicRunnerImpl.java b/src/main/java/io/temporal/internal/sync/DeterministicRunnerImpl.java index 6a2da63449..37aa1fa104 100644 --- a/src/main/java/io/temporal/internal/sync/DeterministicRunnerImpl.java +++ b/src/main/java/io/temporal/internal/sync/DeterministicRunnerImpl.java @@ -738,5 +738,10 @@ public UUID randomUUID() { public void upsertSearchAttributes(SearchAttributes searchAttributes) { throw new UnsupportedOperationException("not implemented"); } + + @Override + public int getAttempt() { + return 1; + } } } diff --git a/src/main/java/io/temporal/internal/sync/WorkflowInfoImpl.java b/src/main/java/io/temporal/internal/sync/WorkflowInfoImpl.java index 91d073a8d3..7e4522300b 100644 --- a/src/main/java/io/temporal/internal/sync/WorkflowInfoImpl.java +++ b/src/main/java/io/temporal/internal/sync/WorkflowInfoImpl.java @@ -99,4 +99,9 @@ public Optional getParentRunId() { ? Optional.empty() : Optional.of(parentWorkflowExecution.getRunId()); } + + @Override + public int getAttempt() { + return context.getAttempt(); + } } diff --git a/src/main/java/io/temporal/internal/testservice/StateMachines.java b/src/main/java/io/temporal/internal/testservice/StateMachines.java index 479a6a322d..1d89bef2da 100644 --- a/src/main/java/io/temporal/internal/testservice/StateMachines.java +++ b/src/main/java/io/temporal/internal/testservice/StateMachines.java @@ -818,7 +818,8 @@ private static void startWorkflow( .setWorkflowExecutionTimeout(request.getWorkflowExecutionTimeout()) .setIdentity(request.getIdentity()) .setInput(request.getInput()) - .setTaskQueue(request.getTaskQueue()); + .setTaskQueue(request.getTaskQueue()) + .setAttempt(1); if (data.retryState.isPresent()) { a.setAttempt(data.retryState.get().getAttempt()); } diff --git a/src/main/java/io/temporal/workflow/WorkflowInfo.java b/src/main/java/io/temporal/workflow/WorkflowInfo.java index 5dd3fe6a06..b38e07904f 100644 --- a/src/main/java/io/temporal/workflow/WorkflowInfo.java +++ b/src/main/java/io/temporal/workflow/WorkflowInfo.java @@ -52,4 +52,6 @@ public interface WorkflowInfo { Optional getParentWorkflowId(); Optional getParentRunId(); + + int getAttempt(); } diff --git a/src/test/java/io/temporal/workflow/WorkflowTest.java b/src/test/java/io/temporal/workflow/WorkflowTest.java index db26b19598..d04c23a2df 100644 --- a/src/test/java/io/temporal/workflow/WorkflowTest.java +++ b/src/test/java/io/temporal/workflow/WorkflowTest.java @@ -3996,6 +3996,8 @@ public String execute(String testName) { count = new AtomicInteger(); retryCount.put(testName, count); } + int attempt = Workflow.getInfo().getAttempt(); + assertEquals(count.get() + 1, attempt); throw ApplicationFailure.newFailure("simulated " + count.incrementAndGet(), "test"); } } @@ -4671,6 +4673,13 @@ public interface TestMultiargsWorkflowsProc6 extends ProcInvocationQueryable { void proc6(String a1, int a2, int a3, int a4, int a5, int a6); } + @WorkflowInterface + public interface TestGetAttemptWorkflowsFunc { + + @WorkflowMethod + int func(); + } + public static class TestMultiargsWorkflowsImpl implements TestMultiargsWorkflowsFunc, TestMultiargsWorkflowsFunc1, @@ -6495,6 +6504,14 @@ public String func2(String s, int i) { } } + public static class TestAttemptReturningWorkflowFunc implements TestGetAttemptWorkflowsFunc { + @Override + public int func() { + WorkflowInfo wi = Workflow.getInfo(); + return wi.getAttempt(); + } + } + public static class TestMultiargsWorkflowsFuncParent implements TestMultiargsWorkflowsFunc { @Override public String func() { @@ -6530,6 +6547,18 @@ public void testParentWorkflowInfoInChildWorkflows() { assertEquals(expected, result); } + @Test + public void testGetAttemptFromWorkflowInfo() { + startWorkerFor(TestMultiargsWorkflowsFuncParent.class, TestAttemptReturningWorkflowFunc.class); + String workflowId = "testGetAttemptWorkflow"; + WorkflowOptions workflowOptions = + newWorkflowOptionsBuilder(taskQueue).setWorkflowId(workflowId).build(); + TestGetAttemptWorkflowsFunc workflow = + workflowClient.newWorkflowStub(TestGetAttemptWorkflowsFunc.class, workflowOptions); + int attempt = workflow.func(); + assertEquals(1, attempt); + } + public interface WorkflowBase { @WorkflowMethod String execute(String arg);