diff --git a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.java b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.java index 60842f368..2adc85681 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.java +++ b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.java @@ -121,6 +121,13 @@ enum State { State.REQUEST_PREPARED, LocalActivityStateMachine::sendRequest) .add(State.REQUEST_PREPARED, ExplicitEvent.MARK_AS_SENT, State.REQUEST_SENT) + // This is to cover an edge case where the event loop is + // run more than once while processing a workflow task. + // This can happen due to external cancellation + .add( + State.REQUEST_PREPARED, + ExplicitEvent.NON_REPLAY_WORKFLOW_TASK_STARTED, + State.REQUEST_PREPARED) .add( State.REQUEST_SENT, ExplicitEvent.NON_REPLAY_WORKFLOW_TASK_STARTED, diff --git a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.puml b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.puml index 27e068360..330a65b1a 100644 --- a/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.puml +++ b/temporal-sdk/src/main/java/io/temporal/internal/statemachines/LocalActivityStateMachine.puml @@ -31,6 +31,7 @@ EXECUTING --> REQUEST_PREPARED: SCHEDULE MARKER_COMMAND_CREATED --> RESULT_NOTIFIED: RECORD_MARKER REPLAYING --> WAITING_MARKER_EVENT: SCHEDULE REQUEST_PREPARED --> REQUEST_SENT: MARK_AS_SENT +REQUEST_PREPARED --> REQUEST_PREPARED: NON_REPLAY_WORKFLOW_TASK_STARTED REQUEST_SENT --> REQUEST_SENT: NON_REPLAY_WORKFLOW_TASK_STARTED REQUEST_SENT --> MARKER_COMMAND_CREATED: HANDLE_RESULT RESULT_NOTIFIED --> MARKER_COMMAND_RECORDED: MARKER_RECORDED diff --git a/temporal-sdk/src/test/java/io/temporal/internal/statemachines/LocalActivityStateMachineTest.java b/temporal-sdk/src/test/java/io/temporal/internal/statemachines/LocalActivityStateMachineTest.java index bdac8ca23..42b1fb3a1 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/statemachines/LocalActivityStateMachineTest.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/statemachines/LocalActivityStateMachineTest.java @@ -27,20 +27,25 @@ import static org.junit.Assert.fail; import io.temporal.api.command.v1.Command; +import io.temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributes; import io.temporal.api.common.v1.ActivityType; import io.temporal.api.common.v1.Payloads; +import io.temporal.api.common.v1.WorkflowExecution; import io.temporal.api.enums.v1.CommandType; import io.temporal.api.enums.v1.EventType; -import io.temporal.api.history.v1.MarkerRecordedEventAttributes; +import io.temporal.api.history.v1.*; import io.temporal.api.workflowservice.v1.PollActivityTaskQueueResponse; import io.temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest; import io.temporal.common.converter.DataConverter; import io.temporal.common.converter.DefaultDataConverter; import io.temporal.internal.history.LocalActivityMarkerUtils; import io.temporal.internal.worker.LocalActivityResult; +import io.temporal.workflow.ChildWorkflowCancellationType; +import io.temporal.workflow.Functions; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import org.junit.AfterClass; import org.junit.Test; @@ -343,4 +348,99 @@ protected void buildWorkflow(AsyncWorkflowBuilder builder) { List commands = stateMachines.takeCommands(); assertTrue(commands.isEmpty()); } + + @Test + public void testLocalActivityStateMachineDuplicateTask() { + class TestListener extends TestEntityManagerListenerBase { + @Override + protected void buildWorkflow(AsyncWorkflowBuilder builder) { + StartChildWorkflowExecutionParameters childRequest = + new StartChildWorkflowExecutionParameters( + StartChildWorkflowExecutionCommandAttributes.newBuilder(), + ChildWorkflowCancellationType.WAIT_CANCELLATION_REQUESTED); + ExecuteLocalActivityParameters parameters1 = + new ExecuteLocalActivityParameters( + PollActivityTaskQueueResponse.newBuilder() + .setActivityId("id1") + .setActivityType(ActivityType.newBuilder().setName("activity1")), + null, + System.currentTimeMillis(), + null, + false, + null); + // TODO: This is a workaround for the lack of support for child workflow in the test + // framework. + // The test framework has no support for state machines with multiple callbacks. + AtomicReference cc = new AtomicReference<>(); + AtomicReference, Exception>> completionCallback = + new AtomicReference<>(); + builder + .add2( + (r, c) -> + cc.set( + stateMachines.startChildWorkflow( + childRequest, + c, + (r1, c1) -> { + completionCallback.get().apply(r1, c1); + }))) + .add((r) -> cc.get().apply()) + ., Exception>add2( + (r, c) -> { + completionCallback.set(c); + }) + ., LocalActivityCallback.LocalActivityFailedException>add2( + (r, c) -> stateMachines.scheduleLocalActivityTask(parameters1, c)); + } + } + /* + 1: EVENT_TYPE_WORKFLOW_EXECUTION_STARTED + 2: EVENT_TYPE_WORKFLOW_TASK_SCHEDULED + 3: EVENT_TYPE_WORKFLOW_TASK_STARTED + 4: EVENT_TYPE_WORKFLOW_TASK_COMPLETED + 5: EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED + 6: EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED + 7: EVENT_TYPE_WORKFLOW_TASK_SCHEDULED + 8: EVENT_TYPE_WORKFLOW_TASK_STARTED + 9: EVENT_TYPE_WORKFLOW_TASK_COMPLETED + 10: EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED + 11: EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED + 12: EVENT_TYPE_WORKFLOW_TASK_SCHEDULED + 13: EVENT_TYPE_WORKFLOW_TASK_STARTED + */ + TestHistoryBuilder h = + new TestHistoryBuilder() + .add(EventType.EVENT_TYPE_WORKFLOW_EXECUTION_STARTED) + .addWorkflowTask() + .add( + EventType.EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED, + StartChildWorkflowExecutionInitiatedEventAttributes.newBuilder().build()) + .add( + EventType.EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED, + ChildWorkflowExecutionStartedEventAttributes.newBuilder() + .setInitiatedEventId(5) + .build()) + .addWorkflowTask() + .add( + EventType.EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED, + RequestCancelExternalWorkflowExecutionInitiatedEventAttributes.newBuilder().build()) + .addWorkflowTaskScheduled() + .add( + EventType.EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED, + ExternalWorkflowExecutionCancelRequestedEventAttributes.newBuilder() + .setInitiatedEventId(10) + .build()) + .addWorkflowTaskScheduled() + .addWorkflowTaskStarted(); + + TestListener listener = new TestListener(); + stateMachines = newStateMachines(listener); + + h.handleWorkflowTask(stateMachines); + List requests = stateMachines.takeLocalActivityRequests(); + assertEquals(1, requests.size()); + assertEquals("id1", requests.get(0).getActivityId()); + List commands = stateMachines.takeCommands(); + assertTrue(commands.isEmpty()); + } } diff --git a/temporal-sdk/src/test/java/io/temporal/internal/statemachines/TestHistoryBuilder.java b/temporal-sdk/src/test/java/io/temporal/internal/statemachines/TestHistoryBuilder.java index 1595b4039..2c85e06e5 100644 --- a/temporal-sdk/src/test/java/io/temporal/internal/statemachines/TestHistoryBuilder.java +++ b/temporal-sdk/src/test/java/io/temporal/internal/statemachines/TestHistoryBuilder.java @@ -553,18 +553,27 @@ private HistoryEvent newAttributes(EventType type, Object attributes) { result.setWorkflowExecutionUpdateCompletedEventAttributes( (WorkflowExecutionUpdateCompletedEventAttributes) attributes); break; + case EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: + result.setStartChildWorkflowExecutionInitiatedEventAttributes( + (StartChildWorkflowExecutionInitiatedEventAttributes) attributes); + break; + case EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: + result.setRequestCancelExternalWorkflowExecutionInitiatedEventAttributes( + (RequestCancelExternalWorkflowExecutionInitiatedEventAttributes) attributes); + break; + case EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED: + result.setExternalWorkflowExecutionCancelRequestedEventAttributes( + (ExternalWorkflowExecutionCancelRequestedEventAttributes) attributes); + break; case EVENT_TYPE_UNSPECIFIED: case EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: case EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: case EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED: case EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: - case EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: case EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: - case EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED: case EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: case EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: - case EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: case EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED: case EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: case EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: diff --git a/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityAfterCancelTest.java b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityAfterCancelTest.java new file mode 100644 index 000000000..88ea3439e --- /dev/null +++ b/temporal-sdk/src/test/java/io/temporal/workflow/activityTests/LocalActivityAfterCancelTest.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2022 Temporal Technologies, Inc. All Rights Reserved. + * + * Copyright (C) 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this material except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.temporal.workflow.activityTests; + +import static org.junit.Assert.assertThrows; + +import io.temporal.activity.LocalActivityOptions; +import io.temporal.api.enums.v1.EventType; +import io.temporal.api.enums.v1.ParentClosePolicy; +import io.temporal.client.WorkflowClient; +import io.temporal.client.WorkflowFailedException; +import io.temporal.client.WorkflowStub; +import io.temporal.failure.TemporalFailure; +import io.temporal.testing.WorkflowReplayer; +import io.temporal.testing.internal.SDKTestWorkflowRule; +import io.temporal.workflow.*; +import io.temporal.workflow.shared.TestActivities.TestActivitiesImpl; +import io.temporal.workflow.shared.TestActivities.VariousTestActivities; +import io.temporal.workflow.shared.TestWorkflows; +import io.temporal.workflow.shared.TestWorkflows.TestWorkflow1; +import java.time.Duration; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; + +public class LocalActivityAfterCancelTest { + private final TestActivitiesImpl activitiesImpl = new TestActivitiesImpl(); + + @Rule + public SDKTestWorkflowRule testWorkflowRule = + SDKTestWorkflowRule.newBuilder() + .setWorkflowTypes(TestLocalActivityRetry.class, BlockingWorkflow.class) + .setActivityImplementations(activitiesImpl) + .build(); + + @Test + public void localActivityAfterChildWorkflowCanceled() { + TestWorkflow1 workflowStub = + testWorkflowRule.newWorkflowStubTimeoutOptions(TestWorkflow1.class); + WorkflowClient.execute(workflowStub::execute, "sada"); + WorkflowStub.fromTyped(workflowStub).cancel(); + WorkflowFailedException exception = + Assert.assertThrows(WorkflowFailedException.class, () -> workflowStub.execute("sada")); + Assert.assertEquals( + EventType.EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED, exception.getWorkflowCloseEventType()); + } + + @Test + public void testLocalActivityAfterChildWorkflowCanceledReplay() { + assertThrows( + RuntimeException.class, + () -> + WorkflowReplayer.replayWorkflowExecutionFromResource( + "testLocalActivityAfterCancelTest.json", + LocalActivityAfterCancelTest.TestLocalActivityRetry.class)); + } + + @WorkflowInterface + public static class BlockingWorkflow implements TestWorkflows.TestWorkflowReturnString { + @Override + public String execute() { + Workflow.await(() -> false); + return ""; + } + } + + public static class TestLocalActivityRetry implements TestWorkflow1 { + + @Override + public String execute(String taskQueue) { + try { + ChildWorkflowOptions childOptions = + ChildWorkflowOptions.newBuilder() + .setWorkflowId(Workflow.getInfo().getWorkflowId() + "-child1") + .setCancellationType(ChildWorkflowCancellationType.WAIT_CANCELLATION_REQUESTED) + .setParentClosePolicy(ParentClosePolicy.PARENT_CLOSE_POLICY_REQUEST_CANCEL) + .validateAndBuildWithDefaults(); + TestWorkflows.TestWorkflowReturnString child = + Workflow.newChildWorkflowStub( + TestWorkflows.TestWorkflowReturnString.class, childOptions); + child.execute(); + } catch (TemporalFailure e) { + if (CancellationScope.current().isCancelRequested()) { + Workflow.newDetachedCancellationScope( + () -> { + VariousTestActivities act = + Workflow.newLocalActivityStub( + VariousTestActivities.class, + LocalActivityOptions.newBuilder() + .setStartToCloseTimeout(Duration.ofSeconds(5)) + .validateAndBuildWithDefaults()); + act.activity1(10); + }) + .run(); + throw e; + } + } + return "dsadsa"; + } + } +} diff --git a/temporal-sdk/src/test/resources/testLocalActivityAfterCancelTest.json b/temporal-sdk/src/test/resources/testLocalActivityAfterCancelTest.json new file mode 100644 index 000000000..829a60ed9 --- /dev/null +++ b/temporal-sdk/src/test/resources/testLocalActivityAfterCancelTest.json @@ -0,0 +1,386 @@ +{ + "events": [ + { + "eventId": "1", + "eventTime": "2024-07-26T20:33:46.186015Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_STARTED", + "taskId": "1052132", + "workflowExecutionStartedEventAttributes": { + "workflowType": { + "name": "TestWorkflow1" + }, + "taskQueue": { + "name": "WorkflowTest-localActivityAfterChildWorkflowCanceled-2900c992-1205-4ca4-9334-c229b0d7f9ce", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "InNhZGEi" + } + ] + }, + "workflowExecutionTimeout": "0s", + "workflowRunTimeout": "200s", + "workflowTaskTimeout": "5s", + "originalExecutionRunId": "656867fc-004f-4108-bb2e-1ec880bea2ec", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "firstExecutionRunId": "656867fc-004f-4108-bb2e-1ec880bea2ec", + "attempt": 1, + "firstWorkflowTaskBackoff": "0s", + "header": {}, + "workflowId": "0ae91468-42a9-4ed9-a0a6-2ca607589f00" + } + }, + { + "eventId": "2", + "eventTime": "2024-07-26T20:33:46.186060Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1052133", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-localActivityAfterChildWorkflowCanceled-2900c992-1205-4ca4-9334-c229b0d7f9ce", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "3", + "eventTime": "2024-07-26T20:33:46.187952Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1052139", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "2", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "requestId": "ca34ead6-8853-4521-9b00-8a83507a4a7c", + "historySizeBytes": "477" + } + }, + { + "eventId": "4", + "eventTime": "2024-07-26T20:33:46.292342Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1052143", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "2", + "startedEventId": "3", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "sdkMetadata": { + "langUsedFlags": [ + 1 + ] + }, + "meteringMetadata": {} + } + }, + { + "eventId": "5", + "eventTime": "2024-07-26T20:33:46.292481Z", + "eventType": "EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED", + "taskId": "1052144", + "startChildWorkflowExecutionInitiatedEventAttributes": { + "namespace": "UnitTest", + "namespaceId": "ffe13594-49ff-4f24-8d0b-18a445504f60", + "workflowId": "0ae91468-42a9-4ed9-a0a6-2ca607589f00-child1", + "workflowType": { + "name": "TestWorkflowReturnString" + }, + "taskQueue": { + "name": "WorkflowTest-localActivityAfterChildWorkflowCanceled-2900c992-1205-4ca4-9334-c229b0d7f9ce", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "workflowExecutionTimeout": "0s", + "workflowRunTimeout": "0s", + "workflowTaskTimeout": "10s", + "parentClosePolicy": "PARENT_CLOSE_POLICY_REQUEST_CANCEL", + "workflowTaskCompletedEventId": "4", + "workflowIdReusePolicy": "WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE", + "header": {} + } + }, + { + "eventId": "6", + "eventTime": "2024-07-26T20:33:46.195588Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED", + "taskId": "1052145", + "workflowExecutionCancelRequestedEventAttributes": { + "identity": "20074@Quinn-Klassens-MacBook-Pro.local" + } + }, + { + "eventId": "7", + "eventTime": "2024-07-26T20:33:46.292522Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1052146", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "20074@Quinn-Klassens-MacBook-Pro.local:67459403-89e6-46a5-826e-c41b7581e287", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-localActivityAfterChildWorkflowCanceled-2900c992-1205-4ca4-9334-c229b0d7f9ce" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "8", + "eventTime": "2024-07-26T20:33:46.297397Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED", + "taskId": "1052156", + "childWorkflowExecutionStartedEventAttributes": { + "namespace": "UnitTest", + "namespaceId": "ffe13594-49ff-4f24-8d0b-18a445504f60", + "initiatedEventId": "5", + "workflowExecution": { + "workflowId": "0ae91468-42a9-4ed9-a0a6-2ca607589f00-child1", + "runId": "d272610e-9d7b-45d6-916c-496b1b7facb6" + }, + "workflowType": { + "name": "TestWorkflowReturnString" + }, + "header": {} + } + }, + { + "eventId": "9", + "eventTime": "2024-07-26T20:33:46.297738Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1052159", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "7", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "requestId": "aabebe33-340e-43a2-a39e-5cfd53985c47", + "historySizeBytes": "1393" + } + }, + { + "eventId": "10", + "eventTime": "2024-07-26T20:33:46.309659Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1052173", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "7", + "startedEventId": "9", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "11", + "eventTime": "2024-07-26T20:33:46.309720Z", + "eventType": "EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED", + "taskId": "1052174", + "requestCancelExternalWorkflowExecutionInitiatedEventAttributes": { + "workflowTaskCompletedEventId": "10", + "namespaceId": "ffe13594-49ff-4f24-8d0b-18a445504f60", + "workflowExecution": { + "workflowId": "0ae91468-42a9-4ed9-a0a6-2ca607589f00-child1" + }, + "childWorkflowOnly": true + } + }, + { + "eventId": "12", + "eventTime": "2024-07-26T20:33:46.312159Z", + "eventType": "EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED", + "taskId": "1052182", + "externalWorkflowExecutionCancelRequestedEventAttributes": { + "initiatedEventId": "11", + "namespace": "UnitTest", + "namespaceId": "ffe13594-49ff-4f24-8d0b-18a445504f60", + "workflowExecution": { + "workflowId": "0ae91468-42a9-4ed9-a0a6-2ca607589f00-child1" + } + } + }, + { + "eventId": "13", + "eventTime": "2024-07-26T20:33:46.312164Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1052183", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "20074@Quinn-Klassens-MacBook-Pro.local:67459403-89e6-46a5-826e-c41b7581e287", + "kind": "TASK_QUEUE_KIND_STICKY", + "normalName": "WorkflowTest-localActivityAfterChildWorkflowCanceled-2900c992-1205-4ca4-9334-c229b0d7f9ce" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "14", + "eventTime": "2024-07-26T20:33:46.312882Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1052190", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "13", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "requestId": "7d7c24b4-1c8e-4bfd-aeaf-0ebf492cb8f7", + "historySizeBytes": "2023" + } + }, + { + "eventId": "15", + "eventTime": "2024-07-26T20:33:46.361586Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_FAILED", + "taskId": "1052201", + "workflowTaskFailedEventAttributes": { + "scheduledEventId": "13", + "startedEventId": "14", + "cause": "WORKFLOW_TASK_FAILED_CAUSE_UNHANDLED_COMMAND", + "failure": { + "message": "UnhandledCommand", + "serverFailureInfo": {} + }, + "identity": "20074@Quinn-Klassens-MacBook-Pro.local" + } + }, + { + "eventId": "16", + "eventTime": "2024-07-26T20:33:46.324307Z", + "eventType": "EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED", + "taskId": "1052202", + "childWorkflowExecutionCanceledEventAttributes": { + "namespace": "UnitTest", + "namespaceId": "ffe13594-49ff-4f24-8d0b-18a445504f60", + "workflowExecution": { + "workflowId": "0ae91468-42a9-4ed9-a0a6-2ca607589f00-child1", + "runId": "d272610e-9d7b-45d6-916c-496b1b7facb6" + }, + "workflowType": { + "name": "TestWorkflowReturnString" + }, + "initiatedEventId": "5", + "startedEventId": "8" + } + }, + { + "eventId": "17", + "eventTime": "2024-07-26T20:33:46.361595Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_SCHEDULED", + "taskId": "1052203", + "workflowTaskScheduledEventAttributes": { + "taskQueue": { + "name": "WorkflowTest-localActivityAfterChildWorkflowCanceled-2900c992-1205-4ca4-9334-c229b0d7f9ce", + "kind": "TASK_QUEUE_KIND_NORMAL" + }, + "startToCloseTimeout": "5s", + "attempt": 1 + } + }, + { + "eventId": "18", + "eventTime": "2024-07-26T20:33:46.363845Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_STARTED", + "taskId": "1052206", + "workflowTaskStartedEventAttributes": { + "scheduledEventId": "17", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "requestId": "27f82ca1-a459-42fc-bc21-f32a61b8ab26", + "historySizeBytes": "2547" + } + }, + { + "eventId": "19", + "eventTime": "2024-07-26T20:33:46.372112Z", + "eventType": "EVENT_TYPE_WORKFLOW_TASK_COMPLETED", + "taskId": "1052210", + "workflowTaskCompletedEventAttributes": { + "scheduledEventId": "17", + "startedEventId": "18", + "identity": "20074@Quinn-Klassens-MacBook-Pro.local", + "workerVersion": {}, + "meteringMetadata": {} + } + }, + { + "eventId": "20", + "eventTime": "2024-07-26T20:33:46.372129Z", + "eventType": "EVENT_TYPE_MARKER_RECORDED", + "taskId": "1052211", + "markerRecordedEventAttributes": { + "markerName": "LocalActivity", + "details": { + "activityId": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "IjYyZDgxMTgxLWVlYzQtM2M5YS1hZTA4LWJiMTMzMDQzYzc5MSI=" + } + ] + }, + "input": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MTA=" + } + ] + }, + "meta": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "eyJmaXJzdFNrZCI6MTcyMjAyNjAyNjM2OCwiYXRwdCI6MSwiYmFja29mZiI6bnVsbH0=" + } + ] + }, + "result": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MTA=" + } + ] + }, + "time": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "MTcyMjAyNjAyNjM2Mw==" + } + ] + }, + "type": { + "payloads": [ + { + "metadata": { + "encoding": "anNvbi9wbGFpbg==" + }, + "data": "ImN1c3RvbUFjdGl2aXR5MSI=" + } + ] + } + }, + "workflowTaskCompletedEventId": "19" + } + }, + { + "eventId": "21", + "eventTime": "2024-07-26T20:33:46.372132Z", + "eventType": "EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED", + "taskId": "1052212", + "workflowExecutionCanceledEventAttributes": { + "workflowTaskCompletedEventId": "19" + } + } + ] +} \ No newline at end of file