Revert "Include transient and speculative WFT events in GetWorkflowExecutionHistoryResponse" (#9322)

Reverts temporalio/temporal#9138
This commit is contained in:
Sean Kane
2026-02-13 19:49:27 +00:00
committed by GitHub
parent 41d84690f9
commit dd9176cfe8
25 changed files with 419 additions and 1453 deletions
+1 -1
View File
@@ -79,7 +79,7 @@ jobs:
feature-tests-ts:
needs: build-docker-image
uses: temporalio/features/.github/workflows/typescript.yaml@spk/update-bug
uses: temporalio/features/.github/workflows/typescript.yaml@main
with:
# This field is not actually used by these workflow if docker-image-artifact-name
# is set, but it's marked as required, so supply some string.
+237 -249
View File
@@ -538,11 +538,8 @@ type GetMutableStateResponse struct {
InheritedBuildId string `protobuf:"bytes,23,opt,name=inherited_build_id,json=inheritedBuildId,proto3" json:"inherited_build_id,omitempty"`
TransitionHistory []*v19.VersionedTransition `protobuf:"bytes,24,rep,name=transition_history,json=transitionHistory,proto3" json:"transition_history,omitempty"`
VersioningInfo *v15.WorkflowExecutionVersioningInfo `protobuf:"bytes,25,opt,name=versioning_info,json=versioningInfo,proto3" json:"versioning_info,omitempty"`
// Transient or speculative workflow task events which are not yet persisted in the history.
// These events should be appended to the history when it is returned to the worker.
TransientOrSpeculativeTasks *v18.TransientWorkflowTaskInfo `protobuf:"bytes,26,opt,name=transient_or_speculative_tasks,json=transientOrSpeculativeTasks,proto3" json:"transient_or_speculative_tasks,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetMutableStateResponse) Reset() {
@@ -715,13 +712,6 @@ func (x *GetMutableStateResponse) GetVersioningInfo() *v15.WorkflowExecutionVers
return nil
}
func (x *GetMutableStateResponse) GetTransientOrSpeculativeTasks() *v18.TransientWorkflowTaskInfo {
if x != nil {
return x.TransientOrSpeculativeTasks
}
return nil
}
type PollMutableStateRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
NamespaceId string `protobuf:"bytes,1,opt,name=namespace_id,json=namespaceId,proto3" json:"namespace_id,omitempty"`
@@ -10221,7 +10211,7 @@ const file_temporal_server_api_historyservice_v1_request_response_proto_rawDesc
"\x16expected_next_event_id\x18\x03 \x01(\x03R\x13expectedNextEventId\x120\n" +
"\x14current_branch_token\x18\x04 \x01(\fR\x12currentBranchToken\x12d\n" +
"\x14version_history_item\x18\x05 \x01(\v22.temporal.server.api.history.v1.VersionHistoryItemR\x12versionHistoryItem\x12j\n" +
"\x14versioned_transition\x18\x06 \x01(\v27.temporal.server.api.persistence.v1.VersionedTransitionR\x13versionedTransition:\x1b\x92\xc4\x03\x17*\x15execution.workflow_id\"\xf3\f\n" +
"\x14versioned_transition\x18\x06 \x01(\v27.temporal.server.api.persistence.v1.VersionedTransitionR\x13versionedTransition:\x1b\x92\xc4\x03\x17*\x15execution.workflow_id\"\xf3\v\n" +
"\x17GetMutableStateResponse\x12G\n" +
"\texecution\x18\x01 \x01(\v2).temporal.api.common.v1.WorkflowExecutionR\texecution\x12I\n" +
"\rworkflow_type\x18\x02 \x01(\v2$.temporal.api.common.v1.WorkflowTypeR\fworkflowType\x12\"\n" +
@@ -10243,8 +10233,7 @@ const file_temporal_server_api_historyservice_v1_request_response_proto_rawDesc
"\x11assigned_build_id\x18\x16 \x01(\tR\x0fassignedBuildId\x12,\n" +
"\x12inherited_build_id\x18\x17 \x01(\tR\x10inheritedBuildId\x12f\n" +
"\x12transition_history\x18\x18 \x03(\v27.temporal.server.api.persistence.v1.VersionedTransitionR\x11transitionHistory\x12b\n" +
"\x0fversioning_info\x18\x19 \x01(\v29.temporal.api.workflow.v1.WorkflowExecutionVersioningInfoR\x0eversioningInfo\x12~\n" +
"\x1etransient_or_speculative_tasks\x18\x1a \x01(\v29.temporal.server.api.history.v1.TransientWorkflowTaskInfoR\x1btransientOrSpeculativeTasksJ\x04\b\b\x10\tJ\x04\b\t\x10\n" +
"\x0fversioning_info\x18\x19 \x01(\v29.temporal.api.workflow.v1.WorkflowExecutionVersioningInfoR\x0eversioningInfoJ\x04\b\b\x10\tJ\x04\b\t\x10\n" +
"J\x04\b\n" +
"\x10\vJ\x04\b\f\x10\rJ\x04\b\x0e\x10\x0f\"\xef\x02\n" +
"\x17PollMutableStateRequest\x12!\n" +
@@ -11118,11 +11107,11 @@ var file_temporal_server_api_historyservice_v1_request_response_proto_goTypes =
(v111.WorkflowExecutionState)(0), // 186: temporal.server.api.enums.v1.WorkflowExecutionState
(*v18.VersionHistories)(nil), // 187: temporal.server.api.history.v1.VersionHistories
(*v15.WorkflowExecutionVersioningInfo)(nil), // 188: temporal.api.workflow.v1.WorkflowExecutionVersioningInfo
(*v18.TransientWorkflowTaskInfo)(nil), // 189: temporal.server.api.history.v1.TransientWorkflowTaskInfo
(*v1.PollWorkflowTaskQueueRequest)(nil), // 190: temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest
(*v112.BuildIdRedirectInfo)(nil), // 191: temporal.server.api.taskqueue.v1.BuildIdRedirectInfo
(*v16.Deployment)(nil), // 192: temporal.api.deployment.v1.Deployment
(*v112.TaskVersionDirective)(nil), // 193: temporal.server.api.taskqueue.v1.TaskVersionDirective
(*v1.PollWorkflowTaskQueueRequest)(nil), // 189: temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest
(*v112.BuildIdRedirectInfo)(nil), // 190: temporal.server.api.taskqueue.v1.BuildIdRedirectInfo
(*v16.Deployment)(nil), // 191: temporal.api.deployment.v1.Deployment
(*v112.TaskVersionDirective)(nil), // 192: temporal.server.api.taskqueue.v1.TaskVersionDirective
(*v18.TransientWorkflowTaskInfo)(nil), // 193: temporal.server.api.history.v1.TransientWorkflowTaskInfo
(*v114.Message)(nil), // 194: temporal.api.protocol.v1.Message
(*v115.History)(nil), // 195: temporal.api.history.v1.History
(*v1.PollActivityTaskQueueRequest)(nil), // 196: temporal.api.workflowservice.v1.PollActivityTaskQueueRequest
@@ -11235,235 +11224,234 @@ var file_temporal_server_api_historyservice_v1_request_response_proto_depIdxs =
172, // 27: temporal.server.api.historyservice.v1.GetMutableStateResponse.most_recent_worker_version_stamp:type_name -> temporal.api.common.v1.WorkerVersionStamp
183, // 28: temporal.server.api.historyservice.v1.GetMutableStateResponse.transition_history:type_name -> temporal.server.api.persistence.v1.VersionedTransition
188, // 29: temporal.server.api.historyservice.v1.GetMutableStateResponse.versioning_info:type_name -> temporal.api.workflow.v1.WorkflowExecutionVersioningInfo
189, // 30: temporal.server.api.historyservice.v1.GetMutableStateResponse.transient_or_speculative_tasks:type_name -> temporal.server.api.history.v1.TransientWorkflowTaskInfo
181, // 31: temporal.server.api.historyservice.v1.PollMutableStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
182, // 32: temporal.server.api.historyservice.v1.PollMutableStateRequest.version_history_item:type_name -> temporal.server.api.history.v1.VersionHistoryItem
181, // 33: temporal.server.api.historyservice.v1.PollMutableStateResponse.execution:type_name -> temporal.api.common.v1.WorkflowExecution
184, // 34: temporal.server.api.historyservice.v1.PollMutableStateResponse.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
185, // 35: temporal.server.api.historyservice.v1.PollMutableStateResponse.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
185, // 36: temporal.server.api.historyservice.v1.PollMutableStateResponse.sticky_task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
171, // 37: temporal.server.api.historyservice.v1.PollMutableStateResponse.sticky_task_queue_schedule_to_start_timeout:type_name -> google.protobuf.Duration
187, // 38: temporal.server.api.historyservice.v1.PollMutableStateResponse.version_histories:type_name -> temporal.server.api.history.v1.VersionHistories
186, // 39: temporal.server.api.historyservice.v1.PollMutableStateResponse.workflow_state:type_name -> temporal.server.api.enums.v1.WorkflowExecutionState
179, // 40: temporal.server.api.historyservice.v1.PollMutableStateResponse.workflow_status:type_name -> temporal.api.enums.v1.WorkflowExecutionStatus
181, // 41: temporal.server.api.historyservice.v1.ResetStickyTaskQueueRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
156, // 42: temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.operations:type_name -> temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.Operation
157, // 43: temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.responses:type_name -> temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.Response
181, // 44: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
190, // 45: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.poll_request:type_name -> temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest
177, // 46: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
191, // 47: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.build_id_redirect_info:type_name -> temporal.server.api.taskqueue.v1.BuildIdRedirectInfo
192, // 48: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.scheduled_deployment:type_name -> temporal.api.deployment.v1.Deployment
193, // 49: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective
175, // 50: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.target_deployment_version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion
184, // 51: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
189, // 52: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.transient_workflow_task:type_name -> temporal.server.api.history.v1.TransientWorkflowTaskInfo
185, // 53: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.workflow_execution_task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
167, // 54: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 55: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.started_time:type_name -> google.protobuf.Timestamp
158, // 56: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.queries:type_name -> temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.QueriesEntry
177, // 57: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.clock:type_name -> temporal.server.api.clock.v1.VectorClock
194, // 58: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.messages:type_name -> temporal.api.protocol.v1.Message
195, // 59: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.history:type_name -> temporal.api.history.v1.History
195, // 60: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.raw_history:type_name -> temporal.api.history.v1.History
184, // 61: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
189, // 62: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.transient_workflow_task:type_name -> temporal.server.api.history.v1.TransientWorkflowTaskInfo
185, // 63: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.workflow_execution_task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
167, // 64: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 65: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.started_time:type_name -> google.protobuf.Timestamp
159, // 66: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.queries:type_name -> temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.QueriesEntry
177, // 67: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.clock:type_name -> temporal.server.api.clock.v1.VectorClock
194, // 68: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.messages:type_name -> temporal.api.protocol.v1.Message
195, // 69: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.history:type_name -> temporal.api.history.v1.History
181, // 70: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
196, // 71: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.poll_request:type_name -> temporal.api.workflowservice.v1.PollActivityTaskQueueRequest
177, // 72: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
191, // 73: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.build_id_redirect_info:type_name -> temporal.server.api.taskqueue.v1.BuildIdRedirectInfo
192, // 74: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.scheduled_deployment:type_name -> temporal.api.deployment.v1.Deployment
193, // 75: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective
197, // 76: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.scheduled_event:type_name -> temporal.api.history.v1.HistoryEvent
167, // 77: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.started_time:type_name -> google.protobuf.Timestamp
167, // 78: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.current_attempt_scheduled_time:type_name -> google.protobuf.Timestamp
170, // 79: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.heartbeat_details:type_name -> temporal.api.common.v1.Payloads
184, // 80: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
177, // 81: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.clock:type_name -> temporal.server.api.clock.v1.VectorClock
198, // 82: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.priority:type_name -> temporal.api.common.v1.Priority
199, // 83: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy
200, // 84: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedRequest.complete_request:type_name -> temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest
12, // 85: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedResponse.started_response:type_name -> temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse
201, // 86: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedResponse.activity_tasks:type_name -> temporal.api.workflowservice.v1.PollActivityTaskQueueResponse
178, // 87: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedResponse.new_workflow_task:type_name -> temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse
202, // 88: temporal.server.api.historyservice.v1.RespondWorkflowTaskFailedRequest.failed_request:type_name -> temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest
181, // 89: temporal.server.api.historyservice.v1.IsWorkflowTaskValidRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 90: temporal.server.api.historyservice.v1.IsWorkflowTaskValidRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
203, // 91: temporal.server.api.historyservice.v1.RecordActivityTaskHeartbeatRequest.heartbeat_request:type_name -> temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest
204, // 92: temporal.server.api.historyservice.v1.RespondActivityTaskCompletedRequest.complete_request:type_name -> temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest
205, // 93: temporal.server.api.historyservice.v1.RespondActivityTaskFailedRequest.failed_request:type_name -> temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest
206, // 94: temporal.server.api.historyservice.v1.RespondActivityTaskCanceledRequest.cancel_request:type_name -> temporal.api.workflowservice.v1.RespondActivityTaskCanceledRequest
181, // 95: temporal.server.api.historyservice.v1.IsActivityTaskValidRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 96: temporal.server.api.historyservice.v1.IsActivityTaskValidRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
207, // 97: temporal.server.api.historyservice.v1.SignalWorkflowExecutionRequest.signal_request:type_name -> temporal.api.workflowservice.v1.SignalWorkflowExecutionRequest
181, // 98: temporal.server.api.historyservice.v1.SignalWorkflowExecutionRequest.external_workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
208, // 99: temporal.server.api.historyservice.v1.SignalWithStartWorkflowExecutionRequest.signal_with_start_request:type_name -> temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest
181, // 100: temporal.server.api.historyservice.v1.RemoveSignalMutableStateRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
209, // 101: temporal.server.api.historyservice.v1.TerminateWorkflowExecutionRequest.terminate_request:type_name -> temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest
181, // 102: temporal.server.api.historyservice.v1.TerminateWorkflowExecutionRequest.external_workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 103: temporal.server.api.historyservice.v1.DeleteWorkflowExecutionRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
210, // 104: temporal.server.api.historyservice.v1.ResetWorkflowExecutionRequest.reset_request:type_name -> temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest
211, // 105: temporal.server.api.historyservice.v1.RequestCancelWorkflowExecutionRequest.cancel_request:type_name -> temporal.api.workflowservice.v1.RequestCancelWorkflowExecutionRequest
181, // 106: temporal.server.api.historyservice.v1.RequestCancelWorkflowExecutionRequest.external_workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 107: temporal.server.api.historyservice.v1.ScheduleWorkflowTaskRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 108: temporal.server.api.historyservice.v1.ScheduleWorkflowTaskRequest.child_clock:type_name -> temporal.server.api.clock.v1.VectorClock
177, // 109: temporal.server.api.historyservice.v1.ScheduleWorkflowTaskRequest.parent_clock:type_name -> temporal.server.api.clock.v1.VectorClock
181, // 110: temporal.server.api.historyservice.v1.VerifyFirstWorkflowTaskScheduledRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 111: temporal.server.api.historyservice.v1.VerifyFirstWorkflowTaskScheduledRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
181, // 112: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.parent_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 113: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.child_execution:type_name -> temporal.api.common.v1.WorkflowExecution
197, // 114: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.completion_event:type_name -> temporal.api.history.v1.HistoryEvent
177, // 115: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
181, // 116: temporal.server.api.historyservice.v1.VerifyChildExecutionCompletionRecordedRequest.parent_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 117: temporal.server.api.historyservice.v1.VerifyChildExecutionCompletionRecordedRequest.child_execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 118: temporal.server.api.historyservice.v1.VerifyChildExecutionCompletionRecordedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
212, // 119: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionRequest.request:type_name -> temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest
213, // 120: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.execution_config:type_name -> temporal.api.workflow.v1.WorkflowExecutionConfig
214, // 121: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.workflow_execution_info:type_name -> temporal.api.workflow.v1.WorkflowExecutionInfo
215, // 122: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_activities:type_name -> temporal.api.workflow.v1.PendingActivityInfo
216, // 123: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_children:type_name -> temporal.api.workflow.v1.PendingChildExecutionInfo
217, // 124: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_workflow_task:type_name -> temporal.api.workflow.v1.PendingWorkflowTaskInfo
218, // 125: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.callbacks:type_name -> temporal.api.workflow.v1.CallbackInfo
219, // 126: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_nexus_operations:type_name -> temporal.api.workflow.v1.PendingNexusOperationInfo
220, // 127: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.workflow_extended_info:type_name -> temporal.api.workflow.v1.WorkflowExecutionExtendedInfo
181, // 128: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
182, // 129: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.version_history_items:type_name -> temporal.server.api.history.v1.VersionHistoryItem
221, // 130: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.events:type_name -> temporal.api.common.v1.DataBlob
221, // 131: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.new_run_events:type_name -> temporal.api.common.v1.DataBlob
222, // 132: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.base_execution_info:type_name -> temporal.server.api.workflow.v1.BaseExecutionInfo
223, // 133: temporal.server.api.historyservice.v1.ReplicateWorkflowStateRequest.workflow_state:type_name -> temporal.server.api.persistence.v1.WorkflowMutableState
167, // 134: temporal.server.api.historyservice.v1.SyncShardStatusRequest.status_time:type_name -> google.protobuf.Timestamp
167, // 135: temporal.server.api.historyservice.v1.SyncActivityRequest.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 136: temporal.server.api.historyservice.v1.SyncActivityRequest.started_time:type_name -> google.protobuf.Timestamp
167, // 137: temporal.server.api.historyservice.v1.SyncActivityRequest.last_heartbeat_time:type_name -> google.protobuf.Timestamp
170, // 138: temporal.server.api.historyservice.v1.SyncActivityRequest.details:type_name -> temporal.api.common.v1.Payloads
169, // 139: temporal.server.api.historyservice.v1.SyncActivityRequest.last_failure:type_name -> temporal.api.failure.v1.Failure
224, // 140: temporal.server.api.historyservice.v1.SyncActivityRequest.version_history:type_name -> temporal.server.api.history.v1.VersionHistory
222, // 141: temporal.server.api.historyservice.v1.SyncActivityRequest.base_execution_info:type_name -> temporal.server.api.workflow.v1.BaseExecutionInfo
167, // 142: temporal.server.api.historyservice.v1.SyncActivityRequest.first_scheduled_time:type_name -> google.protobuf.Timestamp
167, // 143: temporal.server.api.historyservice.v1.SyncActivityRequest.last_attempt_complete_time:type_name -> google.protobuf.Timestamp
171, // 144: temporal.server.api.historyservice.v1.SyncActivityRequest.retry_initial_interval:type_name -> google.protobuf.Duration
171, // 145: temporal.server.api.historyservice.v1.SyncActivityRequest.retry_maximum_interval:type_name -> google.protobuf.Duration
64, // 146: temporal.server.api.historyservice.v1.SyncActivitiesRequest.activities_info:type_name -> temporal.server.api.historyservice.v1.ActivitySyncInfo
167, // 147: temporal.server.api.historyservice.v1.ActivitySyncInfo.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 148: temporal.server.api.historyservice.v1.ActivitySyncInfo.started_time:type_name -> google.protobuf.Timestamp
167, // 149: temporal.server.api.historyservice.v1.ActivitySyncInfo.last_heartbeat_time:type_name -> google.protobuf.Timestamp
170, // 150: temporal.server.api.historyservice.v1.ActivitySyncInfo.details:type_name -> temporal.api.common.v1.Payloads
169, // 151: temporal.server.api.historyservice.v1.ActivitySyncInfo.last_failure:type_name -> temporal.api.failure.v1.Failure
224, // 152: temporal.server.api.historyservice.v1.ActivitySyncInfo.version_history:type_name -> temporal.server.api.history.v1.VersionHistory
167, // 153: temporal.server.api.historyservice.v1.ActivitySyncInfo.first_scheduled_time:type_name -> google.protobuf.Timestamp
167, // 154: temporal.server.api.historyservice.v1.ActivitySyncInfo.last_attempt_complete_time:type_name -> google.protobuf.Timestamp
171, // 155: temporal.server.api.historyservice.v1.ActivitySyncInfo.retry_initial_interval:type_name -> google.protobuf.Duration
171, // 156: temporal.server.api.historyservice.v1.ActivitySyncInfo.retry_maximum_interval:type_name -> google.protobuf.Duration
181, // 157: temporal.server.api.historyservice.v1.DescribeMutableStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
223, // 158: temporal.server.api.historyservice.v1.DescribeMutableStateResponse.cache_mutable_state:type_name -> temporal.server.api.persistence.v1.WorkflowMutableState
223, // 159: temporal.server.api.historyservice.v1.DescribeMutableStateResponse.database_mutable_state:type_name -> temporal.server.api.persistence.v1.WorkflowMutableState
181, // 160: temporal.server.api.historyservice.v1.DescribeHistoryHostRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
225, // 161: temporal.server.api.historyservice.v1.DescribeHistoryHostResponse.namespace_cache:type_name -> temporal.server.api.namespace.v1.NamespaceCacheInfo
226, // 162: temporal.server.api.historyservice.v1.GetShardResponse.shard_info:type_name -> temporal.server.api.persistence.v1.ShardInfo
167, // 163: temporal.server.api.historyservice.v1.RemoveTaskRequest.visibility_time:type_name -> google.protobuf.Timestamp
227, // 164: temporal.server.api.historyservice.v1.GetReplicationMessagesRequest.tokens:type_name -> temporal.server.api.replication.v1.ReplicationToken
160, // 165: temporal.server.api.historyservice.v1.GetReplicationMessagesResponse.shard_messages:type_name -> temporal.server.api.historyservice.v1.GetReplicationMessagesResponse.ShardMessagesEntry
228, // 166: temporal.server.api.historyservice.v1.GetDLQReplicationMessagesRequest.task_infos:type_name -> temporal.server.api.replication.v1.ReplicationTaskInfo
229, // 167: temporal.server.api.historyservice.v1.GetDLQReplicationMessagesResponse.replication_tasks:type_name -> temporal.server.api.replication.v1.ReplicationTask
230, // 168: temporal.server.api.historyservice.v1.QueryWorkflowRequest.request:type_name -> temporal.api.workflowservice.v1.QueryWorkflowRequest
231, // 169: temporal.server.api.historyservice.v1.QueryWorkflowResponse.response:type_name -> temporal.api.workflowservice.v1.QueryWorkflowResponse
232, // 170: temporal.server.api.historyservice.v1.ReapplyEventsRequest.request:type_name -> temporal.server.api.adminservice.v1.ReapplyEventsRequest
233, // 171: temporal.server.api.historyservice.v1.GetDLQMessagesRequest.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
233, // 172: temporal.server.api.historyservice.v1.GetDLQMessagesResponse.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
229, // 173: temporal.server.api.historyservice.v1.GetDLQMessagesResponse.replication_tasks:type_name -> temporal.server.api.replication.v1.ReplicationTask
228, // 174: temporal.server.api.historyservice.v1.GetDLQMessagesResponse.replication_tasks_info:type_name -> temporal.server.api.replication.v1.ReplicationTaskInfo
233, // 175: temporal.server.api.historyservice.v1.PurgeDLQMessagesRequest.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
233, // 176: temporal.server.api.historyservice.v1.MergeDLQMessagesRequest.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
234, // 177: temporal.server.api.historyservice.v1.RefreshWorkflowTasksRequest.request:type_name -> temporal.server.api.adminservice.v1.RefreshWorkflowTasksRequest
181, // 178: temporal.server.api.historyservice.v1.GenerateLastHistoryReplicationTasksRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
96, // 179: temporal.server.api.historyservice.v1.GetReplicationStatusResponse.shards:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatus
167, // 180: temporal.server.api.historyservice.v1.ShardReplicationStatus.shard_local_time:type_name -> google.protobuf.Timestamp
161, // 181: temporal.server.api.historyservice.v1.ShardReplicationStatus.remote_clusters:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatus.RemoteClustersEntry
162, // 182: temporal.server.api.historyservice.v1.ShardReplicationStatus.handover_namespaces:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatus.HandoverNamespacesEntry
167, // 183: temporal.server.api.historyservice.v1.ShardReplicationStatus.max_replication_task_visibility_time:type_name -> google.protobuf.Timestamp
167, // 184: temporal.server.api.historyservice.v1.ShardReplicationStatusPerCluster.acked_task_visibility_time:type_name -> google.protobuf.Timestamp
181, // 185: temporal.server.api.historyservice.v1.RebuildMutableStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 186: temporal.server.api.historyservice.v1.ImportWorkflowExecutionRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
221, // 187: temporal.server.api.historyservice.v1.ImportWorkflowExecutionRequest.history_batches:type_name -> temporal.api.common.v1.DataBlob
224, // 188: temporal.server.api.historyservice.v1.ImportWorkflowExecutionRequest.version_history:type_name -> temporal.server.api.history.v1.VersionHistory
181, // 189: temporal.server.api.historyservice.v1.DeleteWorkflowVisibilityRecordRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
167, // 190: temporal.server.api.historyservice.v1.DeleteWorkflowVisibilityRecordRequest.workflow_start_time:type_name -> google.protobuf.Timestamp
167, // 191: temporal.server.api.historyservice.v1.DeleteWorkflowVisibilityRecordRequest.workflow_close_time:type_name -> google.protobuf.Timestamp
235, // 192: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionRequest.request:type_name -> temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequest
236, // 193: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionResponse.response:type_name -> temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponse
237, // 194: temporal.server.api.historyservice.v1.StreamWorkflowReplicationMessagesRequest.sync_replication_state:type_name -> temporal.server.api.replication.v1.SyncReplicationState
238, // 195: temporal.server.api.historyservice.v1.StreamWorkflowReplicationMessagesResponse.messages:type_name -> temporal.server.api.replication.v1.WorkflowReplicationMessages
239, // 196: temporal.server.api.historyservice.v1.PollWorkflowExecutionUpdateRequest.request:type_name -> temporal.api.workflowservice.v1.PollWorkflowExecutionUpdateRequest
240, // 197: temporal.server.api.historyservice.v1.PollWorkflowExecutionUpdateResponse.response:type_name -> temporal.api.workflowservice.v1.PollWorkflowExecutionUpdateResponse
241, // 198: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest
242, // 199: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse
195, // 200: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryResponse.history:type_name -> temporal.api.history.v1.History
242, // 201: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryResponseWithRaw.response:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse
243, // 202: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryReverseRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest
244, // 203: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryReverseResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse
245, // 204: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryV2Request.request:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryV2Request
246, // 205: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryV2Response.response:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryV2Response
247, // 206: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryRequest.request:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryRequest
248, // 207: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryResponse.response:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryResponse
249, // 208: temporal.server.api.historyservice.v1.ForceDeleteWorkflowExecutionRequest.request:type_name -> temporal.server.api.adminservice.v1.DeleteWorkflowExecutionRequest
250, // 209: temporal.server.api.historyservice.v1.ForceDeleteWorkflowExecutionResponse.response:type_name -> temporal.server.api.adminservice.v1.DeleteWorkflowExecutionResponse
251, // 210: temporal.server.api.historyservice.v1.GetDLQTasksRequest.dlq_key:type_name -> temporal.server.api.common.v1.HistoryDLQKey
252, // 211: temporal.server.api.historyservice.v1.GetDLQTasksResponse.dlq_tasks:type_name -> temporal.server.api.common.v1.HistoryDLQTask
251, // 212: temporal.server.api.historyservice.v1.DeleteDLQTasksRequest.dlq_key:type_name -> temporal.server.api.common.v1.HistoryDLQKey
253, // 213: temporal.server.api.historyservice.v1.DeleteDLQTasksRequest.inclusive_max_task_metadata:type_name -> temporal.server.api.common.v1.HistoryDLQTaskMetadata
163, // 214: temporal.server.api.historyservice.v1.ListQueuesResponse.queues:type_name -> temporal.server.api.historyservice.v1.ListQueuesResponse.QueueInfo
164, // 215: temporal.server.api.historyservice.v1.AddTasksRequest.tasks:type_name -> temporal.server.api.historyservice.v1.AddTasksRequest.Task
254, // 216: temporal.server.api.historyservice.v1.ListTasksRequest.request:type_name -> temporal.server.api.adminservice.v1.ListHistoryTasksRequest
255, // 217: temporal.server.api.historyservice.v1.ListTasksResponse.response:type_name -> temporal.server.api.adminservice.v1.ListHistoryTasksResponse
256, // 218: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.completion:type_name -> temporal.server.api.token.v1.NexusOperationCompletion
257, // 219: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.success:type_name -> temporal.api.common.v1.Payload
169, // 220: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.failure:type_name -> temporal.api.failure.v1.Failure
167, // 221: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.close_time:type_name -> google.protobuf.Timestamp
256, // 222: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.completion:type_name -> temporal.server.api.token.v1.NexusOperationCompletion
257, // 223: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.success:type_name -> temporal.api.common.v1.Payload
258, // 224: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.failure:type_name -> temporal.api.nexus.v1.Failure
167, // 225: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.start_time:type_name -> google.protobuf.Timestamp
180, // 226: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.links:type_name -> temporal.api.common.v1.Link
259, // 227: temporal.server.api.historyservice.v1.InvokeStateMachineMethodRequest.ref:type_name -> temporal.server.api.persistence.v1.StateMachineRef
260, // 228: temporal.server.api.historyservice.v1.DeepHealthCheckResponse.state:type_name -> temporal.server.api.enums.v1.HealthState
181, // 229: temporal.server.api.historyservice.v1.SyncWorkflowStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
183, // 230: temporal.server.api.historyservice.v1.SyncWorkflowStateRequest.versioned_transition:type_name -> temporal.server.api.persistence.v1.VersionedTransition
187, // 231: temporal.server.api.historyservice.v1.SyncWorkflowStateRequest.version_histories:type_name -> temporal.server.api.history.v1.VersionHistories
261, // 232: temporal.server.api.historyservice.v1.SyncWorkflowStateResponse.versioned_transition_artifact:type_name -> temporal.server.api.replication.v1.VersionedTransitionArtifact
262, // 233: temporal.server.api.historyservice.v1.UpdateActivityOptionsRequest.update_request:type_name -> temporal.api.workflowservice.v1.UpdateActivityOptionsRequest
263, // 234: temporal.server.api.historyservice.v1.UpdateActivityOptionsResponse.activity_options:type_name -> temporal.api.activity.v1.ActivityOptions
264, // 235: temporal.server.api.historyservice.v1.PauseActivityRequest.frontend_request:type_name -> temporal.api.workflowservice.v1.PauseActivityRequest
265, // 236: temporal.server.api.historyservice.v1.UnpauseActivityRequest.frontend_request:type_name -> temporal.api.workflowservice.v1.UnpauseActivityRequest
266, // 237: temporal.server.api.historyservice.v1.ResetActivityRequest.frontend_request:type_name -> temporal.api.workflowservice.v1.ResetActivityRequest
267, // 238: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionOptionsRequest.update_request:type_name -> temporal.api.workflowservice.v1.UpdateWorkflowExecutionOptionsRequest
268, // 239: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionOptionsResponse.workflow_execution_options:type_name -> temporal.api.workflow.v1.WorkflowExecutionOptions
269, // 240: temporal.server.api.historyservice.v1.PauseWorkflowExecutionRequest.pause_request:type_name -> temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest
270, // 241: temporal.server.api.historyservice.v1.UnpauseWorkflowExecutionRequest.unpause_request:type_name -> temporal.api.workflowservice.v1.UnpauseWorkflowExecutionRequest
1, // 242: temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.Operation.start_workflow:type_name -> temporal.server.api.historyservice.v1.StartWorkflowExecutionRequest
105, // 243: temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.Operation.update_workflow:type_name -> temporal.server.api.historyservice.v1.UpdateWorkflowExecutionRequest
2, // 244: temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.Response.start_workflow:type_name -> temporal.server.api.historyservice.v1.StartWorkflowExecutionResponse
106, // 245: temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.Response.update_workflow:type_name -> temporal.server.api.historyservice.v1.UpdateWorkflowExecutionResponse
271, // 246: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery
271, // 247: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery
272, // 248: temporal.server.api.historyservice.v1.GetReplicationMessagesResponse.ShardMessagesEntry.value:type_name -> temporal.server.api.replication.v1.ReplicationMessages
98, // 249: temporal.server.api.historyservice.v1.ShardReplicationStatus.RemoteClustersEntry.value:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatusPerCluster
97, // 250: temporal.server.api.historyservice.v1.ShardReplicationStatus.HandoverNamespacesEntry.value:type_name -> temporal.server.api.historyservice.v1.HandoverNamespaceInfo
221, // 251: temporal.server.api.historyservice.v1.AddTasksRequest.Task.blob:type_name -> temporal.api.common.v1.DataBlob
273, // 252: temporal.server.api.historyservice.v1.routing:extendee -> google.protobuf.MessageOptions
0, // 253: temporal.server.api.historyservice.v1.routing:type_name -> temporal.server.api.historyservice.v1.RoutingOptions
254, // [254:254] is the sub-list for method output_type
254, // [254:254] is the sub-list for method input_type
253, // [253:254] is the sub-list for extension type_name
252, // [252:253] is the sub-list for extension extendee
0, // [0:252] is the sub-list for field type_name
181, // 30: temporal.server.api.historyservice.v1.PollMutableStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
182, // 31: temporal.server.api.historyservice.v1.PollMutableStateRequest.version_history_item:type_name -> temporal.server.api.history.v1.VersionHistoryItem
181, // 32: temporal.server.api.historyservice.v1.PollMutableStateResponse.execution:type_name -> temporal.api.common.v1.WorkflowExecution
184, // 33: temporal.server.api.historyservice.v1.PollMutableStateResponse.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
185, // 34: temporal.server.api.historyservice.v1.PollMutableStateResponse.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
185, // 35: temporal.server.api.historyservice.v1.PollMutableStateResponse.sticky_task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
171, // 36: temporal.server.api.historyservice.v1.PollMutableStateResponse.sticky_task_queue_schedule_to_start_timeout:type_name -> google.protobuf.Duration
187, // 37: temporal.server.api.historyservice.v1.PollMutableStateResponse.version_histories:type_name -> temporal.server.api.history.v1.VersionHistories
186, // 38: temporal.server.api.historyservice.v1.PollMutableStateResponse.workflow_state:type_name -> temporal.server.api.enums.v1.WorkflowExecutionState
179, // 39: temporal.server.api.historyservice.v1.PollMutableStateResponse.workflow_status:type_name -> temporal.api.enums.v1.WorkflowExecutionStatus
181, // 40: temporal.server.api.historyservice.v1.ResetStickyTaskQueueRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
156, // 41: temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.operations:type_name -> temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.Operation
157, // 42: temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.responses:type_name -> temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.Response
181, // 43: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
189, // 44: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.poll_request:type_name -> temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest
177, // 45: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
190, // 46: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.build_id_redirect_info:type_name -> temporal.server.api.taskqueue.v1.BuildIdRedirectInfo
191, // 47: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.scheduled_deployment:type_name -> temporal.api.deployment.v1.Deployment
192, // 48: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective
175, // 49: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedRequest.target_deployment_version:type_name -> temporal.api.deployment.v1.WorkerDeploymentVersion
184, // 50: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
193, // 51: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.transient_workflow_task:type_name -> temporal.server.api.history.v1.TransientWorkflowTaskInfo
185, // 52: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.workflow_execution_task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
167, // 53: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 54: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.started_time:type_name -> google.protobuf.Timestamp
158, // 55: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.queries:type_name -> temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.QueriesEntry
177, // 56: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.clock:type_name -> temporal.server.api.clock.v1.VectorClock
194, // 57: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.messages:type_name -> temporal.api.protocol.v1.Message
195, // 58: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.history:type_name -> temporal.api.history.v1.History
195, // 59: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.raw_history:type_name -> temporal.api.history.v1.History
184, // 60: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
193, // 61: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.transient_workflow_task:type_name -> temporal.server.api.history.v1.TransientWorkflowTaskInfo
185, // 62: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.workflow_execution_task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue
167, // 63: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 64: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.started_time:type_name -> google.protobuf.Timestamp
159, // 65: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.queries:type_name -> temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.QueriesEntry
177, // 66: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.clock:type_name -> temporal.server.api.clock.v1.VectorClock
194, // 67: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.messages:type_name -> temporal.api.protocol.v1.Message
195, // 68: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.history:type_name -> temporal.api.history.v1.History
181, // 69: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
196, // 70: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.poll_request:type_name -> temporal.api.workflowservice.v1.PollActivityTaskQueueRequest
177, // 71: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
190, // 72: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.build_id_redirect_info:type_name -> temporal.server.api.taskqueue.v1.BuildIdRedirectInfo
191, // 73: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.scheduled_deployment:type_name -> temporal.api.deployment.v1.Deployment
192, // 74: temporal.server.api.historyservice.v1.RecordActivityTaskStartedRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective
197, // 75: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.scheduled_event:type_name -> temporal.api.history.v1.HistoryEvent
167, // 76: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.started_time:type_name -> google.protobuf.Timestamp
167, // 77: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.current_attempt_scheduled_time:type_name -> google.protobuf.Timestamp
170, // 78: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.heartbeat_details:type_name -> temporal.api.common.v1.Payloads
184, // 79: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.workflow_type:type_name -> temporal.api.common.v1.WorkflowType
177, // 80: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.clock:type_name -> temporal.server.api.clock.v1.VectorClock
198, // 81: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.priority:type_name -> temporal.api.common.v1.Priority
199, // 82: temporal.server.api.historyservice.v1.RecordActivityTaskStartedResponse.retry_policy:type_name -> temporal.api.common.v1.RetryPolicy
200, // 83: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedRequest.complete_request:type_name -> temporal.api.workflowservice.v1.RespondWorkflowTaskCompletedRequest
12, // 84: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedResponse.started_response:type_name -> temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse
201, // 85: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedResponse.activity_tasks:type_name -> temporal.api.workflowservice.v1.PollActivityTaskQueueResponse
178, // 86: temporal.server.api.historyservice.v1.RespondWorkflowTaskCompletedResponse.new_workflow_task:type_name -> temporal.api.workflowservice.v1.PollWorkflowTaskQueueResponse
202, // 87: temporal.server.api.historyservice.v1.RespondWorkflowTaskFailedRequest.failed_request:type_name -> temporal.api.workflowservice.v1.RespondWorkflowTaskFailedRequest
181, // 88: temporal.server.api.historyservice.v1.IsWorkflowTaskValidRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 89: temporal.server.api.historyservice.v1.IsWorkflowTaskValidRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
203, // 90: temporal.server.api.historyservice.v1.RecordActivityTaskHeartbeatRequest.heartbeat_request:type_name -> temporal.api.workflowservice.v1.RecordActivityTaskHeartbeatRequest
204, // 91: temporal.server.api.historyservice.v1.RespondActivityTaskCompletedRequest.complete_request:type_name -> temporal.api.workflowservice.v1.RespondActivityTaskCompletedRequest
205, // 92: temporal.server.api.historyservice.v1.RespondActivityTaskFailedRequest.failed_request:type_name -> temporal.api.workflowservice.v1.RespondActivityTaskFailedRequest
206, // 93: temporal.server.api.historyservice.v1.RespondActivityTaskCanceledRequest.cancel_request:type_name -> temporal.api.workflowservice.v1.RespondActivityTaskCanceledRequest
181, // 94: temporal.server.api.historyservice.v1.IsActivityTaskValidRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 95: temporal.server.api.historyservice.v1.IsActivityTaskValidRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
207, // 96: temporal.server.api.historyservice.v1.SignalWorkflowExecutionRequest.signal_request:type_name -> temporal.api.workflowservice.v1.SignalWorkflowExecutionRequest
181, // 97: temporal.server.api.historyservice.v1.SignalWorkflowExecutionRequest.external_workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
208, // 98: temporal.server.api.historyservice.v1.SignalWithStartWorkflowExecutionRequest.signal_with_start_request:type_name -> temporal.api.workflowservice.v1.SignalWithStartWorkflowExecutionRequest
181, // 99: temporal.server.api.historyservice.v1.RemoveSignalMutableStateRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
209, // 100: temporal.server.api.historyservice.v1.TerminateWorkflowExecutionRequest.terminate_request:type_name -> temporal.api.workflowservice.v1.TerminateWorkflowExecutionRequest
181, // 101: temporal.server.api.historyservice.v1.TerminateWorkflowExecutionRequest.external_workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 102: temporal.server.api.historyservice.v1.DeleteWorkflowExecutionRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
210, // 103: temporal.server.api.historyservice.v1.ResetWorkflowExecutionRequest.reset_request:type_name -> temporal.api.workflowservice.v1.ResetWorkflowExecutionRequest
211, // 104: temporal.server.api.historyservice.v1.RequestCancelWorkflowExecutionRequest.cancel_request:type_name -> temporal.api.workflowservice.v1.RequestCancelWorkflowExecutionRequest
181, // 105: temporal.server.api.historyservice.v1.RequestCancelWorkflowExecutionRequest.external_workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 106: temporal.server.api.historyservice.v1.ScheduleWorkflowTaskRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 107: temporal.server.api.historyservice.v1.ScheduleWorkflowTaskRequest.child_clock:type_name -> temporal.server.api.clock.v1.VectorClock
177, // 108: temporal.server.api.historyservice.v1.ScheduleWorkflowTaskRequest.parent_clock:type_name -> temporal.server.api.clock.v1.VectorClock
181, // 109: temporal.server.api.historyservice.v1.VerifyFirstWorkflowTaskScheduledRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 110: temporal.server.api.historyservice.v1.VerifyFirstWorkflowTaskScheduledRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
181, // 111: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.parent_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 112: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.child_execution:type_name -> temporal.api.common.v1.WorkflowExecution
197, // 113: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.completion_event:type_name -> temporal.api.history.v1.HistoryEvent
177, // 114: temporal.server.api.historyservice.v1.RecordChildExecutionCompletedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
181, // 115: temporal.server.api.historyservice.v1.VerifyChildExecutionCompletionRecordedRequest.parent_execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 116: temporal.server.api.historyservice.v1.VerifyChildExecutionCompletionRecordedRequest.child_execution:type_name -> temporal.api.common.v1.WorkflowExecution
177, // 117: temporal.server.api.historyservice.v1.VerifyChildExecutionCompletionRecordedRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock
212, // 118: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionRequest.request:type_name -> temporal.api.workflowservice.v1.DescribeWorkflowExecutionRequest
213, // 119: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.execution_config:type_name -> temporal.api.workflow.v1.WorkflowExecutionConfig
214, // 120: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.workflow_execution_info:type_name -> temporal.api.workflow.v1.WorkflowExecutionInfo
215, // 121: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_activities:type_name -> temporal.api.workflow.v1.PendingActivityInfo
216, // 122: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_children:type_name -> temporal.api.workflow.v1.PendingChildExecutionInfo
217, // 123: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_workflow_task:type_name -> temporal.api.workflow.v1.PendingWorkflowTaskInfo
218, // 124: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.callbacks:type_name -> temporal.api.workflow.v1.CallbackInfo
219, // 125: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.pending_nexus_operations:type_name -> temporal.api.workflow.v1.PendingNexusOperationInfo
220, // 126: temporal.server.api.historyservice.v1.DescribeWorkflowExecutionResponse.workflow_extended_info:type_name -> temporal.api.workflow.v1.WorkflowExecutionExtendedInfo
181, // 127: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
182, // 128: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.version_history_items:type_name -> temporal.server.api.history.v1.VersionHistoryItem
221, // 129: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.events:type_name -> temporal.api.common.v1.DataBlob
221, // 130: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.new_run_events:type_name -> temporal.api.common.v1.DataBlob
222, // 131: temporal.server.api.historyservice.v1.ReplicateEventsV2Request.base_execution_info:type_name -> temporal.server.api.workflow.v1.BaseExecutionInfo
223, // 132: temporal.server.api.historyservice.v1.ReplicateWorkflowStateRequest.workflow_state:type_name -> temporal.server.api.persistence.v1.WorkflowMutableState
167, // 133: temporal.server.api.historyservice.v1.SyncShardStatusRequest.status_time:type_name -> google.protobuf.Timestamp
167, // 134: temporal.server.api.historyservice.v1.SyncActivityRequest.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 135: temporal.server.api.historyservice.v1.SyncActivityRequest.started_time:type_name -> google.protobuf.Timestamp
167, // 136: temporal.server.api.historyservice.v1.SyncActivityRequest.last_heartbeat_time:type_name -> google.protobuf.Timestamp
170, // 137: temporal.server.api.historyservice.v1.SyncActivityRequest.details:type_name -> temporal.api.common.v1.Payloads
169, // 138: temporal.server.api.historyservice.v1.SyncActivityRequest.last_failure:type_name -> temporal.api.failure.v1.Failure
224, // 139: temporal.server.api.historyservice.v1.SyncActivityRequest.version_history:type_name -> temporal.server.api.history.v1.VersionHistory
222, // 140: temporal.server.api.historyservice.v1.SyncActivityRequest.base_execution_info:type_name -> temporal.server.api.workflow.v1.BaseExecutionInfo
167, // 141: temporal.server.api.historyservice.v1.SyncActivityRequest.first_scheduled_time:type_name -> google.protobuf.Timestamp
167, // 142: temporal.server.api.historyservice.v1.SyncActivityRequest.last_attempt_complete_time:type_name -> google.protobuf.Timestamp
171, // 143: temporal.server.api.historyservice.v1.SyncActivityRequest.retry_initial_interval:type_name -> google.protobuf.Duration
171, // 144: temporal.server.api.historyservice.v1.SyncActivityRequest.retry_maximum_interval:type_name -> google.protobuf.Duration
64, // 145: temporal.server.api.historyservice.v1.SyncActivitiesRequest.activities_info:type_name -> temporal.server.api.historyservice.v1.ActivitySyncInfo
167, // 146: temporal.server.api.historyservice.v1.ActivitySyncInfo.scheduled_time:type_name -> google.protobuf.Timestamp
167, // 147: temporal.server.api.historyservice.v1.ActivitySyncInfo.started_time:type_name -> google.protobuf.Timestamp
167, // 148: temporal.server.api.historyservice.v1.ActivitySyncInfo.last_heartbeat_time:type_name -> google.protobuf.Timestamp
170, // 149: temporal.server.api.historyservice.v1.ActivitySyncInfo.details:type_name -> temporal.api.common.v1.Payloads
169, // 150: temporal.server.api.historyservice.v1.ActivitySyncInfo.last_failure:type_name -> temporal.api.failure.v1.Failure
224, // 151: temporal.server.api.historyservice.v1.ActivitySyncInfo.version_history:type_name -> temporal.server.api.history.v1.VersionHistory
167, // 152: temporal.server.api.historyservice.v1.ActivitySyncInfo.first_scheduled_time:type_name -> google.protobuf.Timestamp
167, // 153: temporal.server.api.historyservice.v1.ActivitySyncInfo.last_attempt_complete_time:type_name -> google.protobuf.Timestamp
171, // 154: temporal.server.api.historyservice.v1.ActivitySyncInfo.retry_initial_interval:type_name -> google.protobuf.Duration
171, // 155: temporal.server.api.historyservice.v1.ActivitySyncInfo.retry_maximum_interval:type_name -> google.protobuf.Duration
181, // 156: temporal.server.api.historyservice.v1.DescribeMutableStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
223, // 157: temporal.server.api.historyservice.v1.DescribeMutableStateResponse.cache_mutable_state:type_name -> temporal.server.api.persistence.v1.WorkflowMutableState
223, // 158: temporal.server.api.historyservice.v1.DescribeMutableStateResponse.database_mutable_state:type_name -> temporal.server.api.persistence.v1.WorkflowMutableState
181, // 159: temporal.server.api.historyservice.v1.DescribeHistoryHostRequest.workflow_execution:type_name -> temporal.api.common.v1.WorkflowExecution
225, // 160: temporal.server.api.historyservice.v1.DescribeHistoryHostResponse.namespace_cache:type_name -> temporal.server.api.namespace.v1.NamespaceCacheInfo
226, // 161: temporal.server.api.historyservice.v1.GetShardResponse.shard_info:type_name -> temporal.server.api.persistence.v1.ShardInfo
167, // 162: temporal.server.api.historyservice.v1.RemoveTaskRequest.visibility_time:type_name -> google.protobuf.Timestamp
227, // 163: temporal.server.api.historyservice.v1.GetReplicationMessagesRequest.tokens:type_name -> temporal.server.api.replication.v1.ReplicationToken
160, // 164: temporal.server.api.historyservice.v1.GetReplicationMessagesResponse.shard_messages:type_name -> temporal.server.api.historyservice.v1.GetReplicationMessagesResponse.ShardMessagesEntry
228, // 165: temporal.server.api.historyservice.v1.GetDLQReplicationMessagesRequest.task_infos:type_name -> temporal.server.api.replication.v1.ReplicationTaskInfo
229, // 166: temporal.server.api.historyservice.v1.GetDLQReplicationMessagesResponse.replication_tasks:type_name -> temporal.server.api.replication.v1.ReplicationTask
230, // 167: temporal.server.api.historyservice.v1.QueryWorkflowRequest.request:type_name -> temporal.api.workflowservice.v1.QueryWorkflowRequest
231, // 168: temporal.server.api.historyservice.v1.QueryWorkflowResponse.response:type_name -> temporal.api.workflowservice.v1.QueryWorkflowResponse
232, // 169: temporal.server.api.historyservice.v1.ReapplyEventsRequest.request:type_name -> temporal.server.api.adminservice.v1.ReapplyEventsRequest
233, // 170: temporal.server.api.historyservice.v1.GetDLQMessagesRequest.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
233, // 171: temporal.server.api.historyservice.v1.GetDLQMessagesResponse.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
229, // 172: temporal.server.api.historyservice.v1.GetDLQMessagesResponse.replication_tasks:type_name -> temporal.server.api.replication.v1.ReplicationTask
228, // 173: temporal.server.api.historyservice.v1.GetDLQMessagesResponse.replication_tasks_info:type_name -> temporal.server.api.replication.v1.ReplicationTaskInfo
233, // 174: temporal.server.api.historyservice.v1.PurgeDLQMessagesRequest.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
233, // 175: temporal.server.api.historyservice.v1.MergeDLQMessagesRequest.type:type_name -> temporal.server.api.enums.v1.DeadLetterQueueType
234, // 176: temporal.server.api.historyservice.v1.RefreshWorkflowTasksRequest.request:type_name -> temporal.server.api.adminservice.v1.RefreshWorkflowTasksRequest
181, // 177: temporal.server.api.historyservice.v1.GenerateLastHistoryReplicationTasksRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
96, // 178: temporal.server.api.historyservice.v1.GetReplicationStatusResponse.shards:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatus
167, // 179: temporal.server.api.historyservice.v1.ShardReplicationStatus.shard_local_time:type_name -> google.protobuf.Timestamp
161, // 180: temporal.server.api.historyservice.v1.ShardReplicationStatus.remote_clusters:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatus.RemoteClustersEntry
162, // 181: temporal.server.api.historyservice.v1.ShardReplicationStatus.handover_namespaces:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatus.HandoverNamespacesEntry
167, // 182: temporal.server.api.historyservice.v1.ShardReplicationStatus.max_replication_task_visibility_time:type_name -> google.protobuf.Timestamp
167, // 183: temporal.server.api.historyservice.v1.ShardReplicationStatusPerCluster.acked_task_visibility_time:type_name -> google.protobuf.Timestamp
181, // 184: temporal.server.api.historyservice.v1.RebuildMutableStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
181, // 185: temporal.server.api.historyservice.v1.ImportWorkflowExecutionRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
221, // 186: temporal.server.api.historyservice.v1.ImportWorkflowExecutionRequest.history_batches:type_name -> temporal.api.common.v1.DataBlob
224, // 187: temporal.server.api.historyservice.v1.ImportWorkflowExecutionRequest.version_history:type_name -> temporal.server.api.history.v1.VersionHistory
181, // 188: temporal.server.api.historyservice.v1.DeleteWorkflowVisibilityRecordRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
167, // 189: temporal.server.api.historyservice.v1.DeleteWorkflowVisibilityRecordRequest.workflow_start_time:type_name -> google.protobuf.Timestamp
167, // 190: temporal.server.api.historyservice.v1.DeleteWorkflowVisibilityRecordRequest.workflow_close_time:type_name -> google.protobuf.Timestamp
235, // 191: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionRequest.request:type_name -> temporal.api.workflowservice.v1.UpdateWorkflowExecutionRequest
236, // 192: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionResponse.response:type_name -> temporal.api.workflowservice.v1.UpdateWorkflowExecutionResponse
237, // 193: temporal.server.api.historyservice.v1.StreamWorkflowReplicationMessagesRequest.sync_replication_state:type_name -> temporal.server.api.replication.v1.SyncReplicationState
238, // 194: temporal.server.api.historyservice.v1.StreamWorkflowReplicationMessagesResponse.messages:type_name -> temporal.server.api.replication.v1.WorkflowReplicationMessages
239, // 195: temporal.server.api.historyservice.v1.PollWorkflowExecutionUpdateRequest.request:type_name -> temporal.api.workflowservice.v1.PollWorkflowExecutionUpdateRequest
240, // 196: temporal.server.api.historyservice.v1.PollWorkflowExecutionUpdateResponse.response:type_name -> temporal.api.workflowservice.v1.PollWorkflowExecutionUpdateResponse
241, // 197: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryRequest
242, // 198: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse
195, // 199: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryResponse.history:type_name -> temporal.api.history.v1.History
242, // 200: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryResponseWithRaw.response:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryResponse
243, // 201: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryReverseRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseRequest
244, // 202: temporal.server.api.historyservice.v1.GetWorkflowExecutionHistoryReverseResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkflowExecutionHistoryReverseResponse
245, // 203: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryV2Request.request:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryV2Request
246, // 204: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryV2Response.response:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryV2Response
247, // 205: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryRequest.request:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryRequest
248, // 206: temporal.server.api.historyservice.v1.GetWorkflowExecutionRawHistoryResponse.response:type_name -> temporal.server.api.adminservice.v1.GetWorkflowExecutionRawHistoryResponse
249, // 207: temporal.server.api.historyservice.v1.ForceDeleteWorkflowExecutionRequest.request:type_name -> temporal.server.api.adminservice.v1.DeleteWorkflowExecutionRequest
250, // 208: temporal.server.api.historyservice.v1.ForceDeleteWorkflowExecutionResponse.response:type_name -> temporal.server.api.adminservice.v1.DeleteWorkflowExecutionResponse
251, // 209: temporal.server.api.historyservice.v1.GetDLQTasksRequest.dlq_key:type_name -> temporal.server.api.common.v1.HistoryDLQKey
252, // 210: temporal.server.api.historyservice.v1.GetDLQTasksResponse.dlq_tasks:type_name -> temporal.server.api.common.v1.HistoryDLQTask
251, // 211: temporal.server.api.historyservice.v1.DeleteDLQTasksRequest.dlq_key:type_name -> temporal.server.api.common.v1.HistoryDLQKey
253, // 212: temporal.server.api.historyservice.v1.DeleteDLQTasksRequest.inclusive_max_task_metadata:type_name -> temporal.server.api.common.v1.HistoryDLQTaskMetadata
163, // 213: temporal.server.api.historyservice.v1.ListQueuesResponse.queues:type_name -> temporal.server.api.historyservice.v1.ListQueuesResponse.QueueInfo
164, // 214: temporal.server.api.historyservice.v1.AddTasksRequest.tasks:type_name -> temporal.server.api.historyservice.v1.AddTasksRequest.Task
254, // 215: temporal.server.api.historyservice.v1.ListTasksRequest.request:type_name -> temporal.server.api.adminservice.v1.ListHistoryTasksRequest
255, // 216: temporal.server.api.historyservice.v1.ListTasksResponse.response:type_name -> temporal.server.api.adminservice.v1.ListHistoryTasksResponse
256, // 217: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.completion:type_name -> temporal.server.api.token.v1.NexusOperationCompletion
257, // 218: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.success:type_name -> temporal.api.common.v1.Payload
169, // 219: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.failure:type_name -> temporal.api.failure.v1.Failure
167, // 220: temporal.server.api.historyservice.v1.CompleteNexusOperationChasmRequest.close_time:type_name -> google.protobuf.Timestamp
256, // 221: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.completion:type_name -> temporal.server.api.token.v1.NexusOperationCompletion
257, // 222: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.success:type_name -> temporal.api.common.v1.Payload
258, // 223: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.failure:type_name -> temporal.api.nexus.v1.Failure
167, // 224: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.start_time:type_name -> google.protobuf.Timestamp
180, // 225: temporal.server.api.historyservice.v1.CompleteNexusOperationRequest.links:type_name -> temporal.api.common.v1.Link
259, // 226: temporal.server.api.historyservice.v1.InvokeStateMachineMethodRequest.ref:type_name -> temporal.server.api.persistence.v1.StateMachineRef
260, // 227: temporal.server.api.historyservice.v1.DeepHealthCheckResponse.state:type_name -> temporal.server.api.enums.v1.HealthState
181, // 228: temporal.server.api.historyservice.v1.SyncWorkflowStateRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution
183, // 229: temporal.server.api.historyservice.v1.SyncWorkflowStateRequest.versioned_transition:type_name -> temporal.server.api.persistence.v1.VersionedTransition
187, // 230: temporal.server.api.historyservice.v1.SyncWorkflowStateRequest.version_histories:type_name -> temporal.server.api.history.v1.VersionHistories
261, // 231: temporal.server.api.historyservice.v1.SyncWorkflowStateResponse.versioned_transition_artifact:type_name -> temporal.server.api.replication.v1.VersionedTransitionArtifact
262, // 232: temporal.server.api.historyservice.v1.UpdateActivityOptionsRequest.update_request:type_name -> temporal.api.workflowservice.v1.UpdateActivityOptionsRequest
263, // 233: temporal.server.api.historyservice.v1.UpdateActivityOptionsResponse.activity_options:type_name -> temporal.api.activity.v1.ActivityOptions
264, // 234: temporal.server.api.historyservice.v1.PauseActivityRequest.frontend_request:type_name -> temporal.api.workflowservice.v1.PauseActivityRequest
265, // 235: temporal.server.api.historyservice.v1.UnpauseActivityRequest.frontend_request:type_name -> temporal.api.workflowservice.v1.UnpauseActivityRequest
266, // 236: temporal.server.api.historyservice.v1.ResetActivityRequest.frontend_request:type_name -> temporal.api.workflowservice.v1.ResetActivityRequest
267, // 237: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionOptionsRequest.update_request:type_name -> temporal.api.workflowservice.v1.UpdateWorkflowExecutionOptionsRequest
268, // 238: temporal.server.api.historyservice.v1.UpdateWorkflowExecutionOptionsResponse.workflow_execution_options:type_name -> temporal.api.workflow.v1.WorkflowExecutionOptions
269, // 239: temporal.server.api.historyservice.v1.PauseWorkflowExecutionRequest.pause_request:type_name -> temporal.api.workflowservice.v1.PauseWorkflowExecutionRequest
270, // 240: temporal.server.api.historyservice.v1.UnpauseWorkflowExecutionRequest.unpause_request:type_name -> temporal.api.workflowservice.v1.UnpauseWorkflowExecutionRequest
1, // 241: temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.Operation.start_workflow:type_name -> temporal.server.api.historyservice.v1.StartWorkflowExecutionRequest
105, // 242: temporal.server.api.historyservice.v1.ExecuteMultiOperationRequest.Operation.update_workflow:type_name -> temporal.server.api.historyservice.v1.UpdateWorkflowExecutionRequest
2, // 243: temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.Response.start_workflow:type_name -> temporal.server.api.historyservice.v1.StartWorkflowExecutionResponse
106, // 244: temporal.server.api.historyservice.v1.ExecuteMultiOperationResponse.Response.update_workflow:type_name -> temporal.server.api.historyservice.v1.UpdateWorkflowExecutionResponse
271, // 245: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponse.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery
271, // 246: temporal.server.api.historyservice.v1.RecordWorkflowTaskStartedResponseWithRawHistory.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery
272, // 247: temporal.server.api.historyservice.v1.GetReplicationMessagesResponse.ShardMessagesEntry.value:type_name -> temporal.server.api.replication.v1.ReplicationMessages
98, // 248: temporal.server.api.historyservice.v1.ShardReplicationStatus.RemoteClustersEntry.value:type_name -> temporal.server.api.historyservice.v1.ShardReplicationStatusPerCluster
97, // 249: temporal.server.api.historyservice.v1.ShardReplicationStatus.HandoverNamespacesEntry.value:type_name -> temporal.server.api.historyservice.v1.HandoverNamespaceInfo
221, // 250: temporal.server.api.historyservice.v1.AddTasksRequest.Task.blob:type_name -> temporal.api.common.v1.DataBlob
273, // 251: temporal.server.api.historyservice.v1.routing:extendee -> google.protobuf.MessageOptions
0, // 252: temporal.server.api.historyservice.v1.routing:type_name -> temporal.server.api.historyservice.v1.RoutingOptions
253, // [253:253] is the sub-list for method output_type
253, // [253:253] is the sub-list for method input_type
252, // [252:253] is the sub-list for extension type_name
251, // [251:252] is the sub-list for extension extendee
0, // [0:251] is the sub-list for field type_name
}
func init() { file_temporal_server_api_historyservice_v1_request_response_proto_init() }
+49 -38
View File
@@ -27,17 +27,18 @@ const (
)
type HistoryContinuation struct {
state protoimpl.MessageState `protogen:"open.v1"`
RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
FirstEventId int64 `protobuf:"varint,2,opt,name=first_event_id,json=firstEventId,proto3" json:"first_event_id,omitempty"`
NextEventId int64 `protobuf:"varint,3,opt,name=next_event_id,json=nextEventId,proto3" json:"next_event_id,omitempty"`
IsWorkflowRunning bool `protobuf:"varint,5,opt,name=is_workflow_running,json=isWorkflowRunning,proto3" json:"is_workflow_running,omitempty"`
PersistenceToken []byte `protobuf:"bytes,6,opt,name=persistence_token,json=persistenceToken,proto3" json:"persistence_token,omitempty"`
BranchToken []byte `protobuf:"bytes,8,opt,name=branch_token,json=branchToken,proto3" json:"branch_token,omitempty"`
VersionHistoryItem *v1.VersionHistoryItem `protobuf:"bytes,10,opt,name=version_history_item,json=versionHistoryItem,proto3" json:"version_history_item,omitempty"`
VersionedTransition *v11.VersionedTransition `protobuf:"bytes,11,opt,name=versioned_transition,json=versionedTransition,proto3" json:"versioned_transition,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
state protoimpl.MessageState `protogen:"open.v1"`
RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"`
FirstEventId int64 `protobuf:"varint,2,opt,name=first_event_id,json=firstEventId,proto3" json:"first_event_id,omitempty"`
NextEventId int64 `protobuf:"varint,3,opt,name=next_event_id,json=nextEventId,proto3" json:"next_event_id,omitempty"`
IsWorkflowRunning bool `protobuf:"varint,5,opt,name=is_workflow_running,json=isWorkflowRunning,proto3" json:"is_workflow_running,omitempty"`
PersistenceToken []byte `protobuf:"bytes,6,opt,name=persistence_token,json=persistenceToken,proto3" json:"persistence_token,omitempty"`
TransientWorkflowTask *v1.TransientWorkflowTaskInfo `protobuf:"bytes,7,opt,name=transient_workflow_task,json=transientWorkflowTask,proto3" json:"transient_workflow_task,omitempty"`
BranchToken []byte `protobuf:"bytes,8,opt,name=branch_token,json=branchToken,proto3" json:"branch_token,omitempty"`
VersionHistoryItem *v1.VersionHistoryItem `protobuf:"bytes,10,opt,name=version_history_item,json=versionHistoryItem,proto3" json:"version_history_item,omitempty"`
VersionedTransition *v11.VersionedTransition `protobuf:"bytes,11,opt,name=versioned_transition,json=versionedTransition,proto3" json:"versioned_transition,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *HistoryContinuation) Reset() {
@@ -105,6 +106,13 @@ func (x *HistoryContinuation) GetPersistenceToken() []byte {
return nil
}
func (x *HistoryContinuation) GetTransientWorkflowTask() *v1.TransientWorkflowTaskInfo {
if x != nil {
return x.TransientWorkflowTask
}
return nil
}
func (x *HistoryContinuation) GetBranchToken() []byte {
if x != nil {
return x.BranchToken
@@ -655,17 +663,18 @@ var File_temporal_server_api_token_v1_message_proto protoreflect.FileDescriptor
const file_temporal_server_api_token_v1_message_proto_rawDesc = "" +
"\n" +
"*temporal/server/api/token/v1/message.proto\x12\x1ctemporal.server.api.token.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a*temporal/server/api/clock/v1/message.proto\x1a,temporal/server/api/history/v1/message.proto\x1a,temporal/server/api/persistence/v1/hsm.proto\"\xd4\x03\n" +
"*temporal/server/api/token/v1/message.proto\x12\x1ctemporal.server.api.token.v1\x1a\x1fgoogle/protobuf/timestamp.proto\x1a*temporal/server/api/clock/v1/message.proto\x1a,temporal/server/api/history/v1/message.proto\x1a,temporal/server/api/persistence/v1/hsm.proto\"\xc1\x04\n" +
"\x13HistoryContinuation\x12\x15\n" +
"\x06run_id\x18\x01 \x01(\tR\x05runId\x12$\n" +
"\x0efirst_event_id\x18\x02 \x01(\x03R\ffirstEventId\x12\"\n" +
"\rnext_event_id\x18\x03 \x01(\x03R\vnextEventId\x12.\n" +
"\x13is_workflow_running\x18\x05 \x01(\bR\x11isWorkflowRunning\x12+\n" +
"\x11persistence_token\x18\x06 \x01(\fR\x10persistenceToken\x12!\n" +
"\x11persistence_token\x18\x06 \x01(\fR\x10persistenceToken\x12q\n" +
"\x17transient_workflow_task\x18\a \x01(\v29.temporal.server.api.history.v1.TransientWorkflowTaskInfoR\x15transientWorkflowTask\x12!\n" +
"\fbranch_token\x18\b \x01(\fR\vbranchToken\x12d\n" +
"\x14version_history_item\x18\n" +
" \x01(\v22.temporal.server.api.history.v1.VersionHistoryItemR\x12versionHistoryItem\x12j\n" +
"\x14versioned_transition\x18\v \x01(\v27.temporal.server.api.persistence.v1.VersionedTransitionR\x13versionedTransitionJ\x04\b\a\x10\bJ\x04\b\t\x10\n" +
"\x14versioned_transition\x18\v \x01(\v27.temporal.server.api.persistence.v1.VersionedTransitionR\x13versionedTransitionJ\x04\b\t\x10\n" +
"\"\xa9\x03\n" +
"\x16RawHistoryContinuation\x12!\n" +
"\fnamespace_id\x18\n" +
@@ -735,32 +744,34 @@ func file_temporal_server_api_token_v1_message_proto_rawDescGZIP() []byte {
var file_temporal_server_api_token_v1_message_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_temporal_server_api_token_v1_message_proto_goTypes = []any{
(*HistoryContinuation)(nil), // 0: temporal.server.api.token.v1.HistoryContinuation
(*RawHistoryContinuation)(nil), // 1: temporal.server.api.token.v1.RawHistoryContinuation
(*Task)(nil), // 2: temporal.server.api.token.v1.Task
(*QueryTask)(nil), // 3: temporal.server.api.token.v1.QueryTask
(*NexusTask)(nil), // 4: temporal.server.api.token.v1.NexusTask
(*HistoryEventRef)(nil), // 5: temporal.server.api.token.v1.HistoryEventRef
(*NexusOperationCompletion)(nil), // 6: temporal.server.api.token.v1.NexusOperationCompletion
(*v1.VersionHistoryItem)(nil), // 7: temporal.server.api.history.v1.VersionHistoryItem
(*v11.VersionedTransition)(nil), // 8: temporal.server.api.persistence.v1.VersionedTransition
(*v1.VersionHistories)(nil), // 9: temporal.server.api.history.v1.VersionHistories
(*v12.VectorClock)(nil), // 10: temporal.server.api.clock.v1.VectorClock
(*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp
(*v11.StateMachineRef)(nil), // 12: temporal.server.api.persistence.v1.StateMachineRef
(*HistoryContinuation)(nil), // 0: temporal.server.api.token.v1.HistoryContinuation
(*RawHistoryContinuation)(nil), // 1: temporal.server.api.token.v1.RawHistoryContinuation
(*Task)(nil), // 2: temporal.server.api.token.v1.Task
(*QueryTask)(nil), // 3: temporal.server.api.token.v1.QueryTask
(*NexusTask)(nil), // 4: temporal.server.api.token.v1.NexusTask
(*HistoryEventRef)(nil), // 5: temporal.server.api.token.v1.HistoryEventRef
(*NexusOperationCompletion)(nil), // 6: temporal.server.api.token.v1.NexusOperationCompletion
(*v1.TransientWorkflowTaskInfo)(nil), // 7: temporal.server.api.history.v1.TransientWorkflowTaskInfo
(*v1.VersionHistoryItem)(nil), // 8: temporal.server.api.history.v1.VersionHistoryItem
(*v11.VersionedTransition)(nil), // 9: temporal.server.api.persistence.v1.VersionedTransition
(*v1.VersionHistories)(nil), // 10: temporal.server.api.history.v1.VersionHistories
(*v12.VectorClock)(nil), // 11: temporal.server.api.clock.v1.VectorClock
(*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp
(*v11.StateMachineRef)(nil), // 13: temporal.server.api.persistence.v1.StateMachineRef
}
var file_temporal_server_api_token_v1_message_proto_depIdxs = []int32{
7, // 0: temporal.server.api.token.v1.HistoryContinuation.version_history_item:type_name -> temporal.server.api.history.v1.VersionHistoryItem
8, // 1: temporal.server.api.token.v1.HistoryContinuation.versioned_transition:type_name -> temporal.server.api.persistence.v1.VersionedTransition
9, // 2: temporal.server.api.token.v1.RawHistoryContinuation.version_histories:type_name -> temporal.server.api.history.v1.VersionHistories
10, // 3: temporal.server.api.token.v1.Task.clock:type_name -> temporal.server.api.clock.v1.VectorClock
11, // 4: temporal.server.api.token.v1.Task.started_time:type_name -> google.protobuf.Timestamp
12, // 5: temporal.server.api.token.v1.NexusOperationCompletion.ref:type_name -> temporal.server.api.persistence.v1.StateMachineRef
6, // [6:6] is the sub-list for method output_type
6, // [6:6] is the sub-list for method input_type
6, // [6:6] is the sub-list for extension type_name
6, // [6:6] is the sub-list for extension extendee
0, // [0:6] is the sub-list for field type_name
7, // 0: temporal.server.api.token.v1.HistoryContinuation.transient_workflow_task:type_name -> temporal.server.api.history.v1.TransientWorkflowTaskInfo
8, // 1: temporal.server.api.token.v1.HistoryContinuation.version_history_item:type_name -> temporal.server.api.history.v1.VersionHistoryItem
9, // 2: temporal.server.api.token.v1.HistoryContinuation.versioned_transition:type_name -> temporal.server.api.persistence.v1.VersionedTransition
10, // 3: temporal.server.api.token.v1.RawHistoryContinuation.version_histories:type_name -> temporal.server.api.history.v1.VersionHistories
11, // 4: temporal.server.api.token.v1.Task.clock:type_name -> temporal.server.api.clock.v1.VectorClock
12, // 5: temporal.server.api.token.v1.Task.started_time:type_name -> google.protobuf.Timestamp
13, // 6: temporal.server.api.token.v1.NexusOperationCompletion.ref:type_name -> temporal.server.api.persistence.v1.StateMachineRef
7, // [7:7] is the sub-list for method output_type
7, // [7:7] is the sub-list for method input_type
7, // [7:7] is the sub-list for extension type_name
7, // [7:7] is the sub-list for extension extendee
0, // [0:7] is the sub-list for field type_name
}
func init() { file_temporal_server_api_token_v1_message_proto_init() }
@@ -49,14 +49,12 @@ a special [in-memory-queue](./in-memory-queue.md) is used for speculative Workfl
> #### TODO
> It is important to point out that the `WorkflowTaskScheduled` and `WorkflowTaskStarted` events
> for transient and speculative Workflow Task are only added to the `PollWorkflowTask` response - and
> not to the `GetWorkflowExecutionHistory` response. This has an unfortunate consequence: when the
> not to the `GetWorkflowExecutionHistory` response. This has an unfortunate consequence: when the
> worker receives a speculative Workflow Task on a sticky task queue, but the Workflow is already
> evicted from its cache, it issues a `GetWorkflowExecutionHistory` request, which returns the
> history *without* speculative events. This leads to a `premature end of stream` error on the
> evicted from its cache, it issues a `GetWorkflowExecutionHistory` request, which returns the
> history *without* speculative events. This leads to a `premature end of stream` error on the
> worker side. The worker fails the Workflow Task, clears stickiness, and everything works fine
> after that - but a failed Workflow Task appears in the history. Fortunately, it doesn't happen often.
>
> See PR #9138 for related work on ensuring transient events are not incorrectly returned to CLI/UI clients.
## Speculative Workflow Task & Workflow Update
Speculative Workflow Task was introduced to make it possible for Workflow Update to have zero writes
+2
View File
@@ -16,6 +16,8 @@ breaking:
- temporal/server/api/token/v1/message.proto
# TODO: (Chetan) Remove this after merging #8500
- temporal/server/api/persistence/v1/executions.proto
# Temporary ignore for revert of #9138
- temporal/server/api/historyservice/v1/request_response.proto
lint:
use:
- DEFAULT
@@ -154,9 +154,6 @@ message GetMutableStateResponse {
string inherited_build_id = 23;
repeated temporal.server.api.persistence.v1.VersionedTransition transition_history = 24;
temporal.api.workflow.v1.WorkflowExecutionVersioningInfo versioning_info = 25;
// Transient or speculative workflow task events which are not yet persisted in the history.
// These events should be appended to the history when it is returned to the worker.
temporal.server.api.history.v1.TransientWorkflowTaskInfo transient_or_speculative_tasks = 26;
}
message PollMutableStateRequest {
@@ -15,7 +15,7 @@ message HistoryContinuation {
int64 next_event_id = 3;
bool is_workflow_running = 5;
bytes persistence_token = 6;
reserved 7; // Was: transient_workflow_task - no longer passed through continuation token
temporal.server.api.history.v1.TransientWorkflowTaskInfo transient_workflow_task = 7;
bytes branch_token = 8;
reserved 9;
temporal.server.api.history.v1.VersionHistoryItem version_history_item = 10;
+27 -108
View File
@@ -40,7 +40,6 @@ func GetRawHistory(
token []byte,
transientWorkflowTaskInfo *historyspb.TransientWorkflowTaskInfo,
branchToken []byte,
isWorkflowRunning bool,
) (_ []*commonpb.DataBlob, _ []byte, retError error) {
defer func() {
var dataLossErr *serviceerror.DataLoss
@@ -116,27 +115,24 @@ func GetRawHistory(
metrics.HistorySize.With(metricsHandler).Record(int64(size))
if len(nextToken) == 0 && transientWorkflowTaskInfo != nil {
// Check if we should include transient/speculative events
if shouldIncludeTransientOrSpeculativeTasks(ctx, transientWorkflowTaskInfo, isWorkflowRunning) {
// Validate before appending
if err := ValidateTransientWorkflowTaskEvents(nextEventID, transientWorkflowTaskInfo); err != nil {
logger := shardContext.GetLogger()
metricsHandler := interceptor.GetMetricsHandlerFromContext(ctx, logger).WithTags(metrics.OperationTag(metrics.HistoryGetRawHistoryScope))
metrics.ServiceErrIncompleteHistoryCounter.With(metricsHandler).Record(1)
logger.Warn("Transient event validation failed, skipping events",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err))
} else {
if len(transientWorkflowTaskInfo.HistorySuffix) > 0 {
blob, err := shardContext.GetPayloadSerializer().SerializeEvents(transientWorkflowTaskInfo.HistorySuffix)
if err != nil {
return nil, nil, err
}
rawHistory = append(rawHistory, blob)
}
if err := validateTransientWorkflowTaskEvents(nextEventID, transientWorkflowTaskInfo); err != nil {
logger := shardContext.GetLogger()
metricsHandler := interceptor.GetMetricsHandlerFromContext(ctx, logger).WithTags(metrics.OperationTag(metrics.HistoryGetRawHistoryScope))
metrics.ServiceErrIncompleteHistoryCounter.With(metricsHandler).Record(1)
logger.Error("getHistory error",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err))
return nil, nil, err
}
if len(transientWorkflowTaskInfo.HistorySuffix) > 0 {
blob, err := shardContext.GetPayloadSerializer().SerializeEvents(transientWorkflowTaskInfo.HistorySuffix)
if err != nil {
return nil, nil, err
}
rawHistory = append(rawHistory, blob)
}
}
return rawHistory, nextToken, nil
@@ -155,7 +151,6 @@ func GetHistory(
transientWorkflowTaskInfo *historyspb.TransientWorkflowTaskInfo,
branchToken []byte,
persistenceVisibilityMgr manager.VisibilityManager,
isWorkflowRunning bool,
) (history *historypb.History, token []byte, retError error) {
defer func() {
var dataLossErr *serviceerror.DataLoss
@@ -232,23 +227,16 @@ func GetHistory(
tag.Error(err))
}
if len(nextPageToken) == 0 && transientWorkflowTaskInfo != nil {
// Check if we should include transient/speculative events
if shouldIncludeTransientOrSpeculativeTasks(ctx, transientWorkflowTaskInfo, isWorkflowRunning) {
// Validate before appending
if err := ValidateTransientWorkflowTaskEvents(nextEventID, transientWorkflowTaskInfo); err != nil {
metrics.ServiceErrIncompleteHistoryCounter.With(metricsHandler).Record(1)
logger.Warn("Transient event validation failed, skipping events",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err))
// Don't append events, but don't fail request
} else {
// Validation passed, append events
// Append the transient workflow task events once we are done enumerating everything from the events table
historyEvents = append(historyEvents, transientWorkflowTaskInfo.HistorySuffix...)
}
if err := validateTransientWorkflowTaskEvents(nextEventID, transientWorkflowTaskInfo); err != nil {
metrics.ServiceErrIncompleteHistoryCounter.With(metricsHandler).Record(1)
logger.Error("getHistory error",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err))
}
// Append the transient workflow task events once we are done enumerating everything from the events table
historyEvents = append(historyEvents, transientWorkflowTaskInfo.HistorySuffix...)
}
if err := ProcessOutgoingSearchAttributes(
@@ -390,76 +378,7 @@ func ProcessOutgoingSearchAttributes(
return nil
}
// shouldIncludeTransientOrSpeculativeTasks determines if transient/speculative events should be included.
// This function is called only when on the last page of history pagination (nextToken is empty).
func shouldIncludeTransientOrSpeculativeTasks(
ctx context.Context,
tranOrSpecEvents *historyspb.TransientWorkflowTaskInfo,
isWorkflowRunning bool,
) bool {
return len(tranOrSpecEvents.GetHistorySuffix()) > 0 &&
clientSupportsTranOrSpecEvents(ctx) &&
isWorkflowRunning &&
areValidTransientOrSpecEvents(tranOrSpecEvents)
}
// areValidTransientOrSpecEvents validates that transient/speculative workflow task events
// are properly formed before including them in GetWorkflowExecutionHistory responses.
//
// Transient events represent workflow tasks that exist in mutable state but may not be
// persisted to the event history (e.g., retry attempts after task failure). Speculative
// events represent workflow tasks created for processing updates that may be rejected.
//
// Valid transient/speculative events must be:
// 1. A WorkflowTaskScheduled event (always required)
// 2. Optionally followed by a WorkflowTaskStarted event with consecutive event ID
//
// This validation ensures we only include well-formed workflow task events and prevents
// corruption of the history view returned to clients. Invalid events are silently dropped
// with a warning logged.
//
// Returns true if events are valid and should be included in history, false otherwise.
func areValidTransientOrSpecEvents(tranOrSpecEvents *historyspb.TransientWorkflowTaskInfo) bool {
events := tranOrSpecEvents.GetHistorySuffix()
if len(events) == 0 || len(events) > 2 {
return false
}
// First must be WFT_SCHEDULED
if events[0].GetEventType() != enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED {
return false
}
// If 2 events, second must be WFT_STARTED immediately after
if len(events) == 2 {
if events[1].GetEventType() != enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED {
return false
}
if events[1].GetEventId() != events[0].GetEventId()+1 {
return false
}
}
return true
}
// clientSupportsTranOrSpecEvents detects if client supports transient events
// Default to include transient events for clients, only CLI and UI are
// explicitly excluded for backward compatability
func clientSupportsTranOrSpecEvents(ctx context.Context) bool {
clientName, _ := headers.GetClientNameAndVersion(ctx)
switch clientName {
case headers.ClientNameCLI, headers.ClientNameUI:
return false
default:
return true
}
}
// ValidateTransientWorkflowTaskEvents validates that transient workflow task events have sequential event IDs
// starting from the given offset. Returns an error if any event ID doesn't match the expected sequence.
func ValidateTransientWorkflowTaskEvents(
func validateTransientWorkflowTaskEvents(
eventIDOffset int64,
transientWorkflowTaskInfo *historyspb.TransientWorkflowTaskInfo,
) error {
@@ -1,336 +0,0 @@
package api
import (
"context"
"testing"
"github.com/stretchr/testify/require"
enumspb "go.temporal.io/api/enums/v1"
historypb "go.temporal.io/api/history/v1"
historyspb "go.temporal.io/server/api/history/v1"
"go.temporal.io/server/common/headers"
)
func TestShouldIncludeTransientOrSpeculativeTasks(t *testing.T) {
t.Parallel()
tests := []struct {
name string
clientName string
historySuffix []*historypb.HistoryEvent
isWorkflowRunning bool
expected bool
}{
{
name: "all conditions met",
clientName: headers.ClientNameGoSDK,
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
},
isWorkflowRunning: true,
expected: true,
},
{
name: "empty history suffix",
clientName: headers.ClientNameGoSDK,
historySuffix: []*historypb.HistoryEvent{},
isWorkflowRunning: true,
expected: false,
},
{
name: "nil history suffix",
clientName: headers.ClientNameGoSDK,
historySuffix: nil,
isWorkflowRunning: true,
expected: false,
},
{
name: "CLI client",
clientName: headers.ClientNameCLI,
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
},
isWorkflowRunning: true,
expected: false,
},
{
name: "UI client",
clientName: headers.ClientNameUI,
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
},
isWorkflowRunning: true,
expected: false,
},
{
name: "workflow not running",
clientName: headers.ClientNameGoSDK,
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
},
isWorkflowRunning: false,
expected: false,
},
{
name: "invalid events - first event not scheduled",
clientName: headers.ClientNameGoSDK,
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_EXECUTION_STARTED,
},
},
isWorkflowRunning: true,
expected: false,
},
{
name: "two valid events",
clientName: headers.ClientNameGoSDK,
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 11,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
},
isWorkflowRunning: true,
expected: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
r := require.New(t)
ctx := headers.SetVersionsForTests(context.Background(), "1.0.0", tt.clientName, "", "")
tranOrSpecEvents := &historyspb.TransientWorkflowTaskInfo{
HistorySuffix: tt.historySuffix,
}
result := shouldIncludeTransientOrSpeculativeTasks(ctx, tranOrSpecEvents, tt.isWorkflowRunning)
r.Equal(tt.expected, result)
})
}
}
func TestClientSupportsTranOrSpecTasks(t *testing.T) {
t.Parallel()
tests := []struct {
name string
clientName string
expected bool
}{
{
name: "CLI client returns false",
clientName: headers.ClientNameCLI,
expected: false,
},
{
name: "UI client returns false",
clientName: headers.ClientNameUI,
expected: false,
},
{
name: "Go SDK returns true",
clientName: headers.ClientNameGoSDK,
expected: true,
},
{
name: "Java SDK returns true",
clientName: headers.ClientNameJavaSDK,
expected: true,
},
{
name: "TypeScript SDK returns true",
clientName: headers.ClientNameTypeScriptSDK,
expected: true,
},
{
name: "Python SDK returns true",
clientName: headers.ClientNamePythonSDK,
expected: true,
},
{
name: "PHP SDK returns true",
clientName: headers.ClientNamePHPSDK,
expected: true,
},
{
name: "no client name returns true",
clientName: "",
expected: true,
},
{
name: "unknown client returns true",
clientName: "unknown-client",
expected: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
r := require.New(t)
ctx := headers.SetVersionsForTests(context.Background(), "1.0.0", tt.clientName, "", "")
result := clientSupportsTranOrSpecEvents(ctx)
r.Equal(tt.expected, result)
})
}
// Test empty context without any headers set
t.Run("empty context without headers returns true", func(t *testing.T) {
t.Parallel()
r := require.New(t)
ctx := context.Background()
result := clientSupportsTranOrSpecEvents(ctx)
r.True(result)
})
}
func TestAreValidTransientOrSpecTasks(t *testing.T) {
t.Parallel()
tests := []struct {
name string
historySuffix []*historypb.HistoryEvent
expected bool
}{
{
name: "single scheduled event",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
},
expected: true,
},
{
name: "two events with consecutive IDs",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 11,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
},
expected: true,
},
{
name: "empty events",
historySuffix: []*historypb.HistoryEvent{},
expected: false,
},
{
name: "nil events",
historySuffix: nil,
expected: false,
},
{
name: "more than two events",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 11,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
{
EventId: 12,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED,
},
},
expected: false,
},
{
name: "first event not scheduled",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
},
expected: false,
},
{
name: "second event not started",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 11,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_COMPLETED,
},
},
expected: false,
},
{
name: "non-consecutive event IDs",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 12,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
},
expected: false,
},
{
name: "same event IDs",
historySuffix: []*historypb.HistoryEvent{
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 10,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
},
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
r := require.New(t)
tranOrSpecEvents := &historyspb.TransientWorkflowTaskInfo{
HistorySuffix: tt.historySuffix,
}
result := areValidTransientOrSpecEvents(tranOrSpecEvents)
r.Equal(tt.expected, result)
})
}
}
-10
View File
@@ -9,7 +9,6 @@ import (
enumspb "go.temporal.io/api/enums/v1"
"go.temporal.io/api/serviceerror"
taskqueuepb "go.temporal.io/api/taskqueue/v1"
historyspb "go.temporal.io/server/api/history/v1"
"go.temporal.io/server/api/historyservice/v1"
persistencespb "go.temporal.io/server/api/persistence/v1"
"go.temporal.io/server/common"
@@ -374,14 +373,6 @@ func MutableStateToGetResponse(
}
}
// Get transient/speculative workflow task events if present
var transientOrSpeculativeTasks *historyspb.TransientWorkflowTaskInfo
if workflowTask := mutableState.GetPendingWorkflowTask(); workflowTask != nil {
transientOrSpeculativeTasks = mutableState.GetTransientWorkflowTaskInfo(workflowTask, "")
} else if workflowTask := mutableState.GetStartedWorkflowTask(); workflowTask != nil {
transientOrSpeculativeTasks = mutableState.GetTransientWorkflowTaskInfo(workflowTask, "")
}
return &historyservice.GetMutableStateResponse{
Execution: &commonpb.WorkflowExecution{
WorkflowId: mutableState.GetExecutionInfo().WorkflowId,
@@ -415,6 +406,5 @@ func MutableStateToGetResponse(
MostRecentWorkerVersionStamp: mostRecentWorkerVersionStamp,
TransitionHistory: transitionhistory.CopyVersionedTransitions(mutableState.GetExecutionInfo().TransitionHistory),
VersioningInfo: mutableState.GetExecutionInfo().VersioningInfo,
TransientOrSpeculativeTasks: transientOrSpeculativeTasks,
}, nil
}
@@ -29,94 +29,6 @@ import (
historyi "go.temporal.io/server/service/history/interfaces"
)
// appendTransientEvents queries mutable state for transient/speculative events and appends them to the response.
// This function attempts to use cached transient tasks from the initial mutable state call to avoid a second call.
// If cached tasks are nil or stale (validation fails), it falls back to querying mutable state.
// Validation of event IDs is handled by validateTransientWorkflowTaskEvents.
func appendTransientTasks(
ctx context.Context,
shardContext historyi.ShardContext,
workflowConsistencyChecker api.WorkflowConsistencyChecker,
eventNotifier events.Notifier,
namespaceID namespace.ID,
execution *commonpb.WorkflowExecution,
useRawHistory bool,
history *historypb.History,
historyBlob *[]*commonpb.DataBlob,
cachedTransientTasks *historyspb.TransientWorkflowTaskInfo,
nextEventID int64,
) {
// CLI and UI clients should not receive transient events for backward compatibility
// Check this FIRST before doing any work
clientName, _ := headers.GetClientNameAndVersion(ctx)
if clientName == headers.ClientNameCLI || clientName == headers.ClientNameUI {
return
}
var transientWorkflowTask *historyspb.TransientWorkflowTaskInfo
// Try cached tasks first
if cachedTransientTasks != nil {
// Validate cached tasks are still valid (not stale)
if err := api.ValidateTransientWorkflowTaskEvents(nextEventID, cachedTransientTasks); err == nil {
// Cache is valid, use it (FAST PATH - no second mutable state call)
transientWorkflowTask = cachedTransientTasks
} else {
// Cache is stale, log and fall through to refetch
shardContext.GetLogger().Warn("Cached transient tasks are stale, refetching",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err))
}
}
// Fallback: If no cache or cache is stale, make the query
if transientWorkflowTask == nil {
msResp, err := api.GetOrPollWorkflowMutableState(
ctx,
shardContext,
&historyservice.GetMutableStateRequest{
NamespaceId: namespaceID.String(),
Execution: execution,
},
workflowConsistencyChecker,
eventNotifier,
)
if err != nil || msResp.GetTransientOrSpeculativeTasks() == nil {
// Transient events don't exist or are already committed - this is OK
// Just return without appending (events are in persisted history)
if err != nil {
shardContext.GetLogger().Warn("Failed to refetch transient events",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err))
}
return
}
transientWorkflowTask = msResp.GetTransientOrSpeculativeTasks()
}
// Manually append transient events to the response
if useRawHistory {
transientEventsBlob, err := shardContext.GetPayloadSerializer().SerializeEvents(transientWorkflowTask.GetHistorySuffix())
if err == nil {
*historyBlob = append(*historyBlob, transientEventsBlob)
} else {
softassert.Fail(shardContext.GetLogger(), "GetWorkflowExecutionHistory could not serialize transient workflow tasks")
shardContext.GetLogger().Error("Failed to serialize transient workflow tasks",
tag.WorkflowNamespaceID(namespaceID.String()),
tag.WorkflowID(execution.GetWorkflowId()),
tag.WorkflowRunID(execution.GetRunId()),
tag.Error(err),
)
}
} else {
history.Events = append(history.Events, transientWorkflowTask.GetHistorySuffix()...)
}
}
func Invoke(
ctx context.Context,
shardContext historyi.ShardContext,
@@ -135,24 +47,22 @@ func Invoke(
isCloseEventOnly := request.Request.GetHistoryEventFilterType() == enumspb.HISTORY_EVENT_FILTER_TYPE_CLOSE_EVENT
queryMutableState := func(
// this function returns the following 7 things,
// 1. the current branch token (to use to retrieve history events)
// 2. the workflow run ID
// 3. the last first event ID (the event ID of the last batch of events in the history)
// 4. the last first event transaction id
// 5. the next event ID
// 6. whether the workflow is running
// 7. error if any
queryHistory := func(
namespaceUUID namespace.ID,
execution *commonpb.WorkflowExecution,
expectedNextEventID int64,
currentBranchToken []byte,
versionHistoryItem *historyspb.VersionHistoryItem,
versionedTransition *persistencespb.VersionedTransition,
) (
[]byte, // current branch token (to use to retrieve history events)
string, // workflow run ID
int64, // last first event ID (the event ID of the last batch of events in the history)
int64, // last first event transaction id
bool, // whether the workflow is running
*historyspb.VersionHistoryItem, // version history item for the current branch
*persistencespb.VersionedTransition, // last versioned transition
*historyspb.TransientWorkflowTaskInfo, // transient workflow task info
error, // error if any
) {
) ([]byte, string, int64, int64, bool, *historyspb.VersionHistoryItem, *persistencespb.VersionedTransition, error) {
response, err := api.GetOrPollWorkflowMutableState(
ctx,
shardContext,
@@ -193,17 +103,17 @@ func Invoke(
)
}
if err != nil {
return nil, "", 0, 0, false, nil, nil, nil, err
return nil, "", 0, 0, false, nil, nil, err
}
isWorkflowRunning := response.GetWorkflowStatus() == enumspb.WORKFLOW_EXECUTION_STATUS_RUNNING
currentVersionHistory, err := versionhistory.GetCurrentVersionHistory(response.GetVersionHistories())
if err != nil {
return nil, "", 0, 0, false, nil, nil, nil, err
return nil, "", 0, 0, false, nil, nil, err
}
lastVersionHistoryItem, err := versionhistory.GetLastVersionHistoryItem(currentVersionHistory)
if err != nil {
return nil, "", 0, 0, false, nil, nil, nil, err
return nil, "", 0, 0, false, nil, nil, err
}
lastVersionedTransition := transitionhistory.LastVersionedTransition(response.GetTransitionHistory())
@@ -214,7 +124,6 @@ func Invoke(
isWorkflowRunning,
lastVersionHistoryItem,
lastVersionedTransition,
response.GetTransientOrSpeculativeTasks(),
nil
}
@@ -226,7 +135,6 @@ func Invoke(
lastFirstEventID := common.FirstEventID
var nextEventID int64
var isWorkflowRunning bool
var cachedTransientTasks *historyspb.TransientWorkflowTaskInfo
// process the token for paging
queryNextEventID := common.EndEventID
@@ -241,16 +149,13 @@ func Invoke(
execution.RunId = continuationToken.GetRunId()
// Set isWorkflowRunning from continuation token for pagination
isWorkflowRunning = continuationToken.IsWorkflowRunning
// we need to update the current next event ID and whether workflow is running
if len(continuationToken.PersistenceToken) == 0 && isLongPoll && continuationToken.IsWorkflowRunning {
if !isCloseEventOnly {
queryNextEventID = continuationToken.GetNextEventId()
}
continuationToken.BranchToken, _, lastFirstEventID, nextEventID, isWorkflowRunning, continuationToken.VersionHistoryItem, continuationToken.VersionedTransition, cachedTransientTasks, err =
queryMutableState(namespaceID, execution, queryNextEventID, continuationToken.BranchToken, continuationToken.VersionHistoryItem, continuationToken.VersionedTransition)
continuationToken.BranchToken, _, lastFirstEventID, nextEventID, isWorkflowRunning, continuationToken.VersionHistoryItem, continuationToken.VersionedTransition, err =
queryHistory(namespaceID, execution, queryNextEventID, continuationToken.BranchToken, continuationToken.VersionHistoryItem, continuationToken.VersionedTransition)
if err != nil {
return nil, err
}
@@ -263,8 +168,8 @@ func Invoke(
if !isCloseEventOnly {
queryNextEventID = common.FirstEventID
}
continuationToken.BranchToken, runID, lastFirstEventID, nextEventID, isWorkflowRunning, continuationToken.VersionHistoryItem, continuationToken.VersionedTransition, cachedTransientTasks, err =
queryMutableState(namespaceID, execution, queryNextEventID, nil, nil, nil)
continuationToken.BranchToken, runID, lastFirstEventID, nextEventID, isWorkflowRunning, continuationToken.VersionHistoryItem, continuationToken.VersionedTransition, err =
queryHistory(namespaceID, execution, queryNextEventID, nil, nil, nil)
if err != nil {
return nil, err
}
@@ -315,9 +220,8 @@ func Invoke(
nextEventID,
request.Request.GetMaximumPageSize(),
nil,
nil,
continuationToken.TransientWorkflowTask,
continuationToken.BranchToken,
continuationToken.IsWorkflowRunning,
)
if err != nil {
return nil, err
@@ -335,10 +239,9 @@ func Invoke(
nextEventID,
request.Request.GetMaximumPageSize(),
nil,
nil,
continuationToken.TransientWorkflowTask,
continuationToken.BranchToken,
persistenceVisibilityMgr,
continuationToken.IsWorkflowRunning,
)
if err != nil {
return nil, err
@@ -396,9 +299,8 @@ func Invoke(
continuationToken.NextEventId,
request.Request.GetMaximumPageSize(),
continuationToken.PersistenceToken,
nil,
continuationToken.TransientWorkflowTask,
continuationToken.BranchToken,
continuationToken.IsWorkflowRunning,
)
} else {
history, continuationToken.PersistenceToken, err = api.GetHistory(
@@ -411,10 +313,9 @@ func Invoke(
continuationToken.NextEventId,
request.Request.GetMaximumPageSize(),
continuationToken.PersistenceToken,
nil,
continuationToken.TransientWorkflowTask,
continuationToken.BranchToken,
persistenceVisibilityMgr,
continuationToken.IsWorkflowRunning,
)
}
@@ -422,23 +323,6 @@ func Invoke(
return nil, err
}
// Query and append transient/speculative tasks if on last page
if isWorkflowRunning && len(continuationToken.PersistenceToken) == 0 {
appendTransientTasks(
ctx,
shardContext,
workflowConsistencyChecker,
eventNotifier,
namespaceID,
execution,
sendRawWorkflowHistoryForNamespace || sendRawHistoryBetweenInternalServices,
history,
&historyBlob,
cachedTransientTasks,
continuationToken.NextEventId,
)
}
// here, for long pull on history events, we need to intercept the paging token from cassandra
// and do something clever
if len(continuationToken.PersistenceToken) == 0 && (!continuationToken.IsWorkflowRunning || !isLongPoll) {
@@ -473,7 +357,6 @@ func Invoke(
}
historyBlob = nil
}
return &historyservice.GetWorkflowExecutionHistoryResponseWithRaw{
Response: &workflowservice.GetWorkflowExecutionHistoryResponse{
History: history,
@@ -299,7 +299,6 @@ func setHistoryForRecordWfTaskStartedResp(
var persistenceToken []byte
var history *historypb.History
var err error
if isInternalRawHistoryEnabled {
rawHistory, persistenceToken, err = api.GetRawHistory(
ctx,
@@ -313,7 +312,6 @@ func setHistoryForRecordWfTaskStartedResp(
nil,
response.GetTransientWorkflowTask(),
response.GetBranchToken(),
true,
)
} else {
history, persistenceToken, err = api.GetHistory(
@@ -329,7 +327,6 @@ func setHistoryForRecordWfTaskStartedResp(
response.GetTransientWorkflowTask(),
response.GetBranchToken(),
persistenceVisibilityMgr,
true,
)
}
if err != nil {
@@ -339,11 +336,12 @@ func setHistoryForRecordWfTaskStartedResp(
var continuation []byte
if len(persistenceToken) != 0 {
continuation, err = api.SerializeHistoryToken(&tokenspb.HistoryContinuation{
RunId: workflowKey.GetRunID(),
FirstEventId: firstEventID,
NextEventId: nextEventID,
PersistenceToken: persistenceToken,
BranchToken: response.GetBranchToken(),
RunId: workflowKey.GetRunID(),
FirstEventId: firstEventID,
NextEventId: nextEventID,
PersistenceToken: persistenceToken,
TransientWorkflowTask: response.GetTransientWorkflowTask(),
BranchToken: response.GetBranchToken(),
})
if err != nil {
return err
@@ -839,11 +839,6 @@ func (handler *WorkflowTaskCompletedHandler) createPollWorkflowTaskQueueResponse
)
}
}()
// Note: We pass nil for transientWorkflowTaskInfo here because the current task's
// scheduled/started events should not be visible in the history returned to that task.
// Transient events are only included in GetWorkflowExecutionHistory API responses,
// not in PollWorkflowTask responses. Including them here would show the worker its own
// task events, which is incorrect (see issue #7741).
history, persistenceToken, err = api.GetHistory(
ctx,
handler.shardContext,
@@ -854,10 +849,9 @@ func (handler *WorkflowTaskCompletedHandler) createPollWorkflowTaskQueueResponse
nextEventID,
maximumPageSize,
nil,
nil,
matchingResp.GetTransientWorkflowTask(),
branchToken,
handler.persistenceVisibilityMgr,
true,
)
if err != nil {
return nil, err
@@ -865,11 +859,12 @@ func (handler *WorkflowTaskCompletedHandler) createPollWorkflowTaskQueueResponse
if len(persistenceToken) != 0 {
continuation, err = api.SerializeHistoryToken(&tokenspb.HistoryContinuation{
RunId: matchingResp.WorkflowExecution.GetRunId(),
FirstEventId: firstEventID,
NextEventId: nextEventID,
PersistenceToken: persistenceToken,
BranchToken: branchToken,
RunId: matchingResp.WorkflowExecution.GetRunId(),
FirstEventId: firstEventID,
NextEventId: nextEventID,
PersistenceToken: persistenceToken,
TransientWorkflowTask: matchingResp.GetTransientWorkflowTask(),
BranchToken: branchToken,
})
if err != nil {
return nil, err
+17 -41
View File
@@ -5611,7 +5611,6 @@ func (s *engineSuite) TestGetHistory() {
nil,
branchToken,
s.mockVisibilityMgr,
false, // isWorkflowRunning
)
s.NoError(err)
s.NotNil(history)
@@ -5856,12 +5855,23 @@ func (s *engineSuite) TestGetWorkflowExecutionHistory_RawHistoryWithTransientDec
branchToken := []byte{1, 2, 3}
persistenceToken := []byte("some random persistence token")
nextPageToken, err := api.SerializeHistoryToken(&tokenspb.HistoryContinuation{
RunId: we.GetRunId(),
FirstEventId: common.FirstEventID,
NextEventId: 5,
PersistenceToken: persistenceToken,
BranchToken: branchToken,
IsWorkflowRunning: true, // Workflow is running, so we'll query MS for transient events
RunId: we.GetRunId(),
FirstEventId: common.FirstEventID,
NextEventId: 5,
PersistenceToken: persistenceToken,
TransientWorkflowTask: &historyspb.TransientWorkflowTaskInfo{
HistorySuffix: []*historypb.HistoryEvent{
{
EventId: 5,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED,
},
{
EventId: 6,
EventType: enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED,
},
},
},
BranchToken: branchToken,
})
s.NoError(err)
s.config.SendRawWorkflowHistory = func(string) bool { return true }
@@ -5878,40 +5888,6 @@ func (s *engineSuite) TestGetWorkflowExecutionHistory_RawHistoryWithTransientDec
}
s.mockNamespaceCache.EXPECT().GetNamespaceID(tests.Namespace).Return(tests.NamespaceID, nil).AnyTimes()
// Mock GetMutableState to return transient workflow task events
s.mockExecutionMgr.EXPECT().GetWorkflowExecution(gomock.Any(), gomock.Any()).Return(&persistence.GetWorkflowExecutionResponse{
State: &persistencespb.WorkflowMutableState{
ExecutionState: &persistencespb.WorkflowExecutionState{
State: enumsspb.WORKFLOW_EXECUTION_STATE_RUNNING,
Status: enumspb.WORKFLOW_EXECUTION_STATUS_RUNNING,
RunId: we.RunId,
},
NextEventId: 5,
ExecutionInfo: &persistencespb.WorkflowExecutionInfo{
NamespaceId: tests.NamespaceID.String(),
WorkflowId: we.WorkflowId,
WorkflowTaskScheduledEventId: 5,
WorkflowTaskStartedEventId: 6,
WorkflowTaskAttempt: 2, // Attempt > 1 makes it transient
TaskQueue: "test-task-queue",
WorkflowTypeName: "test-workflow-type",
VersionHistories: &historyspb.VersionHistories{
CurrentVersionHistoryIndex: 0,
Histories: []*historyspb.VersionHistory{
{
BranchToken: branchToken,
Items: []*historyspb.VersionHistoryItem{
{EventId: 4, Version: 0},
},
},
},
},
},
},
MutableStateStats: persistence.MutableStateStatistics{},
}, nil).Times(1)
historyBlob1, err := s.mockShard.GetPayloadSerializer().SerializeEvents(
[]*historypb.HistoryEvent{
{
@@ -1159,7 +1159,7 @@ func (m *workflowTaskStateMachine) GetTransientWorkflowTaskInfo(
identity string,
) *historyspb.TransientWorkflowTaskInfo {
// Create scheduled event which is not written to the history yet.
// Create scheduled and started events which are not written to the history yet.
scheduledEvent := &historypb.HistoryEvent{
EventId: workflowTask.ScheduledEventID,
EventTime: timestamppb.New(workflowTask.ScheduledTime),
@@ -1174,15 +1174,6 @@ func (m *workflowTaskStateMachine) GetTransientWorkflowTaskInfo(
},
}
// Check if WFT is started
if workflowTask.StartedEventID == common.EmptyEventID {
// WFT only scheduled, not started yet
return &historyspb.TransientWorkflowTaskInfo{
HistorySuffix: []*historypb.HistoryEvent{scheduledEvent},
}
}
// WFT both scheduled and started
var versioningStamp *commonpb.WorkerVersionStamp
if workflowTask.BuildId != "" {
// fill out the stamp value of the transient WFT based on MS data
+2 -4
View File
@@ -1643,16 +1643,14 @@ func (s *AdvancedVisibilitySuite) TestUpsertWorkflowExecution_InvalidKey() {
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed {"Cause":23,"Failure":{"Message":"BadSearchAttributes: search attribute INVALIDKEY is not defined"}}
5 WorkflowTaskScheduled`, historyEvents)
4 WorkflowTaskFailed {"Cause":23,"Failure":{"Message":"BadSearchAttributes: search attribute INVALIDKEY is not defined"}}`, historyEvents)
} else {
s.ErrorContains(err, fmt.Sprintf("BadSearchAttributes: Namespace %s has no mapping defined for search attribute INVALIDKEY", s.Namespace().String()))
s.EqualHistoryEvents(fmt.Sprintf(`
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed {"Cause":23,"Failure":{"Message":"BadSearchAttributes: Namespace %s has no mapping defined for search attribute INVALIDKEY"}}
5 WorkflowTaskScheduled`, s.Namespace().String()), historyEvents)
4 WorkflowTaskFailed {"Cause":23,"Failure":{"Message":"BadSearchAttributes: Namespace %s has no mapping defined for search attribute INVALIDKEY"}}`, s.Namespace().String()), historyEvents)
}
}
+1 -2
View File
@@ -616,8 +616,7 @@ func (s *CancelWorkflowSuite) TestImmediateChildCancellation_WorkflowTaskFailed(
2 WorkflowTaskScheduled
3 WorkflowExecutionCancelRequested
4 WorkflowTaskStarted
5 WorkflowTaskFailed
6 WorkflowTaskScheduled`, s.GetHistory(s.Namespace().String(), &commonpb.WorkflowExecution{
5 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), &commonpb.WorkflowExecution{
WorkflowId: id,
}))
+4 -8
View File
@@ -96,9 +96,9 @@ func (s *ClientMiscTestSuite) TestTooManyChildWorkflows() {
s.NoError(err)
s.WaitForHistoryEventsSuffix(`
WorkflowTaskFailed {"Cause":26,"Failure":{"Message":"PendingChildWorkflowsLimitExceeded: the number of pending child workflow executions, 10, has reached the per-workflow limit of 10"}}
WorkflowTaskScheduled
WorkflowTaskStarted
WorkflowTaskStarted // 26 below is enumspb.WORKFLOW_TASK_FAILED_CAUSE_PENDING_CHILD_WORKFLOWS_LIMIT_EXCEEDED
WorkflowTaskFailed {"Cause":26,"Failure":{"Message":"PendingChildWorkflowsLimitExceeded: the number of pending child workflow executions, 10, has reached the per-workflow limit of 10"}}
`, func() []*historypb.HistoryEvent {
return s.GetHistory(s.Namespace().String(), &commonpb.WorkflowExecution{WorkflowId: parentWorkflowID})
}, 10*time.Second, 500*time.Millisecond)
@@ -180,9 +180,9 @@ func (s *ClientMiscTestSuite) TestTooManyPendingActivities() {
// verify that the workflow's history contains a task that failed because it would otherwise exceed the pending
// child workflow limit
s.WaitForHistoryEventsSuffix(`
19 WorkflowTaskScheduled
20 WorkflowTaskStarted // 27 below is enumspb.WORKFLOW_TASK_FAILED_CAUSE_PENDING_ACTIVITIES_LIMIT_EXCEEDED
21 WorkflowTaskFailed {"Cause":27,"Failure":{"Message":"PendingActivitiesLimitExceeded: the number of pending activities, 10, has reached the per-workflow limit of 10"}}
22 WorkflowTaskScheduled
23 WorkflowTaskStarted
`, func() []*historypb.HistoryEvent {
return s.GetHistory(s.Namespace().String(), &commonpb.WorkflowExecution{WorkflowId: workflowRun.GetID(), RunId: workflowRun.GetRunID()})
}, 3*time.Second, 500*time.Millisecond)
@@ -243,8 +243,6 @@ func (s *ClientMiscTestSuite) TestTooManyCancelRequests() {
2 WorkflowTaskScheduled
3 WorkflowTaskStarted // 29 below is enumspb.WORKFLOW_TASK_FAILED_CAUSE_PENDING_REQUEST_CANCEL_LIMIT_EXCEEDED
4 WorkflowTaskFailed {"Cause":29,"Failure":{"Message":"PendingRequestCancelLimitExceeded: the number of pending requests to cancel external workflows, 10, has reached the per-workflow limit of 10"}}
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
`, func() []*historypb.HistoryEvent {
return s.GetHistory(s.Namespace().String(), &commonpb.WorkflowExecution{WorkflowId: run.GetID(), RunId: run.GetRunID()})
}, 5*time.Second, 500*time.Millisecond)
@@ -333,8 +331,6 @@ func (s *ClientMiscTestSuite) TestTooManyPendingSignals() {
2 WorkflowTaskScheduled
3 WorkflowTaskStarted // 28 below is enumspb.WORKFLOW_TASK_FAILED_CAUSE_PENDING_SIGNALS_LIMIT_EXCEEDED
4 WorkflowTaskFailed {"Cause":28,"Failure":{"Message":"PendingSignalsLimitExceeded: the number of pending signals to external workflows, 10, has reached the per-workflow limit of 10"}}
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
`, func() []*historypb.HistoryEvent {
return s.GetHistory(s.Namespace().String(), &commonpb.WorkflowExecution{WorkflowId: senderRun.GetID(), RunId: senderRun.GetRunID()})
}, 3*time.Second, 500*time.Millisecond)
+2 -3
View File
@@ -97,7 +97,7 @@ func (s *RelayTaskTestSuite) TestRelayWorkflowTaskTimeout() {
workflowTaskTimeout := false
for i := 0; i < 3; i++ {
events := s.GetHistory(s.Namespace().String(), workflowExecution)
if len(events) >= 8 {
if len(events) == 8 {
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
@@ -106,8 +106,7 @@ func (s *RelayTaskTestSuite) TestRelayWorkflowTaskTimeout() {
5 MarkerRecorded
6 WorkflowTaskScheduled
7 WorkflowTaskStarted
8 WorkflowTaskTimedOut {"ScheduledEventId":6,"StartedEventId":7,"TimeoutType":1} // TIMEOUT_TYPE_START_TO_CLOSE
9 WorkflowTaskScheduled`, events)
8 WorkflowTaskTimedOut {"ScheduledEventId":6,"StartedEventId":7,"TimeoutType":1} // TIMEOUT_TYPE_START_TO_CLOSE`, events)
workflowTaskTimeout = true
break
}
+2 -4
View File
@@ -193,8 +193,7 @@ WaitForStickyTimeoutLoop:
12 WorkflowExecutionSignaled
13 WorkflowTaskScheduled
14 WorkflowTaskStarted
15 WorkflowTaskFailed
16 WorkflowTaskScheduled`, events)
15 WorkflowTaskFailed`, events)
// Complete workflow execution
_, err = poller.PollAndProcessWorkflowTask(testcore.WithDumpHistory, testcore.WithRespondSticky, testcore.WithExpectedAttemptCount(3))
@@ -382,8 +381,7 @@ WaitForStickyTimeoutLoop:
12 WorkflowExecutionSignaled
13 WorkflowTaskScheduled
14 WorkflowTaskStarted
15 WorkflowTaskFailed
16 WorkflowTaskScheduled`, events)
15 WorkflowTaskFailed`, events)
// Complete workflow execution
_, err = poller.PollAndProcessWorkflowTask(testcore.WithDumpHistory, testcore.WithRespondSticky, testcore.WithExpectedAttemptCount(3))
+16 -13
View File
@@ -567,8 +567,10 @@ func TestWorkflowUpdateSuite(t *testing.T) {
return nil, nil
case 2:
s.EqualHistory(`
4 WorkflowTaskCompleted`, task.History)
// Message handled rejects update.
4 WorkflowTaskCompleted
5 WorkflowTaskScheduled // Speculative WT2 which was created while completing WT1.
6 WorkflowTaskStarted`, task.History)
// Message handler rejects update.
return nil, nil
case 3:
s.EqualHistory(`
@@ -689,8 +691,10 @@ func TestWorkflowUpdateSuite(t *testing.T) {
case 2:
s.EqualHistory(`
4 WorkflowTaskCompleted
5 ActivityTaskScheduled`, task.History)
// Message handled rejects update.
5 ActivityTaskScheduled
6 WorkflowTaskScheduled // Speculative WFT2 with event (5) which was created while completing WFT1.
7 WorkflowTaskStarted`, task.History)
// Message handler rejects update.
return nil, nil
case 3:
s.EqualHistory(`
@@ -2196,7 +2200,7 @@ func TestWorkflowUpdateSuite(t *testing.T) {
s.ErrorAs(updateResult.err, &wfNotReady)
s.Contains(updateResult.err.Error(), "Unable to perform workflow execution update due to unexpected workflow task failure.")
// New transient WFT is created and is now included in the history.
// New transient WFT is created, but it is not shown in the history.
events := s.GetHistory(s.Namespace().String(), s.Tv().WorkflowExecution())
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
@@ -2205,8 +2209,7 @@ func TestWorkflowUpdateSuite(t *testing.T) {
4 WorkflowTaskCompleted
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
7 WorkflowTaskFailed
8 WorkflowTaskScheduled`, events)
7 WorkflowTaskFailed`, events)
// Send Update again. It will be delivered on existing transient WFT.
updateResultCh = sendUpdate(timeoutCtx, s, s.Tv())
@@ -2240,7 +2243,7 @@ func TestWorkflowUpdateSuite(t *testing.T) {
s.True(common.IsContextDeadlineExceededErr(updateResult.err), "UpdateWorkflowExecution must timeout after 2 seconds")
s.Nil(updateResult.response)
// This WFT failure wasn't recorded because WFT was transient, but the scheduled event is included.
// This WFT failure wasn't recorded because WFT was transient.
events = s.GetHistory(s.Namespace().String(), s.Tv().WorkflowExecution())
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
@@ -2249,8 +2252,7 @@ func TestWorkflowUpdateSuite(t *testing.T) {
4 WorkflowTaskCompleted
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
7 WorkflowTaskFailed
8 WorkflowTaskScheduled`, events)
7 WorkflowTaskFailed`, events)
// Try to accept 2nd update in workflow 2nd time: get error. Poller will fail WT. Update is not aborted.
_, err = s.TaskPoller().PollAndHandleWorkflowTask(s.Tv(),
@@ -2275,8 +2277,7 @@ func TestWorkflowUpdateSuite(t *testing.T) {
4 WorkflowTaskCompleted
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
7 WorkflowTaskFailed
8 WorkflowTaskScheduled`, events)
7 WorkflowTaskFailed`, events)
// Complete Update and workflow.
_, err = s.TaskPoller().PollAndHandleWorkflowTask(s.Tv(),
@@ -4431,7 +4432,9 @@ func TestWorkflowUpdateSuite(t *testing.T) {
return nil, nil
case 3:
s.EqualHistory(`
4 WorkflowTaskCompleted`, task.History)
4 WorkflowTaskCompleted // Speculative WT was dropped and history starts from 4 again.
5 WorkflowTaskScheduled
6 WorkflowTaskStarted`, task.History)
commands := append(s.UpdateAcceptCompleteCommands(tv2),
&commandpb.Command{
CommandType: enumspb.COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
+11 -26
View File
@@ -871,14 +871,13 @@ func (s *Versioning3Suite) TestUnpinnedWorkflow_SuccessfulUpdate_TransitionsToNe
6 WorkflowTaskStarted
`, task.History)
// Verify that events from the speculative task are *not* written to the workflow history before being processed by the poller
events := s.GetHistory(s.Namespace().String(), execution)
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskCompleted
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
`, events)
// VersioningInfo should not have changed before the update has been processed by the poller.
@@ -958,14 +957,13 @@ func (s *Versioning3Suite) TestUnpinnedWorkflow_FailedUpdate_DoesNotTransitionTo
6 WorkflowTaskStarted
`, task.History)
// Verify that events from the speculative task are *not* written to the workflow history before being processed by the poller
events := s.GetHistory(s.Namespace().String(), execution)
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskCompleted
5 WorkflowTaskScheduled
6 WorkflowTaskStarted
`, events)
// VersioningInfo should not have changed before the update has been processed by the poller.
@@ -2447,7 +2445,8 @@ func (s *Versioning3Suite) testPinnedCaNUpgradeOnCaN(normalTask, speculativeTask
s.verifySpeculativeTask(execution)
} else if transientTask {
s.verifyTransientTask(task)
// Get events from server-side history, this includes transient events.
// Get events from server-side history instead of task.History.Events, because task.History.Events has an
// extra started event with the CaN suggestion in the transient task case
historyEvents = s.GetHistory(s.Namespace().String(), execution)
}
@@ -2458,31 +2457,18 @@ func (s *Versioning3Suite) testPinnedCaNUpgradeOnCaN(normalTask, speculativeTask
}
}
if enableSendTargetVersionChanged {
// Verify TargetWorkerDeploymentVersionChanged was sent on WFT started events after deployment change.
// Events BEFORE deployment change (events 3, 7) should NOT have the flag.
// Events AFTER deployment change (all subsequent WFTs) SHOULD have the flag, regardless of success/failure.
// The flag is recomputed on every WFT, so both failed attempts and retries will have it if conditions persist.
s.Greater(len(wfTaskStartedEvents), 2) // make sure there are at least 3 WFT started events
// In this test, deployment is changed after event 7 (`s.setCurrentDeployment(tv2)`).
// So the first 2 WFT started events should NOT have the flag,
// and all subsequent events SHOULD have the flag.
eventsBeforeDeploymentChange := 2 // Events 3 and 7
// Verify ContinueAsNewSuggested and reasons were sent on the last WFT started event (but not the earlier ones).
s.Greater(len(wfTaskStartedEvents), 2) // make sure there are at least 2 WFT started events
for i, event := range wfTaskStartedEvents {
attr := event.GetWorkflowTaskStartedEventAttributes()
if i < eventsBeforeDeploymentChange {
// Events before deployment change should NOT have the flag
if i == len(wfTaskStartedEvents)-1 { // last event
s.False(attr.GetSuggestContinueAsNew())
s.Require().Empty(attr.GetSuggestContinueAsNewReasons())
s.False(attr.GetTargetWorkerDeploymentVersionChanged(),
"Event %d should not have flag (before deployment change)", event.GetEventId())
} else {
// Events after deployment change SHOULD have the flag (including failed attempts and transient retries)
s.True(attr.GetTargetWorkerDeploymentVersionChanged())
} else { // earlier events
s.False(attr.GetSuggestContinueAsNew())
s.Require().Empty(attr.GetSuggestContinueAsNewReasons())
s.True(attr.GetTargetWorkerDeploymentVersionChanged(),
"Event %d should have flag (after deployment change)", event.GetEventId())
s.False(attr.GetTargetWorkerDeploymentVersionChanged())
}
}
} else {
@@ -2592,6 +2578,7 @@ func (s *Versioning3Suite) triggerTransientWFT(ctx context.Context, tv *testvars
// Verify this is a speculative task - events not yet in persisted history
func (s *Versioning3Suite) verifySpeculativeTask(execution *commonpb.WorkflowExecution) {
// use history events instead of task events because some of the task.History.Events aren't persisted yet
events := s.GetHistory(s.Namespace().String(), execution)
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
@@ -2602,8 +2589,6 @@ func (s *Versioning3Suite) verifySpeculativeTask(execution *commonpb.WorkflowExe
6 WorkflowTaskScheduled
7 WorkflowTaskStarted
8 WorkflowTaskCompleted
9 WorkflowTaskScheduled
10 WorkflowTaskStarted
`, events)
}
+1 -2
View File
@@ -378,6 +378,5 @@ func (s *WorkflowFailuresTestSuite) TestRespondWorkflowTaskCompleted_ReturnsErro
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled`, historyEvents)
4 WorkflowTaskFailed`, historyEvents)
}
+8 -21
View File
@@ -649,8 +649,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalBeforeTransientWork
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
_, err0 = s.FrontendClient().SignalWorkflowExecution(testcore.NewContext(), &workflowservice.SignalWorkflowExecutionRequest{
Namespace: s.Namespace().String(),
@@ -661,14 +660,12 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalBeforeTransientWork
RequestId: uuid.NewString(),
})
s.NoError(err0)
histAfterSignal := s.GetHistory(s.Namespace().String(), we)
s.GreaterOrEqual(len(histAfterSignal), 5, "Should have at least 5 events after signal")
s.EqualHistoryEvents(`
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowExecutionSignaled`, histAfterSignal[:5])
5 WorkflowExecutionSignaled`, s.GetHistory(s.Namespace().String(), we))
// start this transient workflow task, the attempt should be cleared and it becomes again a regular workflow task
resp1, err1 := s.FrontendClient().PollWorkflowTaskQueue(testcore.NewContext(), &workflowservice.PollWorkflowTaskQueueRequest{
@@ -772,8 +769,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalAfterTransientWorkf
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
// start workflow task to make signals into bufferedEvents
_, err1 := s.FrontendClient().PollWorkflowTaskQueue(testcore.NewContext(), &workflowservice.PollWorkflowTaskQueueRequest{
@@ -787,9 +783,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalAfterTransientWorkf
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled
6 WorkflowTaskStarted`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
// this signal should be buffered
_, err0 = s.FrontendClient().SignalWorkflowExecution(testcore.NewContext(), &workflowservice.SignalWorkflowExecutionRequest{
@@ -805,9 +799,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalAfterTransientWorkf
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled
6 WorkflowTaskStarted`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
// then terminate the workflow
_, err := s.FrontendClient().TerminateWorkflowExecution(testcore.NewContext(), &workflowservice.TerminateWorkflowExecutionRequest{
@@ -890,8 +882,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalAfterTransientWorkf
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
// start workflow task to make signals into bufferedEvents
resp1, err1 := s.FrontendClient().PollWorkflowTaskQueue(testcore.NewContext(), &workflowservice.PollWorkflowTaskQueueRequest{
@@ -905,9 +896,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalAfterTransientWorkf
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled
6 WorkflowTaskStarted`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
// this signal should be buffered
_, err0 = s.FrontendClient().SignalWorkflowExecution(testcore.NewContext(), &workflowservice.SignalWorkflowExecutionRequest{
@@ -923,9 +912,7 @@ func (s *WorkflowTaskTestSuite) TestWorkflowTerminationSignalAfterTransientWorkf
1 WorkflowExecutionStarted
2 WorkflowTaskScheduled
3 WorkflowTaskStarted
4 WorkflowTaskFailed
5 WorkflowTaskScheduled
6 WorkflowTaskStarted`, s.GetHistory(s.Namespace().String(), we))
4 WorkflowTaskFailed`, s.GetHistory(s.Namespace().String(), we))
// fail this workflow task to flush buffer
_, err2 := s.FrontendClient().RespondWorkflowTaskFailed(testcore.NewContext(), &workflowservice.RespondWorkflowTaskFailedRequest{
@@ -1,410 +0,0 @@
package tests
import (
"context"
"errors"
"testing"
"time"
"github.com/google/uuid"
"github.com/stretchr/testify/suite"
commandpb "go.temporal.io/api/command/v1"
commonpb "go.temporal.io/api/common/v1"
enumspb "go.temporal.io/api/enums/v1"
"go.temporal.io/api/serviceerror"
taskqueuepb "go.temporal.io/api/taskqueue/v1"
"go.temporal.io/api/workflowservice/v1"
"go.temporal.io/server/common/headers"
"go.temporal.io/server/common/payloads"
"go.temporal.io/server/tests/testcore"
"google.golang.org/grpc/metadata"
"google.golang.org/protobuf/types/known/durationpb"
)
type TransientWorkflowTaskHistorySuite struct {
testcore.FunctionalTestBase //nolint:forbidigo // Temporary usage until migration to testcore.NewEnv(t)
}
func TestTransientWorkflowTaskHistorySuite(t *testing.T) {
t.Parallel()
suite.Run(t, new(TransientWorkflowTaskHistorySuite))
}
// newSDKContext creates a context that identifies as a Go SDK client.
// This allows the tests to receive transient/speculative events in GetWorkflowExecutionHistory responses.
func newSDKContext() context.Context {
ctx := testcore.NewContext()
// Override the server client name with Go SDK client name.
// This ensures transient/speculative events are included in history responses.
ctx = metadata.AppendToOutgoingContext(ctx,
headers.ClientNameHeaderName, headers.ClientNameGoSDK,
)
return ctx
}
// TestGetHistoryAfterCacheEviction_TransientWFT is the core regression test.
// It replicates the scenario where a worker's cache is evicted and then requests
// history that should include transient events.
func (s *TransientWorkflowTaskHistorySuite) TestGetHistoryAfterCacheEviction_TransientWFT() {
id := "functional-get-history-after-cache-eviction-transient-wft"
wt := "functional-get-history-after-cache-eviction-transient-wft-type"
tl := "functional-get-history-after-cache-eviction-transient-wft-taskqueue"
identity := "worker1"
// Start workflow execution
request := &workflowservice.StartWorkflowExecutionRequest{
RequestId: uuid.NewString(),
Namespace: s.Namespace().String(),
WorkflowId: id,
WorkflowType: &commonpb.WorkflowType{Name: wt},
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Input: nil,
WorkflowRunTimeout: durationpb.New(100 * time.Second),
WorkflowTaskTimeout: durationpb.New(2 * time.Second),
Identity: identity,
}
we, err := s.FrontendClient().StartWorkflowExecution(testcore.NewContext(), request)
s.NoError(err)
workflowExecution := &commonpb.WorkflowExecution{
WorkflowId: id,
RunId: we.RunId,
}
// Step 1: Fail the first workflow task to create a transient WFT (attempt=2)
failWorkflowTask := true
wtHandler := func(task *workflowservice.PollWorkflowTaskQueueResponse) ([]*commandpb.Command, error) {
if failWorkflowTask {
failWorkflowTask = false
return nil, errors.New("simulated workflow task failure")
}
// Complete workflow on second attempt
return []*commandpb.Command{{
CommandType: enumspb.COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
Attributes: &commandpb.Command_CompleteWorkflowExecutionCommandAttributes{
CompleteWorkflowExecutionCommandAttributes: &commandpb.CompleteWorkflowExecutionCommandAttributes{
Result: payloads.EncodeString("Done"),
}},
}}, nil
}
//nolint:staticcheck // SA1019 Using deprecated testcore.TaskPoller for backwards compatibility
poller := &testcore.TaskPoller{
Client: s.FrontendClient(),
Namespace: s.Namespace().String(),
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Identity: identity,
WorkflowTaskHandler: wtHandler,
Logger: s.Logger,
T: s.T(),
}
// Poll and fail the first workflow task - this creates transient WFT (attempt=2)
_, err = poller.PollAndProcessWorkflowTask()
s.NoError(err)
// Step 2: Poll the transient task and start it (but don't complete yet)
// This simulates having both scheduled + started transient events
ctx := newSDKContext()
resp2, err := s.FrontendClient().PollWorkflowTaskQueue(ctx, &workflowservice.PollWorkflowTaskQueueRequest{
Namespace: s.Namespace().String(),
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Identity: identity,
})
s.NoError(err)
s.NotNil(resp2)
s.NotEmpty(resp2.TaskToken)
// Step 3: Call GetWorkflowExecutionHistory, simulating worker cache eviction
histResp, err := s.FrontendClient().GetWorkflowExecutionHistory(ctx,
&workflowservice.GetWorkflowExecutionHistoryRequest{
Namespace: s.Namespace().String(),
Execution: workflowExecution,
MaximumPageSize: 100,
})
s.NoError(err, "GetWorkflowExecutionHistory should not return 'premature end of stream' error")
s.NotNil(histResp)
s.NotNil(histResp.History)
s.NotEmpty(histResp.History.Events)
// Step 5: Verify history includes transient WorkflowTaskScheduled (attempt=2) and WorkflowTaskStarted events
events := histResp.History.Events
foundScheduled := false
foundStarted := false
for _, event := range events {
if event.GetEventType() == enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED {
attrs := event.GetWorkflowTaskScheduledEventAttributes()
if attrs.GetAttempt() == 2 {
foundScheduled = true
}
}
if event.GetEventType() == enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED {
// Check if this is the started event for the transient task (attempt 2)
// by checking if it comes after a scheduled event with attempt=2
for i, e := range events {
if e.GetEventId() == event.GetEventId() && i > 0 {
prevEvent := events[i-1]
if prevEvent.GetEventType() == enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED &&
prevEvent.GetWorkflowTaskScheduledEventAttributes().GetAttempt() == 2 {
foundStarted = true
}
}
}
}
}
s.True(foundScheduled, "History should include transient WorkflowTaskScheduled event (attempt=2)")
s.True(foundStarted, "History should include transient WorkflowTaskStarted event")
// The last event ID in history should match or exceed what worker expects from PollWorkflowTask
lastEventID := events[len(events)-1].GetEventId()
s.GreaterOrEqual(lastEventID, resp2.GetStartedEventId(),
"Last event ID in history should be >= StartedEventId from poll response to prevent 'premature end of stream'")
// Clean up by completing the workflow task
_, err = s.FrontendClient().RespondWorkflowTaskCompleted(ctx, &workflowservice.RespondWorkflowTaskCompletedRequest{
Namespace: s.Namespace().String(),
TaskToken: resp2.TaskToken,
Identity: identity,
Commands: []*commandpb.Command{{
CommandType: enumspb.COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
Attributes: &commandpb.Command_CompleteWorkflowExecutionCommandAttributes{
CompleteWorkflowExecutionCommandAttributes: &commandpb.CompleteWorkflowExecutionCommandAttributes{
Result: payloads.EncodeString("Done"),
}},
}},
})
s.NoError(err)
}
// TestGetHistory_TransientWFT_ScheduledOnly verifies transient events are included
// even when WFT is scheduled but not yet started.
func (s *TransientWorkflowTaskHistorySuite) TestGetHistory_TransientWFT_ScheduledOnly() {
id := "functional-get-history-transient-wft-scheduled-only"
wt := "functional-get-history-transient-wft-scheduled-only-type"
tl := "functional-get-history-transient-wft-scheduled-only-taskqueue"
identity := "worker1"
// Start workflow execution
request := &workflowservice.StartWorkflowExecutionRequest{
RequestId: uuid.NewString(),
Namespace: s.Namespace().String(),
WorkflowId: id,
WorkflowType: &commonpb.WorkflowType{Name: wt},
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Input: nil,
WorkflowRunTimeout: durationpb.New(100 * time.Second),
WorkflowTaskTimeout: durationpb.New(2 * time.Second),
Identity: identity,
}
we, err := s.FrontendClient().StartWorkflowExecution(testcore.NewContext(), request)
s.NoError(err)
workflowExecution := &commonpb.WorkflowExecution{
WorkflowId: id,
RunId: we.RunId,
}
// Step 1: Fail first task to create transient WFT (attempt=2)
failWorkflowTask := true
wtHandler := func(task *workflowservice.PollWorkflowTaskQueueResponse) ([]*commandpb.Command, error) {
if failWorkflowTask {
failWorkflowTask = false
return nil, errors.New("simulated workflow task failure")
}
return []*commandpb.Command{{
CommandType: enumspb.COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
Attributes: &commandpb.Command_CompleteWorkflowExecutionCommandAttributes{
CompleteWorkflowExecutionCommandAttributes: &commandpb.CompleteWorkflowExecutionCommandAttributes{
Result: payloads.EncodeString("Done"),
}},
}}, nil
}
//nolint:staticcheck // SA1019 Using deprecated testcore.TaskPoller for backwards compatibility
poller := &testcore.TaskPoller{
Client: s.FrontendClient(),
Namespace: s.Namespace().String(),
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Identity: identity,
WorkflowTaskHandler: wtHandler,
Logger: s.Logger,
T: s.T(),
}
// Poll and fail the first workflow task
_, err = poller.PollAndProcessWorkflowTask()
s.NoError(err)
// Step 2: Call GetWorkflowExecutionHistory BEFORE polling the transient task
ctx := newSDKContext()
histResp, err := s.FrontendClient().GetWorkflowExecutionHistory(ctx,
&workflowservice.GetWorkflowExecutionHistoryRequest{
Namespace: s.Namespace().String(),
Execution: workflowExecution,
MaximumPageSize: 100,
})
s.NoError(err)
s.NotNil(histResp)
s.NotNil(histResp.History)
s.NotEmpty(histResp.History.Events)
// Step 3: Verify history includes transient WorkflowTaskScheduled event (attempt=2)
events := histResp.History.Events
foundScheduled := false
foundStarted := false
for _, event := range events {
if event.GetEventType() == enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED {
attrs := event.GetWorkflowTaskScheduledEventAttributes()
if attrs.GetAttempt() == 2 {
foundScheduled = true
}
}
if event.GetEventType() == enumspb.EVENT_TYPE_WORKFLOW_TASK_STARTED {
// Check if this corresponds to the transient task
for i, e := range events {
if e.GetEventId() == event.GetEventId() && i > 0 {
prevEvent := events[i-1]
if prevEvent.GetEventType() == enumspb.EVENT_TYPE_WORKFLOW_TASK_SCHEDULED &&
prevEvent.GetWorkflowTaskScheduledEventAttributes().GetAttempt() == 2 {
foundStarted = true
}
}
}
}
}
s.True(foundScheduled, "History should include transient WorkflowTaskScheduled event (attempt=2)")
s.False(foundStarted, "History should NOT include transient WorkflowTaskStarted event (task not polled yet)")
// Clean up: Poll and complete the transient task
_, err = poller.PollAndProcessWorkflowTask()
s.NoError(err)
}
// TestGetHistory_RaceCondition_RetryableError verifies that pagination handles the case
// where the workflow completes during multi-page history retrieval.
func (s *TransientWorkflowTaskHistorySuite) TestGetHistory_RaceCondition_RetryableError() {
id := "functional-get-history-race-condition-retryable-error"
wt := "functional-get-history-race-condition-retryable-error-type"
tl := "functional-get-history-race-condition-retryable-error-taskqueue"
identity := "worker1"
// Start workflow execution
request := &workflowservice.StartWorkflowExecutionRequest{
RequestId: uuid.NewString(),
Namespace: s.Namespace().String(),
WorkflowId: id,
WorkflowType: &commonpb.WorkflowType{Name: wt},
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Input: nil,
WorkflowRunTimeout: durationpb.New(100 * time.Second),
WorkflowTaskTimeout: durationpb.New(2 * time.Second),
Identity: identity,
}
we, err := s.FrontendClient().StartWorkflowExecution(testcore.NewContext(), request)
s.NoError(err)
workflowExecution := &commonpb.WorkflowExecution{
WorkflowId: id,
RunId: we.RunId,
}
// Step 1: Create a transient WFT by failing the first task
failWorkflowTask := true
wtHandler := func(task *workflowservice.PollWorkflowTaskQueueResponse) ([]*commandpb.Command, error) {
if failWorkflowTask {
failWorkflowTask = false
return nil, errors.New("simulated workflow task failure")
}
return []*commandpb.Command{{
CommandType: enumspb.COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
Attributes: &commandpb.Command_CompleteWorkflowExecutionCommandAttributes{
CompleteWorkflowExecutionCommandAttributes: &commandpb.CompleteWorkflowExecutionCommandAttributes{
Result: payloads.EncodeString("Done"),
}},
}}, nil
}
//nolint:staticcheck // SA1019 Using deprecated testcore.TaskPoller for backwards compatibility
poller := &testcore.TaskPoller{
Client: s.FrontendClient(),
Namespace: s.Namespace().String(),
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Identity: identity,
WorkflowTaskHandler: wtHandler,
Logger: s.Logger,
T: s.T(),
}
// Poll and fail the first workflow task
_, err = poller.PollAndProcessWorkflowTask()
s.NoError(err)
// Step 2: Poll the transient task to start it
ctx := newSDKContext()
resp2, err := s.FrontendClient().PollWorkflowTaskQueue(ctx, &workflowservice.PollWorkflowTaskQueueRequest{
Namespace: s.Namespace().String(),
TaskQueue: &taskqueuepb.TaskQueue{Name: tl, Kind: enumspb.TASK_QUEUE_KIND_NORMAL},
Identity: identity,
})
s.NoError(err)
s.NotNil(resp2)
s.NotEmpty(resp2.TaskToken)
// Step 3: Start fetching history with pagination (small page size to force pagination)
histResp, err := s.FrontendClient().GetWorkflowExecutionHistory(ctx,
&workflowservice.GetWorkflowExecutionHistoryRequest{
Namespace: s.Namespace().String(),
Execution: workflowExecution,
MaximumPageSize: 2, // Small page size to force pagination
})
s.NoError(err)
s.NotNil(histResp)
// Step 4: Complete the transient WFT (changes event IDs) DURING pagination
_, err = s.FrontendClient().RespondWorkflowTaskCompleted(ctx, &workflowservice.RespondWorkflowTaskCompletedRequest{
Namespace: s.Namespace().String(),
TaskToken: resp2.TaskToken,
Identity: identity,
Commands: []*commandpb.Command{{
CommandType: enumspb.COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
Attributes: &commandpb.Command_CompleteWorkflowExecutionCommandAttributes{
CompleteWorkflowExecutionCommandAttributes: &commandpb.CompleteWorkflowExecutionCommandAttributes{
Result: payloads.EncodeString("Done"),
}},
}},
})
s.NoError(err)
// Step 5: Continue pagination with the next page token
// Tests that pagination handles workflow completion gracefully during multi-page retrieval
if histResp.NextPageToken != nil {
histResp2, err := s.FrontendClient().GetWorkflowExecutionHistory(ctx,
&workflowservice.GetWorkflowExecutionHistoryRequest{
Namespace: s.Namespace().String(),
Execution: workflowExecution,
MaximumPageSize: 2,
NextPageToken: histResp.NextPageToken,
})
// Depending on timing, we might get:
// 1. An Unavailable error if transient events changed (e.g., validation failed)
// 2. Success if the workflow completed and pagination succeeded
// We verify that if there's an error, it's the expected type
if err != nil {
var unavailableErr *serviceerror.Unavailable
s.ErrorAs(err, &unavailableErr)
} else {
// If no error, the pagination completed successfully
// This can happen if the workflow completed before the second page was fetched
s.NotNil(histResp2)
}
}
}