diff --git a/api/matchingservice/v1/request_response.pb.go b/api/matchingservice/v1/request_response.pb.go index 3469d8bb9ae..27b98736339 100644 --- a/api/matchingservice/v1/request_response.pb.go +++ b/api/matchingservice/v1/request_response.pb.go @@ -642,11 +642,13 @@ type PollActivityTaskQueueResponse struct { Input *v11.Payloads `protobuf:"bytes,5,opt,name=input,proto3" json:"input,omitempty"` ScheduledTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=scheduled_time,json=scheduledTime,proto3" json:"scheduled_time,omitempty"` // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "to" is used to indicate interval. --) + // + // aip.dev/not-precedent: "to" is used to indicate interval. --) ScheduleToCloseTimeout *durationpb.Duration `protobuf:"bytes,7,opt,name=schedule_to_close_timeout,json=scheduleToCloseTimeout,proto3" json:"schedule_to_close_timeout,omitempty"` StartedTime *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=started_time,json=startedTime,proto3" json:"started_time,omitempty"` // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "to" is used to indicate interval. --) + // + // aip.dev/not-precedent: "to" is used to indicate interval. --) StartToCloseTimeout *durationpb.Duration `protobuf:"bytes,9,opt,name=start_to_close_timeout,json=startToCloseTimeout,proto3" json:"start_to_close_timeout,omitempty"` HeartbeatTimeout *durationpb.Duration `protobuf:"bytes,10,opt,name=heartbeat_timeout,json=heartbeatTimeout,proto3" json:"heartbeat_timeout,omitempty"` Attempt int32 `protobuf:"varint,11,opt,name=attempt,proto3" json:"attempt,omitempty"` @@ -849,7 +851,8 @@ type AddWorkflowTaskRequest struct { TaskQueue *v14.TaskQueue `protobuf:"bytes,3,opt,name=task_queue,json=taskQueue,proto3" json:"task_queue,omitempty"` ScheduledEventId int64 `protobuf:"varint,4,opt,name=scheduled_event_id,json=scheduledEventId,proto3" json:"scheduled_event_id,omitempty"` // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "to" is used to indicate interval. --) + // + // aip.dev/not-precedent: "to" is used to indicate interval. --) ScheduleToStartTimeout *durationpb.Duration `protobuf:"bytes,5,opt,name=schedule_to_start_timeout,json=scheduleToStartTimeout,proto3" json:"schedule_to_start_timeout,omitempty"` Clock *v18.VectorClock `protobuf:"bytes,9,opt,name=clock,proto3" json:"clock,omitempty"` // How this task should be directed by matching. (Missing means the default @@ -858,9 +861,11 @@ type AddWorkflowTaskRequest struct { ForwardInfo *v19.TaskForwardInfo `protobuf:"bytes,11,opt,name=forward_info,json=forwardInfo,proto3" json:"forward_info,omitempty"` Priority *v11.Priority `protobuf:"bytes,12,opt,name=priority,proto3" json:"priority,omitempty"` // Stamp value from when the workflow task was scheduled. Used to validate the task is still relevant. - Stamp int32 `protobuf:"varint,13,opt,name=stamp,proto3" json:"stamp,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Stamp int32 `protobuf:"varint,13,opt,name=stamp,proto3" json:"stamp,omitempty"` + // Session placement associated with this task, if any. + SessionDirective *v19.TaskSessionDirective `protobuf:"bytes,14,opt,name=session_directive,json=sessionDirective,proto3" json:"session_directive,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddWorkflowTaskRequest) Reset() { @@ -963,6 +968,13 @@ func (x *AddWorkflowTaskRequest) GetStamp() int32 { return 0 } +func (x *AddWorkflowTaskRequest) GetSessionDirective() *v19.TaskSessionDirective { + if x != nil { + return x.SessionDirective + } + return nil +} + type AddWorkflowTaskResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // When present, it means that the task is spooled to a versioned queue of this build ID @@ -1016,7 +1028,8 @@ type AddActivityTaskRequest struct { TaskQueue *v14.TaskQueue `protobuf:"bytes,4,opt,name=task_queue,json=taskQueue,proto3" json:"task_queue,omitempty"` ScheduledEventId int64 `protobuf:"varint,5,opt,name=scheduled_event_id,json=scheduledEventId,proto3" json:"scheduled_event_id,omitempty"` // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "to" is used to indicate interval. --) + // + // aip.dev/not-precedent: "to" is used to indicate interval. --) ScheduleToStartTimeout *durationpb.Duration `protobuf:"bytes,6,opt,name=schedule_to_start_timeout,json=scheduleToStartTimeout,proto3" json:"schedule_to_start_timeout,omitempty"` Clock *v18.VectorClock `protobuf:"bytes,9,opt,name=clock,proto3" json:"clock,omitempty"` // How this task should be directed by matching. (Missing means the default @@ -1028,9 +1041,11 @@ type AddActivityTaskRequest struct { // Reference to the Chasm component for activity execution (if applicable). For standalone activities, all // necessary start information is carried within this component, obviating the need to use the fields that apply to // embedded activities. - ComponentRef []byte `protobuf:"bytes,14,opt,name=component_ref,json=componentRef,proto3" json:"component_ref,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + ComponentRef []byte `protobuf:"bytes,14,opt,name=component_ref,json=componentRef,proto3" json:"component_ref,omitempty"` + // Session placement associated with this task, if any. + SessionDirective *v19.TaskSessionDirective `protobuf:"bytes,15,opt,name=session_directive,json=sessionDirective,proto3" json:"session_directive,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AddActivityTaskRequest) Reset() { @@ -1140,6 +1155,13 @@ func (x *AddActivityTaskRequest) GetComponentRef() []byte { return nil } +func (x *AddActivityTaskRequest) GetSessionDirective() *v19.TaskSessionDirective { + if x != nil { + return x.SessionDirective + } + return nil +} + type AddActivityTaskResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // When present, it means that the task is spooled to a versioned queue of this build ID @@ -3052,7 +3074,8 @@ type SyncDeploymentUserDataRequest struct { TaskQueue string `protobuf:"bytes,2,opt,name=task_queue,json=taskQueue,proto3" json:"task_queue,omitempty"` // Required, unless deprecated fields are used. // (-- api-linter: core::0203::required=disabled - // aip.dev/not-precedent: Not following Google API format --) + // + // aip.dev/not-precedent: Not following Google API format --) DeploymentName string `protobuf:"bytes,9,opt,name=deployment_name,json=deploymentName,proto3" json:"deployment_name,omitempty"` TaskQueueTypes []v110.TaskQueueType `protobuf:"varint,8,rep,packed,name=task_queue_types,json=taskQueueTypes,proto3,enum=temporal.api.enums.v1.TaskQueueType" json:"task_queue_types,omitempty"` // Types that are valid to be assigned to Operation: @@ -3065,7 +3088,8 @@ type SyncDeploymentUserDataRequest struct { UpdateRoutingConfig *v113.RoutingConfig `protobuf:"bytes,10,opt,name=update_routing_config,json=updateRoutingConfig,proto3" json:"update_routing_config,omitempty"` // Optional map of build id to upsert version data. // (-- api-linter: core::0203::required=disabled - // aip.dev/not-precedent: Not following Google API format --) + // + // aip.dev/not-precedent: Not following Google API format --) UpsertVersionsData map[string]*v111.WorkerDeploymentVersionData `protobuf:"bytes,11,rep,name=upsert_versions_data,json=upsertVersionsData,proto3" json:"upsert_versions_data,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // List of build ids to forget from task queue. ForgetVersions []string `protobuf:"bytes,12,rep,name=forget_versions,json=forgetVersions,proto3" json:"forget_versions,omitempty"` @@ -6082,7 +6106,8 @@ type DescribeVersionedTaskQueuesResponse_VersionTaskQueue struct { Type v110.TaskQueueType `protobuf:"varint,2,opt,name=type,proto3,enum=temporal.api.enums.v1.TaskQueueType" json:"type,omitempty"` Stats *v14.TaskQueueStats `protobuf:"bytes,3,opt,name=stats,proto3" json:"stats,omitempty"` // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "by" is used to clarify the key. --) + // + // aip.dev/not-precedent: "by" is used to clarify the key. --) StatsByPriorityKey map[int32]*v14.TaskQueueStats `protobuf:"bytes,4,rep,name=stats_by_priority_key,json=statsByPriorityKey,proto3" json:"stats_by_priority_key,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -6383,7 +6408,7 @@ const file_temporal_server_api_matchingservice_v1_request_response_proto_rawDesc "\bpriority\x18\x12 \x01(\v2 .temporal.api.common.v1.PriorityR\bpriority\x12F\n" + "\fretry_policy\x18\x13 \x01(\v2#.temporal.api.common.v1.RetryPolicyR\vretryPolicy\x12&\n" + "\x0factivity_run_id\x18\x14 \x01(\tR\ractivityRunId\x12\x8a\x01\n" + - "&propagated_nexus_serialization_context\x18\x15 \x01(\v25.temporal.api.nexus.v1.PropagatedSerializationContextR#propagatedNexusSerializationContext\"\x9d\x05\n" + + "&propagated_nexus_serialization_context\x18\x15 \x01(\v25.temporal.api.nexus.v1.PropagatedSerializationContextR#propagatedNexusSerializationContext\"\x82\x06\n" + "\x16AddWorkflowTaskRequest\x12!\n" + "\fnamespace_id\x18\x01 \x01(\tR\vnamespaceId\x12G\n" + "\texecution\x18\x02 \x01(\v2).temporal.api.common.v1.WorkflowExecutionR\texecution\x12C\n" + @@ -6396,9 +6421,10 @@ const file_temporal_server_api_matchingservice_v1_request_response_proto_rawDesc " \x01(\v26.temporal.server.api.taskqueue.v1.TaskVersionDirectiveR\x10versionDirective\x12T\n" + "\fforward_info\x18\v \x01(\v21.temporal.server.api.taskqueue.v1.TaskForwardInfoR\vforwardInfo\x12<\n" + "\bpriority\x18\f \x01(\v2 .temporal.api.common.v1.PriorityR\bpriority\x12\x14\n" + - "\x05stamp\x18\r \x01(\x05R\x05stamp\"E\n" + + "\x05stamp\x18\r \x01(\x05R\x05stamp\x12c\n" + + "\x11session_directive\x18\x0e \x01(\v26.temporal.server.api.taskqueue.v1.TaskSessionDirectiveR\x10sessionDirective\"E\n" + "\x17AddWorkflowTaskResponse\x12*\n" + - "\x11assigned_build_id\x18\x01 \x01(\tR\x0fassignedBuildId\"\xc8\x05\n" + + "\x11assigned_build_id\x18\x01 \x01(\tR\x0fassignedBuildId\"\xad\x06\n" + "\x16AddActivityTaskRequest\x12!\n" + "\fnamespace_id\x18\x01 \x01(\tR\vnamespaceId\x12G\n" + "\texecution\x18\x02 \x01(\v2).temporal.api.common.v1.WorkflowExecutionR\texecution\x12C\n" + @@ -6412,7 +6438,8 @@ const file_temporal_server_api_matchingservice_v1_request_response_proto_rawDesc "\fforward_info\x18\v \x01(\v21.temporal.server.api.taskqueue.v1.TaskForwardInfoR\vforwardInfo\x12\x14\n" + "\x05stamp\x18\f \x01(\x05R\x05stamp\x12<\n" + "\bpriority\x18\r \x01(\v2 .temporal.api.common.v1.PriorityR\bpriority\x12#\n" + - "\rcomponent_ref\x18\x0e \x01(\fR\fcomponentRefJ\x04\b\x03\x10\x04\"E\n" + + "\rcomponent_ref\x18\x0e \x01(\fR\fcomponentRef\x12c\n" + + "\x11session_directive\x18\x0f \x01(\v26.temporal.server.api.taskqueue.v1.TaskSessionDirectiveR\x10sessionDirectiveJ\x04\b\x03\x10\x04\"E\n" + "\x17AddActivityTaskResponse\x12*\n" + "\x11assigned_build_id\x18\x01 \x01(\tR\x0fassignedBuildId\"\xb7\x03\n" + "\x19GrantEagerDispatchRequest\x12!\n" + @@ -6882,51 +6909,52 @@ var file_temporal_server_api_matchingservice_v1_request_response_proto_goTypes = (*v18.VectorClock)(nil), // 119: temporal.server.api.clock.v1.VectorClock (*v19.TaskVersionDirective)(nil), // 120: temporal.server.api.taskqueue.v1.TaskVersionDirective (*v19.TaskForwardInfo)(nil), // 121: temporal.server.api.taskqueue.v1.TaskForwardInfo - (*v19.TaskQueuePartition)(nil), // 122: temporal.server.api.taskqueue.v1.TaskQueuePartition - (*v1.QueryWorkflowRequest)(nil), // 123: temporal.api.workflowservice.v1.QueryWorkflowRequest - (*v12.QueryRejected)(nil), // 124: temporal.api.query.v1.QueryRejected - (*v1.RespondQueryTaskCompletedRequest)(nil), // 125: temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest - (v110.TaskQueueType)(0), // 126: temporal.api.enums.v1.TaskQueueType - (*v1.DescribeTaskQueueRequest)(nil), // 127: temporal.api.workflowservice.v1.DescribeTaskQueueRequest - (*v111.WorkerDeploymentVersion)(nil), // 128: temporal.server.api.deployment.v1.WorkerDeploymentVersion - (*v1.DescribeTaskQueueResponse)(nil), // 129: temporal.api.workflowservice.v1.DescribeTaskQueueResponse - (*v14.TaskQueueVersionSelection)(nil), // 130: temporal.api.taskqueue.v1.TaskQueueVersionSelection - (*v19.PartitionScaleInfo)(nil), // 131: temporal.server.api.taskqueue.v1.PartitionScaleInfo - (*v14.TaskQueuePartitionMetadata)(nil), // 132: temporal.api.taskqueue.v1.TaskQueuePartitionMetadata - (*v1.GetWorkerVersioningRulesRequest)(nil), // 133: temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest - (*v1.GetWorkerVersioningRulesResponse)(nil), // 134: temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse - (*v1.UpdateWorkerVersioningRulesRequest)(nil), // 135: temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest - (*v1.UpdateWorkerVersioningRulesResponse)(nil), // 136: temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse - (*v1.GetWorkerBuildIdCompatibilityRequest)(nil), // 137: temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest - (*v1.GetWorkerBuildIdCompatibilityResponse)(nil), // 138: temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse - (*v112.VersionedTaskQueueUserData)(nil), // 139: temporal.server.api.persistence.v1.VersionedTaskQueueUserData - (*v19.VersionedEphemeralData)(nil), // 140: temporal.server.api.taskqueue.v1.VersionedEphemeralData - (*v111.DeploymentVersionData)(nil), // 141: temporal.server.api.deployment.v1.DeploymentVersionData - (*v113.RoutingConfig)(nil), // 142: temporal.api.deployment.v1.RoutingConfig - (*v112.TaskQueueUserData)(nil), // 143: temporal.server.api.persistence.v1.TaskQueueUserData - (*v17.Request)(nil), // 144: temporal.api.nexus.v1.Request - (*v17.HandlerError)(nil), // 145: temporal.api.nexus.v1.HandlerError - (*v17.Response)(nil), // 146: temporal.api.nexus.v1.Response - (*v114.Failure)(nil), // 147: temporal.api.failure.v1.Failure - (*v1.PollNexusTaskQueueRequest)(nil), // 148: temporal.api.workflowservice.v1.PollNexusTaskQueueRequest - (*v1.PollNexusTaskQueueResponse)(nil), // 149: temporal.api.workflowservice.v1.PollNexusTaskQueueResponse - (*v1.RespondNexusTaskCompletedRequest)(nil), // 150: temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest - (*v1.RespondNexusTaskFailedRequest)(nil), // 151: temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest - (*v112.NexusEndpointSpec)(nil), // 152: temporal.server.api.persistence.v1.NexusEndpointSpec - (*v112.NexusEndpointEntry)(nil), // 153: temporal.server.api.persistence.v1.NexusEndpointEntry - (*v1.RecordWorkerHeartbeatRequest)(nil), // 154: temporal.api.workflowservice.v1.RecordWorkerHeartbeatRequest - (*v1.ListWorkersRequest)(nil), // 155: temporal.api.workflowservice.v1.ListWorkersRequest - (*v115.WorkerInfo)(nil), // 156: temporal.api.worker.v1.WorkerInfo - (*v115.WorkerListInfo)(nil), // 157: temporal.api.worker.v1.WorkerListInfo - (*v1.CountWorkersRequest)(nil), // 158: temporal.api.workflowservice.v1.CountWorkersRequest - (*v1.UpdateTaskQueueConfigRequest)(nil), // 159: temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest - (*v14.TaskQueueConfig)(nil), // 160: temporal.api.taskqueue.v1.TaskQueueConfig - (*v1.DescribeWorkerRequest)(nil), // 161: temporal.api.workflowservice.v1.DescribeWorkerRequest - (v116.FairnessState)(0), // 162: temporal.server.api.enums.v1.FairnessState - (*v14.TaskQueueStats)(nil), // 163: temporal.api.taskqueue.v1.TaskQueueStats - (*v19.TaskQueueVersionInfoInternal)(nil), // 164: temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal - (*v1.UpdateWorkerBuildIdCompatibilityRequest)(nil), // 165: temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest - (*v111.WorkerDeploymentVersionData)(nil), // 166: temporal.server.api.deployment.v1.WorkerDeploymentVersionData + (*v19.TaskSessionDirective)(nil), // 122: temporal.server.api.taskqueue.v1.TaskSessionDirective + (*v19.TaskQueuePartition)(nil), // 123: temporal.server.api.taskqueue.v1.TaskQueuePartition + (*v1.QueryWorkflowRequest)(nil), // 124: temporal.api.workflowservice.v1.QueryWorkflowRequest + (*v12.QueryRejected)(nil), // 125: temporal.api.query.v1.QueryRejected + (*v1.RespondQueryTaskCompletedRequest)(nil), // 126: temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest + (v110.TaskQueueType)(0), // 127: temporal.api.enums.v1.TaskQueueType + (*v1.DescribeTaskQueueRequest)(nil), // 128: temporal.api.workflowservice.v1.DescribeTaskQueueRequest + (*v111.WorkerDeploymentVersion)(nil), // 129: temporal.server.api.deployment.v1.WorkerDeploymentVersion + (*v1.DescribeTaskQueueResponse)(nil), // 130: temporal.api.workflowservice.v1.DescribeTaskQueueResponse + (*v14.TaskQueueVersionSelection)(nil), // 131: temporal.api.taskqueue.v1.TaskQueueVersionSelection + (*v19.PartitionScaleInfo)(nil), // 132: temporal.server.api.taskqueue.v1.PartitionScaleInfo + (*v14.TaskQueuePartitionMetadata)(nil), // 133: temporal.api.taskqueue.v1.TaskQueuePartitionMetadata + (*v1.GetWorkerVersioningRulesRequest)(nil), // 134: temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest + (*v1.GetWorkerVersioningRulesResponse)(nil), // 135: temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse + (*v1.UpdateWorkerVersioningRulesRequest)(nil), // 136: temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest + (*v1.UpdateWorkerVersioningRulesResponse)(nil), // 137: temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse + (*v1.GetWorkerBuildIdCompatibilityRequest)(nil), // 138: temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest + (*v1.GetWorkerBuildIdCompatibilityResponse)(nil), // 139: temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse + (*v112.VersionedTaskQueueUserData)(nil), // 140: temporal.server.api.persistence.v1.VersionedTaskQueueUserData + (*v19.VersionedEphemeralData)(nil), // 141: temporal.server.api.taskqueue.v1.VersionedEphemeralData + (*v111.DeploymentVersionData)(nil), // 142: temporal.server.api.deployment.v1.DeploymentVersionData + (*v113.RoutingConfig)(nil), // 143: temporal.api.deployment.v1.RoutingConfig + (*v112.TaskQueueUserData)(nil), // 144: temporal.server.api.persistence.v1.TaskQueueUserData + (*v17.Request)(nil), // 145: temporal.api.nexus.v1.Request + (*v17.HandlerError)(nil), // 146: temporal.api.nexus.v1.HandlerError + (*v17.Response)(nil), // 147: temporal.api.nexus.v1.Response + (*v114.Failure)(nil), // 148: temporal.api.failure.v1.Failure + (*v1.PollNexusTaskQueueRequest)(nil), // 149: temporal.api.workflowservice.v1.PollNexusTaskQueueRequest + (*v1.PollNexusTaskQueueResponse)(nil), // 150: temporal.api.workflowservice.v1.PollNexusTaskQueueResponse + (*v1.RespondNexusTaskCompletedRequest)(nil), // 151: temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest + (*v1.RespondNexusTaskFailedRequest)(nil), // 152: temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest + (*v112.NexusEndpointSpec)(nil), // 153: temporal.server.api.persistence.v1.NexusEndpointSpec + (*v112.NexusEndpointEntry)(nil), // 154: temporal.server.api.persistence.v1.NexusEndpointEntry + (*v1.RecordWorkerHeartbeatRequest)(nil), // 155: temporal.api.workflowservice.v1.RecordWorkerHeartbeatRequest + (*v1.ListWorkersRequest)(nil), // 156: temporal.api.workflowservice.v1.ListWorkersRequest + (*v115.WorkerInfo)(nil), // 157: temporal.api.worker.v1.WorkerInfo + (*v115.WorkerListInfo)(nil), // 158: temporal.api.worker.v1.WorkerListInfo + (*v1.CountWorkersRequest)(nil), // 159: temporal.api.workflowservice.v1.CountWorkersRequest + (*v1.UpdateTaskQueueConfigRequest)(nil), // 160: temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest + (*v14.TaskQueueConfig)(nil), // 161: temporal.api.taskqueue.v1.TaskQueueConfig + (*v1.DescribeWorkerRequest)(nil), // 162: temporal.api.workflowservice.v1.DescribeWorkerRequest + (v116.FairnessState)(0), // 163: temporal.server.api.enums.v1.FairnessState + (*v14.TaskQueueStats)(nil), // 164: temporal.api.taskqueue.v1.TaskQueueStats + (*v19.TaskQueueVersionInfoInternal)(nil), // 165: temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal + (*v1.UpdateWorkerBuildIdCompatibilityRequest)(nil), // 166: temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest + (*v111.WorkerDeploymentVersionData)(nil), // 167: temporal.server.api.deployment.v1.WorkerDeploymentVersionData } var file_temporal_server_api_matchingservice_v1_request_response_proto_depIdxs = []int32{ 101, // 0: temporal.server.api.matchingservice.v1.PollWorkflowTaskQueueRequest.poll_request:type_name -> temporal.api.workflowservice.v1.PollWorkflowTaskQueueRequest @@ -6979,118 +7007,120 @@ var file_temporal_server_api_matchingservice_v1_request_response_proto_depIdxs = 120, // 47: temporal.server.api.matchingservice.v1.AddWorkflowTaskRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective 121, // 48: temporal.server.api.matchingservice.v1.AddWorkflowTaskRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo 116, // 49: temporal.server.api.matchingservice.v1.AddWorkflowTaskRequest.priority:type_name -> temporal.api.common.v1.Priority - 102, // 50: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution - 106, // 51: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 114, // 52: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.schedule_to_start_timeout:type_name -> google.protobuf.Duration - 119, // 53: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock - 120, // 54: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective - 121, // 55: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo - 116, // 56: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.priority:type_name -> temporal.api.common.v1.Priority - 122, // 57: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition - 90, // 58: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.items:type_name -> temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.Item - 91, // 59: temporal.server.api.matchingservice.v1.GrantEagerDispatchResponse.items:type_name -> temporal.server.api.matchingservice.v1.GrantEagerDispatchResponse.Item - 106, // 60: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 123, // 61: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.query_request:type_name -> temporal.api.workflowservice.v1.QueryWorkflowRequest - 120, // 62: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective - 121, // 63: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo - 116, // 64: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.priority:type_name -> temporal.api.common.v1.Priority - 113, // 65: temporal.server.api.matchingservice.v1.QueryWorkflowResponse.query_result:type_name -> temporal.api.common.v1.Payloads - 124, // 66: temporal.server.api.matchingservice.v1.QueryWorkflowResponse.query_rejected:type_name -> temporal.api.query.v1.QueryRejected - 106, // 67: temporal.server.api.matchingservice.v1.RespondQueryTaskCompletedRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 125, // 68: temporal.server.api.matchingservice.v1.RespondQueryTaskCompletedRequest.completed_request:type_name -> temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest - 126, // 69: temporal.server.api.matchingservice.v1.CancelOutstandingPollRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 106, // 70: temporal.server.api.matchingservice.v1.CancelOutstandingPollRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 106, // 71: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 126, // 72: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 122, // 73: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition - 122, // 74: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.partitions:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition - 92, // 75: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.workers:type_name -> temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.WorkerEntry - 127, // 76: temporal.server.api.matchingservice.v1.DescribeTaskQueueRequest.desc_request:type_name -> temporal.api.workflowservice.v1.DescribeTaskQueueRequest - 128, // 77: temporal.server.api.matchingservice.v1.DescribeTaskQueueRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 129, // 78: temporal.server.api.matchingservice.v1.DescribeTaskQueueResponse.desc_response:type_name -> temporal.api.workflowservice.v1.DescribeTaskQueueResponse - 126, // 79: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 106, // 80: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 128, // 81: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 93, // 82: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.version_task_queues:type_name -> temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.VersionTaskQueue - 94, // 83: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.version_task_queues:type_name -> temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue - 122, // 84: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition - 130, // 85: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionRequest.versions:type_name -> temporal.api.taskqueue.v1.TaskQueueVersionSelection - 96, // 86: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.versions_info_internal:type_name -> temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.VersionsInfoInternalEntry - 131, // 87: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.scale_info:type_name -> temporal.server.api.taskqueue.v1.PartitionScaleInfo - 106, // 88: temporal.server.api.matchingservice.v1.ListTaskQueuePartitionsRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 132, // 89: temporal.server.api.matchingservice.v1.ListTaskQueuePartitionsResponse.activity_task_queue_partitions:type_name -> temporal.api.taskqueue.v1.TaskQueuePartitionMetadata - 132, // 90: temporal.server.api.matchingservice.v1.ListTaskQueuePartitionsResponse.workflow_task_queue_partitions:type_name -> temporal.api.taskqueue.v1.TaskQueuePartitionMetadata - 97, // 91: temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.apply_public_request:type_name -> temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.ApplyPublicRequest - 98, // 92: temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.remove_build_ids:type_name -> temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.RemoveBuildIds - 133, // 93: temporal.server.api.matchingservice.v1.GetWorkerVersioningRulesRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest - 134, // 94: temporal.server.api.matchingservice.v1.GetWorkerVersioningRulesResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse - 135, // 95: temporal.server.api.matchingservice.v1.UpdateWorkerVersioningRulesRequest.request:type_name -> temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest - 136, // 96: temporal.server.api.matchingservice.v1.UpdateWorkerVersioningRulesResponse.response:type_name -> temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse - 137, // 97: temporal.server.api.matchingservice.v1.GetWorkerBuildIdCompatibilityRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest - 138, // 98: temporal.server.api.matchingservice.v1.GetWorkerBuildIdCompatibilityResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse - 126, // 99: temporal.server.api.matchingservice.v1.GetTaskQueueUserDataRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 139, // 100: temporal.server.api.matchingservice.v1.GetTaskQueueUserDataResponse.user_data:type_name -> temporal.server.api.persistence.v1.VersionedTaskQueueUserData - 140, // 101: temporal.server.api.matchingservice.v1.GetTaskQueueUserDataResponse.ephemeral_data:type_name -> temporal.server.api.taskqueue.v1.VersionedEphemeralData - 126, // 102: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.task_queue_types:type_name -> temporal.api.enums.v1.TaskQueueType - 141, // 103: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.update_version_data:type_name -> temporal.server.api.deployment.v1.DeploymentVersionData - 128, // 104: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.forget_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 142, // 105: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.update_routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig - 99, // 106: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.upsert_versions_data:type_name -> temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.UpsertVersionsDataEntry - 143, // 107: temporal.server.api.matchingservice.v1.ApplyTaskQueueUserDataReplicationEventRequest.user_data:type_name -> temporal.server.api.persistence.v1.TaskQueueUserData - 122, // 108: temporal.server.api.matchingservice.v1.ForceLoadTaskQueuePartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition - 126, // 109: temporal.server.api.matchingservice.v1.ForceUnloadTaskQueueRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 122, // 110: temporal.server.api.matchingservice.v1.ForceUnloadTaskQueuePartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition - 139, // 111: temporal.server.api.matchingservice.v1.UpdateTaskQueueUserDataRequest.user_data:type_name -> temporal.server.api.persistence.v1.VersionedTaskQueueUserData - 143, // 112: temporal.server.api.matchingservice.v1.ReplicateTaskQueueUserDataRequest.user_data:type_name -> temporal.server.api.persistence.v1.TaskQueueUserData - 106, // 113: temporal.server.api.matchingservice.v1.DispatchNexusTaskRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 144, // 114: temporal.server.api.matchingservice.v1.DispatchNexusTaskRequest.request:type_name -> temporal.api.nexus.v1.Request - 121, // 115: temporal.server.api.matchingservice.v1.DispatchNexusTaskRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo - 145, // 116: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.handler_error:type_name -> temporal.api.nexus.v1.HandlerError - 146, // 117: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.response:type_name -> temporal.api.nexus.v1.Response - 100, // 118: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.request_timeout:type_name -> temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.Timeout - 147, // 119: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.failure:type_name -> temporal.api.failure.v1.Failure - 148, // 120: temporal.server.api.matchingservice.v1.PollNexusTaskQueueRequest.request:type_name -> temporal.api.workflowservice.v1.PollNexusTaskQueueRequest - 87, // 121: temporal.server.api.matchingservice.v1.PollNexusTaskQueueRequest.conditions:type_name -> temporal.server.api.matchingservice.v1.PollConditions - 149, // 122: temporal.server.api.matchingservice.v1.PollNexusTaskQueueResponse.response:type_name -> temporal.api.workflowservice.v1.PollNexusTaskQueueResponse - 106, // 123: temporal.server.api.matchingservice.v1.RespondNexusTaskCompletedRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 150, // 124: temporal.server.api.matchingservice.v1.RespondNexusTaskCompletedRequest.request:type_name -> temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest - 106, // 125: temporal.server.api.matchingservice.v1.RespondNexusTaskFailedRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue - 151, // 126: temporal.server.api.matchingservice.v1.RespondNexusTaskFailedRequest.request:type_name -> temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest - 152, // 127: temporal.server.api.matchingservice.v1.CreateNexusEndpointRequest.spec:type_name -> temporal.server.api.persistence.v1.NexusEndpointSpec - 153, // 128: temporal.server.api.matchingservice.v1.CreateNexusEndpointResponse.entry:type_name -> temporal.server.api.persistence.v1.NexusEndpointEntry - 152, // 129: temporal.server.api.matchingservice.v1.UpdateNexusEndpointRequest.spec:type_name -> temporal.server.api.persistence.v1.NexusEndpointSpec - 153, // 130: temporal.server.api.matchingservice.v1.UpdateNexusEndpointResponse.entry:type_name -> temporal.server.api.persistence.v1.NexusEndpointEntry - 153, // 131: temporal.server.api.matchingservice.v1.ListNexusEndpointsResponse.entries:type_name -> temporal.server.api.persistence.v1.NexusEndpointEntry - 154, // 132: temporal.server.api.matchingservice.v1.RecordWorkerHeartbeatRequest.heartbeart_request:type_name -> temporal.api.workflowservice.v1.RecordWorkerHeartbeatRequest - 155, // 133: temporal.server.api.matchingservice.v1.ListWorkersRequest.list_request:type_name -> temporal.api.workflowservice.v1.ListWorkersRequest - 156, // 134: temporal.server.api.matchingservice.v1.ListWorkersResponse.workers_info:type_name -> temporal.api.worker.v1.WorkerInfo - 157, // 135: temporal.server.api.matchingservice.v1.ListWorkersResponse.workers:type_name -> temporal.api.worker.v1.WorkerListInfo - 158, // 136: temporal.server.api.matchingservice.v1.CountWorkersRequest.count_request:type_name -> temporal.api.workflowservice.v1.CountWorkersRequest - 159, // 137: temporal.server.api.matchingservice.v1.UpdateTaskQueueConfigRequest.update_taskqueue_config:type_name -> temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest - 160, // 138: temporal.server.api.matchingservice.v1.UpdateTaskQueueConfigResponse.updated_taskqueue_config:type_name -> temporal.api.taskqueue.v1.TaskQueueConfig - 161, // 139: temporal.server.api.matchingservice.v1.DescribeWorkerRequest.request:type_name -> temporal.api.workflowservice.v1.DescribeWorkerRequest - 156, // 140: temporal.server.api.matchingservice.v1.DescribeWorkerResponse.worker_info:type_name -> temporal.api.worker.v1.WorkerInfo - 126, // 141: temporal.server.api.matchingservice.v1.UpdateFairnessStateRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 162, // 142: temporal.server.api.matchingservice.v1.UpdateFairnessStateRequest.fairness_state:type_name -> temporal.server.api.enums.v1.FairnessState - 126, // 143: temporal.server.api.matchingservice.v1.CheckTaskQueueVersionMembershipRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 128, // 144: temporal.server.api.matchingservice.v1.CheckTaskQueueVersionMembershipRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 104, // 145: temporal.server.api.matchingservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery - 104, // 146: temporal.server.api.matchingservice.v1.PollWorkflowTaskQueueResponseWithRawHistory.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery - 116, // 147: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.Item.priority:type_name -> temporal.api.common.v1.Priority - 128, // 148: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.Item.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 126, // 149: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.VersionTaskQueue.type:type_name -> temporal.api.enums.v1.TaskQueueType - 126, // 150: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.type:type_name -> temporal.api.enums.v1.TaskQueueType - 163, // 151: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.stats:type_name -> temporal.api.taskqueue.v1.TaskQueueStats - 95, // 152: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.stats_by_priority_key:type_name -> temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.StatsByPriorityKeyEntry - 163, // 153: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.StatsByPriorityKeyEntry.value:type_name -> temporal.api.taskqueue.v1.TaskQueueStats - 164, // 154: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.VersionsInfoInternalEntry.value:type_name -> temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal - 165, // 155: temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.ApplyPublicRequest.request:type_name -> temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest - 166, // 156: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.UpsertVersionsDataEntry.value:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionData - 157, // [157:157] is the sub-list for method output_type - 157, // [157:157] is the sub-list for method input_type - 157, // [157:157] is the sub-list for extension type_name - 157, // [157:157] is the sub-list for extension extendee - 0, // [0:157] is the sub-list for field type_name + 122, // 50: temporal.server.api.matchingservice.v1.AddWorkflowTaskRequest.session_directive:type_name -> temporal.server.api.taskqueue.v1.TaskSessionDirective + 102, // 51: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.execution:type_name -> temporal.api.common.v1.WorkflowExecution + 106, // 52: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 114, // 53: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.schedule_to_start_timeout:type_name -> google.protobuf.Duration + 119, // 54: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.clock:type_name -> temporal.server.api.clock.v1.VectorClock + 120, // 55: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective + 121, // 56: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo + 116, // 57: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.priority:type_name -> temporal.api.common.v1.Priority + 122, // 58: temporal.server.api.matchingservice.v1.AddActivityTaskRequest.session_directive:type_name -> temporal.server.api.taskqueue.v1.TaskSessionDirective + 123, // 59: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition + 90, // 60: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.items:type_name -> temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.Item + 91, // 61: temporal.server.api.matchingservice.v1.GrantEagerDispatchResponse.items:type_name -> temporal.server.api.matchingservice.v1.GrantEagerDispatchResponse.Item + 106, // 62: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 124, // 63: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.query_request:type_name -> temporal.api.workflowservice.v1.QueryWorkflowRequest + 120, // 64: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.version_directive:type_name -> temporal.server.api.taskqueue.v1.TaskVersionDirective + 121, // 65: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo + 116, // 66: temporal.server.api.matchingservice.v1.QueryWorkflowRequest.priority:type_name -> temporal.api.common.v1.Priority + 113, // 67: temporal.server.api.matchingservice.v1.QueryWorkflowResponse.query_result:type_name -> temporal.api.common.v1.Payloads + 125, // 68: temporal.server.api.matchingservice.v1.QueryWorkflowResponse.query_rejected:type_name -> temporal.api.query.v1.QueryRejected + 106, // 69: temporal.server.api.matchingservice.v1.RespondQueryTaskCompletedRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 126, // 70: temporal.server.api.matchingservice.v1.RespondQueryTaskCompletedRequest.completed_request:type_name -> temporal.api.workflowservice.v1.RespondQueryTaskCompletedRequest + 127, // 71: temporal.server.api.matchingservice.v1.CancelOutstandingPollRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 106, // 72: temporal.server.api.matchingservice.v1.CancelOutstandingPollRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 106, // 73: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 127, // 74: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 123, // 75: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition + 123, // 76: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.partitions:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition + 92, // 77: temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.workers:type_name -> temporal.server.api.matchingservice.v1.CancelOutstandingWorkerPollsPartitionRequest.WorkerEntry + 128, // 78: temporal.server.api.matchingservice.v1.DescribeTaskQueueRequest.desc_request:type_name -> temporal.api.workflowservice.v1.DescribeTaskQueueRequest + 129, // 79: temporal.server.api.matchingservice.v1.DescribeTaskQueueRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 130, // 80: temporal.server.api.matchingservice.v1.DescribeTaskQueueResponse.desc_response:type_name -> temporal.api.workflowservice.v1.DescribeTaskQueueResponse + 127, // 81: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 106, // 82: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 129, // 83: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 93, // 84: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.version_task_queues:type_name -> temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.VersionTaskQueue + 94, // 85: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.version_task_queues:type_name -> temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue + 123, // 86: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition + 131, // 87: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionRequest.versions:type_name -> temporal.api.taskqueue.v1.TaskQueueVersionSelection + 96, // 88: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.versions_info_internal:type_name -> temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.VersionsInfoInternalEntry + 132, // 89: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.scale_info:type_name -> temporal.server.api.taskqueue.v1.PartitionScaleInfo + 106, // 90: temporal.server.api.matchingservice.v1.ListTaskQueuePartitionsRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 133, // 91: temporal.server.api.matchingservice.v1.ListTaskQueuePartitionsResponse.activity_task_queue_partitions:type_name -> temporal.api.taskqueue.v1.TaskQueuePartitionMetadata + 133, // 92: temporal.server.api.matchingservice.v1.ListTaskQueuePartitionsResponse.workflow_task_queue_partitions:type_name -> temporal.api.taskqueue.v1.TaskQueuePartitionMetadata + 97, // 93: temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.apply_public_request:type_name -> temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.ApplyPublicRequest + 98, // 94: temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.remove_build_ids:type_name -> temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.RemoveBuildIds + 134, // 95: temporal.server.api.matchingservice.v1.GetWorkerVersioningRulesRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkerVersioningRulesRequest + 135, // 96: temporal.server.api.matchingservice.v1.GetWorkerVersioningRulesResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkerVersioningRulesResponse + 136, // 97: temporal.server.api.matchingservice.v1.UpdateWorkerVersioningRulesRequest.request:type_name -> temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesRequest + 137, // 98: temporal.server.api.matchingservice.v1.UpdateWorkerVersioningRulesResponse.response:type_name -> temporal.api.workflowservice.v1.UpdateWorkerVersioningRulesResponse + 138, // 99: temporal.server.api.matchingservice.v1.GetWorkerBuildIdCompatibilityRequest.request:type_name -> temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityRequest + 139, // 100: temporal.server.api.matchingservice.v1.GetWorkerBuildIdCompatibilityResponse.response:type_name -> temporal.api.workflowservice.v1.GetWorkerBuildIdCompatibilityResponse + 127, // 101: temporal.server.api.matchingservice.v1.GetTaskQueueUserDataRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 140, // 102: temporal.server.api.matchingservice.v1.GetTaskQueueUserDataResponse.user_data:type_name -> temporal.server.api.persistence.v1.VersionedTaskQueueUserData + 141, // 103: temporal.server.api.matchingservice.v1.GetTaskQueueUserDataResponse.ephemeral_data:type_name -> temporal.server.api.taskqueue.v1.VersionedEphemeralData + 127, // 104: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.task_queue_types:type_name -> temporal.api.enums.v1.TaskQueueType + 142, // 105: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.update_version_data:type_name -> temporal.server.api.deployment.v1.DeploymentVersionData + 129, // 106: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.forget_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 143, // 107: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.update_routing_config:type_name -> temporal.api.deployment.v1.RoutingConfig + 99, // 108: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.upsert_versions_data:type_name -> temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.UpsertVersionsDataEntry + 144, // 109: temporal.server.api.matchingservice.v1.ApplyTaskQueueUserDataReplicationEventRequest.user_data:type_name -> temporal.server.api.persistence.v1.TaskQueueUserData + 123, // 110: temporal.server.api.matchingservice.v1.ForceLoadTaskQueuePartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition + 127, // 111: temporal.server.api.matchingservice.v1.ForceUnloadTaskQueueRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 123, // 112: temporal.server.api.matchingservice.v1.ForceUnloadTaskQueuePartitionRequest.task_queue_partition:type_name -> temporal.server.api.taskqueue.v1.TaskQueuePartition + 140, // 113: temporal.server.api.matchingservice.v1.UpdateTaskQueueUserDataRequest.user_data:type_name -> temporal.server.api.persistence.v1.VersionedTaskQueueUserData + 144, // 114: temporal.server.api.matchingservice.v1.ReplicateTaskQueueUserDataRequest.user_data:type_name -> temporal.server.api.persistence.v1.TaskQueueUserData + 106, // 115: temporal.server.api.matchingservice.v1.DispatchNexusTaskRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 145, // 116: temporal.server.api.matchingservice.v1.DispatchNexusTaskRequest.request:type_name -> temporal.api.nexus.v1.Request + 121, // 117: temporal.server.api.matchingservice.v1.DispatchNexusTaskRequest.forward_info:type_name -> temporal.server.api.taskqueue.v1.TaskForwardInfo + 146, // 118: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.handler_error:type_name -> temporal.api.nexus.v1.HandlerError + 147, // 119: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.response:type_name -> temporal.api.nexus.v1.Response + 100, // 120: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.request_timeout:type_name -> temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.Timeout + 148, // 121: temporal.server.api.matchingservice.v1.DispatchNexusTaskResponse.failure:type_name -> temporal.api.failure.v1.Failure + 149, // 122: temporal.server.api.matchingservice.v1.PollNexusTaskQueueRequest.request:type_name -> temporal.api.workflowservice.v1.PollNexusTaskQueueRequest + 87, // 123: temporal.server.api.matchingservice.v1.PollNexusTaskQueueRequest.conditions:type_name -> temporal.server.api.matchingservice.v1.PollConditions + 150, // 124: temporal.server.api.matchingservice.v1.PollNexusTaskQueueResponse.response:type_name -> temporal.api.workflowservice.v1.PollNexusTaskQueueResponse + 106, // 125: temporal.server.api.matchingservice.v1.RespondNexusTaskCompletedRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 151, // 126: temporal.server.api.matchingservice.v1.RespondNexusTaskCompletedRequest.request:type_name -> temporal.api.workflowservice.v1.RespondNexusTaskCompletedRequest + 106, // 127: temporal.server.api.matchingservice.v1.RespondNexusTaskFailedRequest.task_queue:type_name -> temporal.api.taskqueue.v1.TaskQueue + 152, // 128: temporal.server.api.matchingservice.v1.RespondNexusTaskFailedRequest.request:type_name -> temporal.api.workflowservice.v1.RespondNexusTaskFailedRequest + 153, // 129: temporal.server.api.matchingservice.v1.CreateNexusEndpointRequest.spec:type_name -> temporal.server.api.persistence.v1.NexusEndpointSpec + 154, // 130: temporal.server.api.matchingservice.v1.CreateNexusEndpointResponse.entry:type_name -> temporal.server.api.persistence.v1.NexusEndpointEntry + 153, // 131: temporal.server.api.matchingservice.v1.UpdateNexusEndpointRequest.spec:type_name -> temporal.server.api.persistence.v1.NexusEndpointSpec + 154, // 132: temporal.server.api.matchingservice.v1.UpdateNexusEndpointResponse.entry:type_name -> temporal.server.api.persistence.v1.NexusEndpointEntry + 154, // 133: temporal.server.api.matchingservice.v1.ListNexusEndpointsResponse.entries:type_name -> temporal.server.api.persistence.v1.NexusEndpointEntry + 155, // 134: temporal.server.api.matchingservice.v1.RecordWorkerHeartbeatRequest.heartbeart_request:type_name -> temporal.api.workflowservice.v1.RecordWorkerHeartbeatRequest + 156, // 135: temporal.server.api.matchingservice.v1.ListWorkersRequest.list_request:type_name -> temporal.api.workflowservice.v1.ListWorkersRequest + 157, // 136: temporal.server.api.matchingservice.v1.ListWorkersResponse.workers_info:type_name -> temporal.api.worker.v1.WorkerInfo + 158, // 137: temporal.server.api.matchingservice.v1.ListWorkersResponse.workers:type_name -> temporal.api.worker.v1.WorkerListInfo + 159, // 138: temporal.server.api.matchingservice.v1.CountWorkersRequest.count_request:type_name -> temporal.api.workflowservice.v1.CountWorkersRequest + 160, // 139: temporal.server.api.matchingservice.v1.UpdateTaskQueueConfigRequest.update_taskqueue_config:type_name -> temporal.api.workflowservice.v1.UpdateTaskQueueConfigRequest + 161, // 140: temporal.server.api.matchingservice.v1.UpdateTaskQueueConfigResponse.updated_taskqueue_config:type_name -> temporal.api.taskqueue.v1.TaskQueueConfig + 162, // 141: temporal.server.api.matchingservice.v1.DescribeWorkerRequest.request:type_name -> temporal.api.workflowservice.v1.DescribeWorkerRequest + 157, // 142: temporal.server.api.matchingservice.v1.DescribeWorkerResponse.worker_info:type_name -> temporal.api.worker.v1.WorkerInfo + 127, // 143: temporal.server.api.matchingservice.v1.UpdateFairnessStateRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 163, // 144: temporal.server.api.matchingservice.v1.UpdateFairnessStateRequest.fairness_state:type_name -> temporal.server.api.enums.v1.FairnessState + 127, // 145: temporal.server.api.matchingservice.v1.CheckTaskQueueVersionMembershipRequest.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 129, // 146: temporal.server.api.matchingservice.v1.CheckTaskQueueVersionMembershipRequest.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 104, // 147: temporal.server.api.matchingservice.v1.PollWorkflowTaskQueueResponse.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery + 104, // 148: temporal.server.api.matchingservice.v1.PollWorkflowTaskQueueResponseWithRawHistory.QueriesEntry.value:type_name -> temporal.api.query.v1.WorkflowQuery + 116, // 149: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.Item.priority:type_name -> temporal.api.common.v1.Priority + 129, // 150: temporal.server.api.matchingservice.v1.GrantEagerDispatchRequest.Item.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 127, // 151: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesRequest.VersionTaskQueue.type:type_name -> temporal.api.enums.v1.TaskQueueType + 127, // 152: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.type:type_name -> temporal.api.enums.v1.TaskQueueType + 164, // 153: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.stats:type_name -> temporal.api.taskqueue.v1.TaskQueueStats + 95, // 154: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.stats_by_priority_key:type_name -> temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.StatsByPriorityKeyEntry + 164, // 155: temporal.server.api.matchingservice.v1.DescribeVersionedTaskQueuesResponse.VersionTaskQueue.StatsByPriorityKeyEntry.value:type_name -> temporal.api.taskqueue.v1.TaskQueueStats + 165, // 156: temporal.server.api.matchingservice.v1.DescribeTaskQueuePartitionResponse.VersionsInfoInternalEntry.value:type_name -> temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal + 166, // 157: temporal.server.api.matchingservice.v1.UpdateWorkerBuildIdCompatibilityRequest.ApplyPublicRequest.request:type_name -> temporal.api.workflowservice.v1.UpdateWorkerBuildIdCompatibilityRequest + 167, // 158: temporal.server.api.matchingservice.v1.SyncDeploymentUserDataRequest.UpsertVersionsDataEntry.value:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersionData + 159, // [159:159] is the sub-list for method output_type + 159, // [159:159] is the sub-list for method input_type + 159, // [159:159] is the sub-list for extension type_name + 159, // [159:159] is the sub-list for extension extendee + 0, // [0:159] is the sub-list for field type_name } func init() { file_temporal_server_api_matchingservice_v1_request_response_proto_init() } diff --git a/api/taskqueue/v1/message.go-helpers.pb.go b/api/taskqueue/v1/message.go-helpers.pb.go index 1afb4f96f86..c215901a794 100644 --- a/api/taskqueue/v1/message.go-helpers.pb.go +++ b/api/taskqueue/v1/message.go-helpers.pb.go @@ -5,6 +5,43 @@ import ( "google.golang.org/protobuf/proto" ) +// Marshal an object of type TaskSessionDirective to the protobuf v3 wire format +func (val *TaskSessionDirective) Marshal() ([]byte, error) { + return proto.Marshal(val) +} + +// Unmarshal an object of type TaskSessionDirective from the protobuf v3 wire format +func (val *TaskSessionDirective) Unmarshal(buf []byte) error { + return proto.Unmarshal(buf, val) +} + +// Size returns the size of the object, in bytes, once serialized +func (val *TaskSessionDirective) Size() int { + return proto.Size(val) +} + +// Equal returns whether two TaskSessionDirective values are equivalent by recursively +// comparing the message's fields. +// For more information see the documentation for +// https://pkg.go.dev/google.golang.org/protobuf/proto#Equal +func (this *TaskSessionDirective) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + var that1 *TaskSessionDirective + switch t := that.(type) { + case *TaskSessionDirective: + that1 = t + case TaskSessionDirective: + that1 = &t + default: + return false + } + + return proto.Equal(this, that1) +} + // Marshal an object of type TaskVersionDirective to the protobuf v3 wire format func (val *TaskVersionDirective) Marshal() ([]byte, error) { return proto.Marshal(val) diff --git a/api/taskqueue/v1/message.pb.go b/api/taskqueue/v1/message.pb.go index e4320fffb85..0182ff677d5 100644 --- a/api/taskqueue/v1/message.pb.go +++ b/api/taskqueue/v1/message.pb.go @@ -29,6 +29,61 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// TaskSessionDirective describes the workflow session placement associated with a task. +type TaskSessionDirective struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Sticky task queue serving the workflow session. + WorkerQueue string `protobuf:"bytes,1,opt,name=worker_queue,json=workerQueue,proto3" json:"worker_queue,omitempty"` + // Whether the workflow is assigned to an exclusive worker, even if matching has not recorded that assignment yet. + IsExclusiveWorkerAssigned bool `protobuf:"varint,2,opt,name=is_exclusive_worker_assigned,json=isExclusiveWorkerAssigned,proto3" json:"is_exclusive_worker_assigned,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TaskSessionDirective) Reset() { + *x = TaskSessionDirective{} + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TaskSessionDirective) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TaskSessionDirective) ProtoMessage() {} + +func (x *TaskSessionDirective) ProtoReflect() protoreflect.Message { + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskSessionDirective.ProtoReflect.Descriptor instead. +func (*TaskSessionDirective) Descriptor() ([]byte, []int) { + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{0} +} + +func (x *TaskSessionDirective) GetWorkerQueue() string { + if x != nil { + return x.WorkerQueue + } + return "" +} + +func (x *TaskSessionDirective) GetIsExclusiveWorkerAssigned() bool { + if x != nil { + return x.IsExclusiveWorkerAssigned + } + return false +} + // TaskVersionDirective controls how matching should direct a task. type TaskVersionDirective struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -57,10 +112,11 @@ type TaskVersionDirective struct { // If there is no Ramping Version at the time of task dispatch, the Current Version will be used instead. // // If use_ramping_version is false, the Target Version is chosen with the default formula: - // if calcRampThreshold(workflow_id) <= ramp_percentage: - // target=ramping_version - // else: - // target=current_version + // + // if calcRampThreshold(workflow_id) <= ramp_percentage: + // target=ramping_version + // else: + // target=current_version UseRampingVersion bool `protobuf:"varint,7,opt,name=use_ramping_version,json=useRampingVersion,proto3" json:"use_ramping_version,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -68,7 +124,7 @@ type TaskVersionDirective struct { func (x *TaskVersionDirective) Reset() { *x = TaskVersionDirective{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -80,7 +136,7 @@ func (x *TaskVersionDirective) String() string { func (*TaskVersionDirective) ProtoMessage() {} func (x *TaskVersionDirective) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -93,7 +149,7 @@ func (x *TaskVersionDirective) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskVersionDirective.ProtoReflect.Descriptor instead. func (*TaskVersionDirective) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{0} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{1} } func (x *TaskVersionDirective) GetBuildId() isTaskVersionDirective_BuildId { @@ -188,7 +244,7 @@ type FairLevel struct { func (x *FairLevel) Reset() { *x = FairLevel{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[1] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -200,7 +256,7 @@ func (x *FairLevel) String() string { func (*FairLevel) ProtoMessage() {} func (x *FairLevel) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[1] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -213,7 +269,7 @@ func (x *FairLevel) ProtoReflect() protoreflect.Message { // Deprecated: Use FairLevel.ProtoReflect.Descriptor instead. func (*FairLevel) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{1} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{2} } func (x *FairLevel) GetTaskPass() int64 { @@ -258,7 +314,7 @@ type InternalTaskQueueStatus struct { func (x *InternalTaskQueueStatus) Reset() { *x = InternalTaskQueueStatus{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[2] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -270,7 +326,7 @@ func (x *InternalTaskQueueStatus) String() string { func (*InternalTaskQueueStatus) ProtoMessage() {} func (x *InternalTaskQueueStatus) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[2] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -283,7 +339,7 @@ func (x *InternalTaskQueueStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use InternalTaskQueueStatus.ProtoReflect.Descriptor instead. func (*InternalTaskQueueStatus) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{2} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{3} } func (x *InternalTaskQueueStatus) GetReadLevel() int64 { @@ -379,7 +435,7 @@ type TaskQueueVersionInfoInternal struct { func (x *TaskQueueVersionInfoInternal) Reset() { *x = TaskQueueVersionInfoInternal{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[3] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -391,7 +447,7 @@ func (x *TaskQueueVersionInfoInternal) String() string { func (*TaskQueueVersionInfoInternal) ProtoMessage() {} func (x *TaskQueueVersionInfoInternal) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[3] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -404,7 +460,7 @@ func (x *TaskQueueVersionInfoInternal) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskQueueVersionInfoInternal.ProtoReflect.Descriptor instead. func (*TaskQueueVersionInfoInternal) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{3} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{4} } func (x *TaskQueueVersionInfoInternal) GetPhysicalTaskQueueInfo() *PhysicalTaskQueueInfo { @@ -421,7 +477,8 @@ type PhysicalTaskQueueInfo struct { InternalTaskQueueStatus []*InternalTaskQueueStatus `protobuf:"bytes,3,rep,name=internal_task_queue_status,json=internalTaskQueueStatus,proto3" json:"internal_task_queue_status,omitempty"` TaskQueueStats *v13.TaskQueueStats `protobuf:"bytes,2,opt,name=task_queue_stats,json=taskQueueStats,proto3" json:"task_queue_stats,omitempty"` // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "by" is used to clarify the keys. --) + // + // aip.dev/not-precedent: "by" is used to clarify the keys. --) TaskQueueStatsByPriorityKey map[int32]*v13.TaskQueueStats `protobuf:"bytes,4,rep,name=task_queue_stats_by_priority_key,json=taskQueueStatsByPriorityKey,proto3" json:"task_queue_stats_by_priority_key,omitempty" protobuf_key:"varint,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -429,7 +486,7 @@ type PhysicalTaskQueueInfo struct { func (x *PhysicalTaskQueueInfo) Reset() { *x = PhysicalTaskQueueInfo{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[4] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -441,7 +498,7 @@ func (x *PhysicalTaskQueueInfo) String() string { func (*PhysicalTaskQueueInfo) ProtoMessage() {} func (x *PhysicalTaskQueueInfo) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[4] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -454,7 +511,7 @@ func (x *PhysicalTaskQueueInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PhysicalTaskQueueInfo.ProtoReflect.Descriptor instead. func (*PhysicalTaskQueueInfo) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{4} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{5} } func (x *PhysicalTaskQueueInfo) GetPollers() []*v13.PollerInfo { @@ -506,7 +563,7 @@ type TaskQueuePartition struct { func (x *TaskQueuePartition) Reset() { *x = TaskQueuePartition{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[5] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -518,7 +575,7 @@ func (x *TaskQueuePartition) String() string { func (*TaskQueuePartition) ProtoMessage() {} func (x *TaskQueuePartition) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[5] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -531,7 +588,7 @@ func (x *TaskQueuePartition) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskQueuePartition.ProtoReflect.Descriptor instead. func (*TaskQueuePartition) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{5} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{6} } func (x *TaskQueuePartition) GetTaskQueue() string { @@ -612,7 +669,7 @@ type WorkerCommandsPartitionId struct { func (x *WorkerCommandsPartitionId) Reset() { *x = WorkerCommandsPartitionId{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[6] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -624,7 +681,7 @@ func (x *WorkerCommandsPartitionId) String() string { func (*WorkerCommandsPartitionId) ProtoMessage() {} func (x *WorkerCommandsPartitionId) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[6] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -637,7 +694,7 @@ func (x *WorkerCommandsPartitionId) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkerCommandsPartitionId.ProtoReflect.Descriptor instead. func (*WorkerCommandsPartitionId) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{6} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{7} } // Information about redirect intention sent by Matching to History in Record*TaskStarted calls. @@ -654,7 +711,7 @@ type BuildIdRedirectInfo struct { func (x *BuildIdRedirectInfo) Reset() { *x = BuildIdRedirectInfo{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[7] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -666,7 +723,7 @@ func (x *BuildIdRedirectInfo) String() string { func (*BuildIdRedirectInfo) ProtoMessage() {} func (x *BuildIdRedirectInfo) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[7] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -679,7 +736,7 @@ func (x *BuildIdRedirectInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildIdRedirectInfo.ProtoReflect.Descriptor instead. func (*BuildIdRedirectInfo) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{7} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{8} } func (x *BuildIdRedirectInfo) GetAssignedBuildId() string { @@ -721,7 +778,7 @@ type TaskForwardInfo struct { func (x *TaskForwardInfo) Reset() { *x = TaskForwardInfo{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[8] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -733,7 +790,7 @@ func (x *TaskForwardInfo) String() string { func (*TaskForwardInfo) ProtoMessage() {} func (x *TaskForwardInfo) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[8] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -746,7 +803,7 @@ func (x *TaskForwardInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskForwardInfo.ProtoReflect.Descriptor instead. func (*TaskForwardInfo) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{8} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{9} } func (x *TaskForwardInfo) GetSourcePartition() string { @@ -813,7 +870,7 @@ type EphemeralData struct { func (x *EphemeralData) Reset() { *x = EphemeralData{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[9] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -825,7 +882,7 @@ func (x *EphemeralData) String() string { func (*EphemeralData) ProtoMessage() {} func (x *EphemeralData) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[9] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -838,7 +895,7 @@ func (x *EphemeralData) ProtoReflect() protoreflect.Message { // Deprecated: Use EphemeralData.ProtoReflect.Descriptor instead. func (*EphemeralData) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{9} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{10} } func (x *EphemeralData) GetPartition() []*EphemeralData_ByPartition { @@ -865,7 +922,7 @@ type VersionedEphemeralData struct { func (x *VersionedEphemeralData) Reset() { *x = VersionedEphemeralData{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[10] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -877,7 +934,7 @@ func (x *VersionedEphemeralData) String() string { func (*VersionedEphemeralData) ProtoMessage() {} func (x *VersionedEphemeralData) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[10] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -890,7 +947,7 @@ func (x *VersionedEphemeralData) ProtoReflect() protoreflect.Message { // Deprecated: Use VersionedEphemeralData.ProtoReflect.Descriptor instead. func (*VersionedEphemeralData) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{10} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{11} } func (x *VersionedEphemeralData) GetData() *EphemeralData { @@ -928,7 +985,7 @@ type PartitionScaleInfo struct { func (x *PartitionScaleInfo) Reset() { *x = PartitionScaleInfo{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[11] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -940,7 +997,7 @@ func (x *PartitionScaleInfo) String() string { func (*PartitionScaleInfo) ProtoMessage() {} func (x *PartitionScaleInfo) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[11] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -953,7 +1010,7 @@ func (x *PartitionScaleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PartitionScaleInfo.ProtoReflect.Descriptor instead. func (*PartitionScaleInfo) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{11} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{12} } func (x *PartitionScaleInfo) GetRead() int32 { @@ -1007,7 +1064,7 @@ type ClientPartitionCounts struct { func (x *ClientPartitionCounts) Reset() { *x = ClientPartitionCounts{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[12] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1019,7 +1076,7 @@ func (x *ClientPartitionCounts) String() string { func (*ClientPartitionCounts) ProtoMessage() {} func (x *ClientPartitionCounts) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[12] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1032,7 +1089,7 @@ func (x *ClientPartitionCounts) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientPartitionCounts.ProtoReflect.Descriptor instead. func (*ClientPartitionCounts) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{12} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{13} } func (x *ClientPartitionCounts) GetRead() int32 { @@ -1077,7 +1134,7 @@ type EphemeralData_ByVersion struct { func (x *EphemeralData_ByVersion) Reset() { *x = EphemeralData_ByVersion{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[14] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1089,7 +1146,7 @@ func (x *EphemeralData_ByVersion) String() string { func (*EphemeralData_ByVersion) ProtoMessage() {} func (x *EphemeralData_ByVersion) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[14] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1102,7 +1159,7 @@ func (x *EphemeralData_ByVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use EphemeralData_ByVersion.ProtoReflect.Descriptor instead. func (*EphemeralData_ByVersion) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{9, 0} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{10, 0} } func (x *EphemeralData_ByVersion) GetVersion() *v12.WorkerDeploymentVersion { @@ -1129,7 +1186,7 @@ type EphemeralData_ByPartition struct { func (x *EphemeralData_ByPartition) Reset() { *x = EphemeralData_ByPartition{} - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[15] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1141,7 +1198,7 @@ func (x *EphemeralData_ByPartition) String() string { func (*EphemeralData_ByPartition) ProtoMessage() {} func (x *EphemeralData_ByPartition) ProtoReflect() protoreflect.Message { - mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[15] + mi := &file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1154,7 +1211,7 @@ func (x *EphemeralData_ByPartition) ProtoReflect() protoreflect.Message { // Deprecated: Use EphemeralData_ByPartition.ProtoReflect.Descriptor instead. func (*EphemeralData_ByPartition) Descriptor() ([]byte, []int) { - return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{9, 1} + return file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP(), []int{10, 1} } func (x *EphemeralData_ByPartition) GetPartition() int32 { @@ -1175,7 +1232,10 @@ var File_temporal_server_api_taskqueue_v1_message_proto protoreflect.FileDescrip const file_temporal_server_api_taskqueue_v1_message_proto_rawDesc = "" + "\n" + - ".temporal/server/api/taskqueue/v1/message.proto\x12 temporal.server.api.taskqueue.v1\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a(temporal/api/deployment/v1/message.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a'temporal/api/taskqueue/v1/message.proto\x1a/temporal/server/api/deployment/v1/message.proto\x1a'temporal/server/api/enums/v1/task.proto\"\xef\x03\n" + + ".temporal/server/api/taskqueue/v1/message.proto\x12 temporal.server.api.taskqueue.v1\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a(temporal/api/deployment/v1/message.proto\x1a&temporal/api/enums/v1/task_queue.proto\x1a$temporal/api/enums/v1/workflow.proto\x1a'temporal/api/taskqueue/v1/message.proto\x1a/temporal/server/api/deployment/v1/message.proto\x1a'temporal/server/api/enums/v1/task.proto\"z\n" + + "\x14TaskSessionDirective\x12!\n" + + "\fworker_queue\x18\x01 \x01(\tR\vworkerQueue\x12?\n" + + "\x1cis_exclusive_worker_assigned\x18\x02 \x01(\bR\x19isExclusiveWorkerAssigned\"\xef\x03\n" + "\x14TaskVersionDirective\x12J\n" + "\x14use_assignment_rules\x18\x01 \x01(\v2\x16.google.protobuf.EmptyH\x00R\x12useAssignmentRules\x12,\n" + "\x11assigned_build_id\x18\x02 \x01(\tH\x00R\x0fassignedBuildId\x12E\n" + @@ -1277,60 +1337,61 @@ func file_temporal_server_api_taskqueue_v1_message_proto_rawDescGZIP() []byte { return file_temporal_server_api_taskqueue_v1_message_proto_rawDescData } -var file_temporal_server_api_taskqueue_v1_message_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_temporal_server_api_taskqueue_v1_message_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_temporal_server_api_taskqueue_v1_message_proto_goTypes = []any{ - (*TaskVersionDirective)(nil), // 0: temporal.server.api.taskqueue.v1.TaskVersionDirective - (*FairLevel)(nil), // 1: temporal.server.api.taskqueue.v1.FairLevel - (*InternalTaskQueueStatus)(nil), // 2: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus - (*TaskQueueVersionInfoInternal)(nil), // 3: temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal - (*PhysicalTaskQueueInfo)(nil), // 4: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo - (*TaskQueuePartition)(nil), // 5: temporal.server.api.taskqueue.v1.TaskQueuePartition - (*WorkerCommandsPartitionId)(nil), // 6: temporal.server.api.taskqueue.v1.WorkerCommandsPartitionId - (*BuildIdRedirectInfo)(nil), // 7: temporal.server.api.taskqueue.v1.BuildIdRedirectInfo - (*TaskForwardInfo)(nil), // 8: temporal.server.api.taskqueue.v1.TaskForwardInfo - (*EphemeralData)(nil), // 9: temporal.server.api.taskqueue.v1.EphemeralData - (*VersionedEphemeralData)(nil), // 10: temporal.server.api.taskqueue.v1.VersionedEphemeralData - (*PartitionScaleInfo)(nil), // 11: temporal.server.api.taskqueue.v1.PartitionScaleInfo - (*ClientPartitionCounts)(nil), // 12: temporal.server.api.taskqueue.v1.ClientPartitionCounts - nil, // 13: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.TaskQueueStatsByPriorityKeyEntry - (*EphemeralData_ByVersion)(nil), // 14: temporal.server.api.taskqueue.v1.EphemeralData.ByVersion - (*EphemeralData_ByPartition)(nil), // 15: temporal.server.api.taskqueue.v1.EphemeralData.ByPartition - (*emptypb.Empty)(nil), // 16: google.protobuf.Empty - (v1.VersioningBehavior)(0), // 17: temporal.api.enums.v1.VersioningBehavior - (*v11.Deployment)(nil), // 18: temporal.api.deployment.v1.Deployment - (*v12.WorkerDeploymentVersion)(nil), // 19: temporal.server.api.deployment.v1.WorkerDeploymentVersion - (*v13.TaskIdBlock)(nil), // 20: temporal.api.taskqueue.v1.TaskIdBlock - (*v13.PollerInfo)(nil), // 21: temporal.api.taskqueue.v1.PollerInfo - (*v13.TaskQueueStats)(nil), // 22: temporal.api.taskqueue.v1.TaskQueueStats - (v1.TaskQueueType)(0), // 23: temporal.api.enums.v1.TaskQueueType - (v14.TaskSource)(0), // 24: temporal.server.api.enums.v1.TaskSource - (*timestamppb.Timestamp)(nil), // 25: google.protobuf.Timestamp + (*TaskSessionDirective)(nil), // 0: temporal.server.api.taskqueue.v1.TaskSessionDirective + (*TaskVersionDirective)(nil), // 1: temporal.server.api.taskqueue.v1.TaskVersionDirective + (*FairLevel)(nil), // 2: temporal.server.api.taskqueue.v1.FairLevel + (*InternalTaskQueueStatus)(nil), // 3: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus + (*TaskQueueVersionInfoInternal)(nil), // 4: temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal + (*PhysicalTaskQueueInfo)(nil), // 5: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo + (*TaskQueuePartition)(nil), // 6: temporal.server.api.taskqueue.v1.TaskQueuePartition + (*WorkerCommandsPartitionId)(nil), // 7: temporal.server.api.taskqueue.v1.WorkerCommandsPartitionId + (*BuildIdRedirectInfo)(nil), // 8: temporal.server.api.taskqueue.v1.BuildIdRedirectInfo + (*TaskForwardInfo)(nil), // 9: temporal.server.api.taskqueue.v1.TaskForwardInfo + (*EphemeralData)(nil), // 10: temporal.server.api.taskqueue.v1.EphemeralData + (*VersionedEphemeralData)(nil), // 11: temporal.server.api.taskqueue.v1.VersionedEphemeralData + (*PartitionScaleInfo)(nil), // 12: temporal.server.api.taskqueue.v1.PartitionScaleInfo + (*ClientPartitionCounts)(nil), // 13: temporal.server.api.taskqueue.v1.ClientPartitionCounts + nil, // 14: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.TaskQueueStatsByPriorityKeyEntry + (*EphemeralData_ByVersion)(nil), // 15: temporal.server.api.taskqueue.v1.EphemeralData.ByVersion + (*EphemeralData_ByPartition)(nil), // 16: temporal.server.api.taskqueue.v1.EphemeralData.ByPartition + (*emptypb.Empty)(nil), // 17: google.protobuf.Empty + (v1.VersioningBehavior)(0), // 18: temporal.api.enums.v1.VersioningBehavior + (*v11.Deployment)(nil), // 19: temporal.api.deployment.v1.Deployment + (*v12.WorkerDeploymentVersion)(nil), // 20: temporal.server.api.deployment.v1.WorkerDeploymentVersion + (*v13.TaskIdBlock)(nil), // 21: temporal.api.taskqueue.v1.TaskIdBlock + (*v13.PollerInfo)(nil), // 22: temporal.api.taskqueue.v1.PollerInfo + (*v13.TaskQueueStats)(nil), // 23: temporal.api.taskqueue.v1.TaskQueueStats + (v1.TaskQueueType)(0), // 24: temporal.api.enums.v1.TaskQueueType + (v14.TaskSource)(0), // 25: temporal.server.api.enums.v1.TaskSource + (*timestamppb.Timestamp)(nil), // 26: google.protobuf.Timestamp } var file_temporal_server_api_taskqueue_v1_message_proto_depIdxs = []int32{ - 16, // 0: temporal.server.api.taskqueue.v1.TaskVersionDirective.use_assignment_rules:type_name -> google.protobuf.Empty - 17, // 1: temporal.server.api.taskqueue.v1.TaskVersionDirective.behavior:type_name -> temporal.api.enums.v1.VersioningBehavior - 18, // 2: temporal.server.api.taskqueue.v1.TaskVersionDirective.deployment:type_name -> temporal.api.deployment.v1.Deployment - 19, // 3: temporal.server.api.taskqueue.v1.TaskVersionDirective.deployment_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 1, // 4: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.fair_read_level:type_name -> temporal.server.api.taskqueue.v1.FairLevel - 1, // 5: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.fair_ack_level:type_name -> temporal.server.api.taskqueue.v1.FairLevel - 20, // 6: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.task_id_block:type_name -> temporal.api.taskqueue.v1.TaskIdBlock - 1, // 7: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.fair_max_read_level:type_name -> temporal.server.api.taskqueue.v1.FairLevel - 4, // 8: temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal.physical_task_queue_info:type_name -> temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo - 21, // 9: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.pollers:type_name -> temporal.api.taskqueue.v1.PollerInfo - 2, // 10: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.internal_task_queue_status:type_name -> temporal.server.api.taskqueue.v1.InternalTaskQueueStatus - 22, // 11: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.task_queue_stats:type_name -> temporal.api.taskqueue.v1.TaskQueueStats - 13, // 12: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.task_queue_stats_by_priority_key:type_name -> temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.TaskQueueStatsByPriorityKeyEntry - 23, // 13: temporal.server.api.taskqueue.v1.TaskQueuePartition.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType - 6, // 14: temporal.server.api.taskqueue.v1.TaskQueuePartition.worker_commands:type_name -> temporal.server.api.taskqueue.v1.WorkerCommandsPartitionId - 24, // 15: temporal.server.api.taskqueue.v1.TaskForwardInfo.task_source:type_name -> temporal.server.api.enums.v1.TaskSource - 25, // 16: temporal.server.api.taskqueue.v1.TaskForwardInfo.create_time:type_name -> google.protobuf.Timestamp - 7, // 17: temporal.server.api.taskqueue.v1.TaskForwardInfo.redirect_info:type_name -> temporal.server.api.taskqueue.v1.BuildIdRedirectInfo - 15, // 18: temporal.server.api.taskqueue.v1.EphemeralData.partition:type_name -> temporal.server.api.taskqueue.v1.EphemeralData.ByPartition - 11, // 19: temporal.server.api.taskqueue.v1.EphemeralData.scale:type_name -> temporal.server.api.taskqueue.v1.PartitionScaleInfo - 9, // 20: temporal.server.api.taskqueue.v1.VersionedEphemeralData.data:type_name -> temporal.server.api.taskqueue.v1.EphemeralData - 22, // 21: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.TaskQueueStatsByPriorityKeyEntry.value:type_name -> temporal.api.taskqueue.v1.TaskQueueStats - 19, // 22: temporal.server.api.taskqueue.v1.EphemeralData.ByVersion.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion - 14, // 23: temporal.server.api.taskqueue.v1.EphemeralData.ByPartition.version:type_name -> temporal.server.api.taskqueue.v1.EphemeralData.ByVersion + 17, // 0: temporal.server.api.taskqueue.v1.TaskVersionDirective.use_assignment_rules:type_name -> google.protobuf.Empty + 18, // 1: temporal.server.api.taskqueue.v1.TaskVersionDirective.behavior:type_name -> temporal.api.enums.v1.VersioningBehavior + 19, // 2: temporal.server.api.taskqueue.v1.TaskVersionDirective.deployment:type_name -> temporal.api.deployment.v1.Deployment + 20, // 3: temporal.server.api.taskqueue.v1.TaskVersionDirective.deployment_version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 2, // 4: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.fair_read_level:type_name -> temporal.server.api.taskqueue.v1.FairLevel + 2, // 5: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.fair_ack_level:type_name -> temporal.server.api.taskqueue.v1.FairLevel + 21, // 6: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.task_id_block:type_name -> temporal.api.taskqueue.v1.TaskIdBlock + 2, // 7: temporal.server.api.taskqueue.v1.InternalTaskQueueStatus.fair_max_read_level:type_name -> temporal.server.api.taskqueue.v1.FairLevel + 5, // 8: temporal.server.api.taskqueue.v1.TaskQueueVersionInfoInternal.physical_task_queue_info:type_name -> temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo + 22, // 9: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.pollers:type_name -> temporal.api.taskqueue.v1.PollerInfo + 3, // 10: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.internal_task_queue_status:type_name -> temporal.server.api.taskqueue.v1.InternalTaskQueueStatus + 23, // 11: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.task_queue_stats:type_name -> temporal.api.taskqueue.v1.TaskQueueStats + 14, // 12: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.task_queue_stats_by_priority_key:type_name -> temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.TaskQueueStatsByPriorityKeyEntry + 24, // 13: temporal.server.api.taskqueue.v1.TaskQueuePartition.task_queue_type:type_name -> temporal.api.enums.v1.TaskQueueType + 7, // 14: temporal.server.api.taskqueue.v1.TaskQueuePartition.worker_commands:type_name -> temporal.server.api.taskqueue.v1.WorkerCommandsPartitionId + 25, // 15: temporal.server.api.taskqueue.v1.TaskForwardInfo.task_source:type_name -> temporal.server.api.enums.v1.TaskSource + 26, // 16: temporal.server.api.taskqueue.v1.TaskForwardInfo.create_time:type_name -> google.protobuf.Timestamp + 8, // 17: temporal.server.api.taskqueue.v1.TaskForwardInfo.redirect_info:type_name -> temporal.server.api.taskqueue.v1.BuildIdRedirectInfo + 16, // 18: temporal.server.api.taskqueue.v1.EphemeralData.partition:type_name -> temporal.server.api.taskqueue.v1.EphemeralData.ByPartition + 12, // 19: temporal.server.api.taskqueue.v1.EphemeralData.scale:type_name -> temporal.server.api.taskqueue.v1.PartitionScaleInfo + 10, // 20: temporal.server.api.taskqueue.v1.VersionedEphemeralData.data:type_name -> temporal.server.api.taskqueue.v1.EphemeralData + 23, // 21: temporal.server.api.taskqueue.v1.PhysicalTaskQueueInfo.TaskQueueStatsByPriorityKeyEntry.value:type_name -> temporal.api.taskqueue.v1.TaskQueueStats + 20, // 22: temporal.server.api.taskqueue.v1.EphemeralData.ByVersion.version:type_name -> temporal.server.api.deployment.v1.WorkerDeploymentVersion + 15, // 23: temporal.server.api.taskqueue.v1.EphemeralData.ByPartition.version:type_name -> temporal.server.api.taskqueue.v1.EphemeralData.ByVersion 24, // [24:24] is the sub-list for method output_type 24, // [24:24] is the sub-list for method input_type 24, // [24:24] is the sub-list for extension type_name @@ -1343,11 +1404,11 @@ func file_temporal_server_api_taskqueue_v1_message_proto_init() { if File_temporal_server_api_taskqueue_v1_message_proto != nil { return } - file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[0].OneofWrappers = []any{ + file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[1].OneofWrappers = []any{ (*TaskVersionDirective_UseAssignmentRules)(nil), (*TaskVersionDirective_AssignedBuildId)(nil), } - file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[5].OneofWrappers = []any{ + file_temporal_server_api_taskqueue_v1_message_proto_msgTypes[6].OneofWrappers = []any{ (*TaskQueuePartition_NormalPartitionId)(nil), (*TaskQueuePartition_StickyName)(nil), (*TaskQueuePartition_WorkerCommands)(nil), @@ -1358,7 +1419,7 @@ func file_temporal_server_api_taskqueue_v1_message_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_temporal_server_api_taskqueue_v1_message_proto_rawDesc), len(file_temporal_server_api_taskqueue_v1_message_proto_rawDesc)), NumEnums: 0, - NumMessages: 16, + NumMessages: 17, NumExtensions: 0, NumServices: 0, }, diff --git a/client/matching/client_gen.go b/client/matching/client_gen.go index 4b5d05f49ed..fc1b1d6abbe 100644 --- a/client/matching/client_gen.go +++ b/client/matching/client_gen.go @@ -58,6 +58,7 @@ func (c *clientImpl) doAddActivityTask( Stamp: request.Stamp, Priority: request.Priority, ComponentRef: request.ComponentRef, + SessionDirective: request.SessionDirective, } targetPartition, estimatedTasksAllPartitions := c.loadBalancer.PickWritePartition(p.TaskQueue(), pc) @@ -114,6 +115,7 @@ func (c *clientImpl) doAddWorkflowTask( ForwardInfo: request.ForwardInfo, Priority: request.Priority, Stamp: request.Stamp, + SessionDirective: request.SessionDirective, } targetPartition, estimatedTasksAllPartitions := c.loadBalancer.PickWritePartition(p.TaskQueue(), pc) diff --git a/client/matching/client_test.go b/client/matching/client_test.go index db2f2b49fb6..263c3bd8d68 100644 --- a/client/matching/client_test.go +++ b/client/matching/client_test.go @@ -194,14 +194,16 @@ func TestDoAddWorkflowTask_LoadBalancedRoot(t *testing.T) { loadBalancer := &testLoadBalancer{writePartition: selectedPartition, writeEstimate: 17} client := newTestClient(cache, loadBalancer) request := &matchingservice.AddWorkflowTaskRequest{ - NamespaceId: testNamespaceID, - TaskQueue: &taskqueuepb.TaskQueue{Name: testTaskQueueName}, + NamespaceId: testNamespaceID, + TaskQueue: &taskqueuepb.TaskQueue{Name: testTaskQueueName}, + SessionDirective: &taskqueuespb.TaskSessionDirective{WorkerQueue: "worker", IsExclusiveWorkerAssigned: true}, } response := &matchingservice.AddWorkflowTaskResponse{} serviceClient.EXPECT().AddWorkflowTask(gomock.Any(), gomock.Any()).DoAndReturn( func(ctx context.Context, outgoing *matchingservice.AddWorkflowTaskRequest, _ ...grpc.CallOption) (*matchingservice.AddWorkflowTaskResponse, error) { require.Equal(t, selectedPartition.RpcName(), outgoing.GetTaskQueue().GetName()) + protorequire.ProtoEqual(t, request.GetSessionDirective(), outgoing.GetSessionDirective()) outgoingMetadata, ok := metadata.FromOutgoingContext(ctx) require.True(t, ok) require.Equal(t, []string{"17"}, outgoingMetadata.Get(estimatedTasksAllPartitionsHeaderName)) diff --git a/proto/internal/temporal/server/api/matchingservice/v1/request_response.proto b/proto/internal/temporal/server/api/matchingservice/v1/request_response.proto index 9df73f816e7..0cce005e68f 100644 --- a/proto/internal/temporal/server/api/matchingservice/v1/request_response.proto +++ b/proto/internal/temporal/server/api/matchingservice/v1/request_response.proto @@ -168,6 +168,8 @@ message AddWorkflowTaskRequest { temporal.api.common.v1.Priority priority = 12; // Stamp value from when the workflow task was scheduled. Used to validate the task is still relevant. int32 stamp = 13; + // Session placement associated with this task, if any. + temporal.server.api.taskqueue.v1.TaskSessionDirective session_directive = 14; } message AddWorkflowTaskResponse { @@ -196,6 +198,8 @@ message AddActivityTaskRequest { // necessary start information is carried within this component, obviating the need to use the fields that apply to // embedded activities. bytes component_ref = 14; + // Session placement associated with this task, if any. + temporal.server.api.taskqueue.v1.TaskSessionDirective session_directive = 15; } message AddActivityTaskResponse { diff --git a/proto/internal/temporal/server/api/taskqueue/v1/message.proto b/proto/internal/temporal/server/api/taskqueue/v1/message.proto index 9add70e7a6b..988f91ff55a 100644 --- a/proto/internal/temporal/server/api/taskqueue/v1/message.proto +++ b/proto/internal/temporal/server/api/taskqueue/v1/message.proto @@ -13,6 +13,14 @@ import "temporal/server/api/enums/v1/task.proto"; option go_package = "go.temporal.io/server/api/taskqueue/v1;taskqueue"; +// TaskSessionDirective describes the workflow session placement associated with a task. +message TaskSessionDirective { + // Sticky task queue serving the workflow session. + string worker_queue = 1; + // Whether the workflow is assigned to an exclusive worker, even if matching has not recorded that assignment yet. + bool is_exclusive_worker_assigned = 2; +} + // TaskVersionDirective controls how matching should direct a task. message TaskVersionDirective { // Default (if build_id is not present) is "unversioned": diff --git a/service/history/api/updateworkflow/api.go b/service/history/api/updateworkflow/api.go index 2e7a5694b92..48b0ea0dd7a 100644 --- a/service/history/api/updateworkflow/api.go +++ b/service/history/api/updateworkflow/api.go @@ -55,6 +55,7 @@ type Updater struct { scheduledEventID int64 scheduleToStartTimeout time.Duration workflowTaskStamp int32 + exclusiveWorker bool // requestIDLink is the projected requestIDRef link for requests that have- or will have on acceptance- // an event in history. It is set in ApplyRequest because deriving it needs MutableState, which // OnSuccess doesn't have. See [Updater.responseLink] for details. @@ -229,6 +230,7 @@ func (u *Updater) applyRequest( } u.taskQueue = common.CloneProto(newWorkflowTask.TaskQueue) + u.exclusiveWorker = ms.GetExecutionInfo().GetSessionState().GetExclusiveWorker() u.priority = common.CloneProto(ms.GetExecutionInfo().Priority) u.normalTaskQueueName = ms.GetExecutionInfo().TaskQueue u.directive = worker_versioning.MakeDirectiveForWorkflowTask( @@ -421,6 +423,7 @@ func (u *Updater) addWorkflowTaskToMatching(ctx context.Context) error { RunId: u.wfKey.RunID, }, TaskQueue: u.taskQueue, + SessionDirective: workflow.TaskSessionDirective(u.exclusiveWorker, u.taskQueue), ScheduledEventId: u.scheduledEventID, ScheduleToStartTimeout: durationpb.New(u.scheduleToStartTimeout), Clock: clock, diff --git a/service/history/ndc_standby_task_util.go b/service/history/ndc_standby_task_util.go index ee45958ad82..4dade94bf46 100644 --- a/service/history/ndc_standby_task_util.go +++ b/service/history/ndc_standby_task_util.go @@ -184,6 +184,7 @@ type ( activityTaskScheduleToStartTimeout time.Duration versionDirective *taskqueuespb.TaskVersionDirective priority *commonpb.Priority + singleSessionBound bool } verifyCompletionRecordedPostActionInfo struct { @@ -226,6 +227,7 @@ func newActivityTaskPostActionInfo( activityTaskScheduleToStartTimeout: activityInfo.ScheduleToStartTimeout.AsDuration(), versionDirective: directive, priority: priority, + singleSessionBound: mutableState.GetExecutionInfo().GetSessionState().GetExclusiveWorker(), }, nil } diff --git a/service/history/timer_queue_active_task_executor.go b/service/history/timer_queue_active_task_executor.go index 1c2e98859ff..44825d1c6b8 100644 --- a/service/history/timer_queue_active_task_executor.go +++ b/service/history/timer_queue_active_task_executor.go @@ -615,6 +615,7 @@ func (t *timerQueueActiveTaskExecutor) executeActivityRetryTimerTask( // TODO (Shivam): Also, ensure if this error is going to fail the activity retry timer task. return err } + singleSessionBound := mutableState.GetExecutionInfo().GetSessionState().GetExclusiveWorker() scheduleToStartTimeout := timestamp.DurationValue(activityInfo.ScheduleToStartTimeout) directive := MakeDirectiveForActivityTask(mutableState, activityInfo) useWfBuildId := activityInfo.GetUseWorkflowBuildIdInfo() != nil @@ -630,6 +631,7 @@ func (t *timerQueueActiveTaskExecutor) executeActivityRetryTimerTask( RunId: task.GetRunID(), }, TaskQueue: taskQueue, + SessionDirective: workflow.TaskSessionDirective(singleSessionBound, taskQueue), ScheduledEventId: task.EventID, ScheduleToStartTimeout: durationpb.New(scheduleToStartTimeout), Clock: vclock.NewVectorClock(t.shardContext.GetClusterMetadata().GetClusterID(), t.shardContext.GetShardID(), task.TaskID), diff --git a/service/history/timer_queue_standby_task_executor.go b/service/history/timer_queue_standby_task_executor.go index 027c7a03b51..d6fddfc9bec 100644 --- a/service/history/timer_queue_standby_task_executor.go +++ b/service/history/timer_queue_standby_task_executor.go @@ -788,6 +788,7 @@ func (t *timerQueueStandbyTaskExecutor) pushActivity( RunId: activityTask.RunID, }, TaskQueue: pushActivityInfo.taskQueue, + SessionDirective: workflow.TaskSessionDirective(pushActivityInfo.singleSessionBound, pushActivityInfo.taskQueue), ScheduledEventId: activityTask.EventID, ScheduleToStartTimeout: durationpb.New(activityScheduleToStartTimeout), Clock: vclock.NewVectorClock(t.shardContext.GetClusterMetadata().GetClusterID(), t.shardContext.GetShardID(), activityTask.TaskID), diff --git a/service/history/transfer_queue_active_task_executor.go b/service/history/transfer_queue_active_task_executor.go index d3beca6a34e..be5c8d30041 100644 --- a/service/history/transfer_queue_active_task_executor.go +++ b/service/history/transfer_queue_active_task_executor.go @@ -280,6 +280,7 @@ func (t *transferQueueActiveTaskExecutor) processActivityTask( // since it could be sent to the DLQ. Ensure that this is not the case. return err } + singleSessionBound := mutableState.GetExecutionInfo().GetSessionState().GetExclusiveWorker() timeout := timestamp.DurationValue(ai.ScheduleToStartTimeout) directive := MakeDirectiveForActivityTask(mutableState, ai) priority := priorities.Merge(mutableState.GetExecutionInfo().Priority, ai.Priority) @@ -291,7 +292,7 @@ func (t *transferQueueActiveTaskExecutor) processActivityTask( // NOTE (Shivam): Consider the case for general session activity tasks where in if the worker has // changed between this, does this task correctly go to the new worker? - return t.pushActivity(ctx, task, taskQueue, timeout, directive, priority, historyi.TransactionPolicyActive) + return t.pushActivity(ctx, task, taskQueue, singleSessionBound, timeout, directive, priority, historyi.TransactionPolicyActive) } func (t *transferQueueActiveTaskExecutor) processWorkflowTask( @@ -335,6 +336,7 @@ func (t *transferQueueActiveTaskExecutor) processWorkflowTask( taskQueue, scheduleToStartTimeout := mutableState.TaskQueueScheduleToStartTimeout(transferTask.TaskQueue) normalTaskQueueName := mutableState.GetExecutionInfo().TaskQueue + singleSessionBound := mutableState.GetExecutionInfo().GetSessionState().GetExclusiveWorker() directive := MakeDirectiveForWorkflowTask(mutableState) priority := mutableState.GetExecutionInfo().Priority @@ -348,6 +350,7 @@ func (t *transferQueueActiveTaskExecutor) processWorkflowTask( ctx, transferTask, taskQueue, + singleSessionBound, scheduleToStartTimeout.AsDuration(), directive, priority, @@ -373,6 +376,7 @@ func (t *transferQueueActiveTaskExecutor) processWorkflowTask( ctx, transferTask, taskQueue, + singleSessionBound, scheduleToStartTimeout.AsDuration(), directive, priority, diff --git a/service/history/transfer_queue_active_task_executor_test.go b/service/history/transfer_queue_active_task_executor_test.go index c48b55c1203..6cbe39eb46f 100644 --- a/service/history/transfer_queue_active_task_executor_test.go +++ b/service/history/transfer_queue_active_task_executor_test.go @@ -26,6 +26,7 @@ import ( "go.temporal.io/server/api/matchingservice/v1" "go.temporal.io/server/api/matchingservicemock/v1" persistencespb "go.temporal.io/server/api/persistence/v1" + taskqueuespb "go.temporal.io/server/api/taskqueue/v1" workflowspb "go.temporal.io/server/api/workflow/v1" "go.temporal.io/server/chasm" "go.temporal.io/server/common/archiver" @@ -51,6 +52,7 @@ import ( "go.temporal.io/server/common/tasktoken" "go.temporal.io/server/common/telemetry" "go.temporal.io/server/common/testing/protomock" + "go.temporal.io/server/common/testing/protorequire" "go.temporal.io/server/common/testing/testhooks" "go.temporal.io/server/common/worker_versioning" "go.temporal.io/server/service/history/configs" @@ -253,9 +255,11 @@ func (s *transferQueueActiveTaskExecutorSuite) TestProcessActivityTask_Success() name string session bool missingPlacement bool + bound bool }{ {name: "regular activity with sticky workflow"}, {name: "workflow-session activity", session: true}, + {name: "single-session activity", session: true, bound: true}, {name: "workflow-session activity awaiting placement", session: true, missingPlacement: true}, } { s.Run(tc.name, func() { @@ -301,6 +305,9 @@ func (s *transferQueueActiveTaskExecutorSuite) TestProcessActivityTask_Success() if !tc.missingPlacement { mutableState.SetStickyTaskQueue("sticky-worker", durationpb.New(time.Second)) } + if tc.bound { + mutableState.SetSessionState(&persistencespb.SessionState{ExclusiveWorker: true, WorkerQueue: "sticky-worker"}) + } transferTask := &tasks.ActivityTask{ WorkflowKey: definition.NewWorkflowKey( @@ -322,6 +329,9 @@ func (s *transferQueueActiveTaskExecutorSuite) TestProcessActivityTask_Success() if tc.session { request.TaskQueue = &taskqueuepb.TaskQueue{Name: "sticky-worker", Kind: enumspb.TASK_QUEUE_KIND_STICKY, NormalName: taskQueueName} } + if tc.bound { + request.SessionDirective = &taskqueuespb.TaskSessionDirective{WorkerQueue: "sticky-worker", IsExclusiveWorkerAssigned: true} + } s.mockMatchingClient.EXPECT().AddActivityTask(gomock.Any(), protomock.Eq(request), gomock.Any()).Return(&matchingservice.AddActivityTaskResponse{}, nil) } @@ -720,6 +730,7 @@ func (s *transferQueueActiveTaskExecutorSuite) TestProcessWorkflowTask_Sticky_No s.Equal(enumspb.TASK_QUEUE_KIND_STICKY, request.GetTaskQueue().GetKind()) if tc.bound { s.Equal(workflowRunTimeout.AsDuration(), request.GetScheduleToStartTimeout().AsDuration()) + protorequire.ProtoEqual(s.T(), &taskqueuespb.TaskSessionDirective{WorkerQueue: stickyTaskQueueName, IsExclusiveWorkerAssigned: true}, request.GetSessionDirective()) } if tc.unavailable { return nil, &serviceerrors.StickyWorkerUnavailable{} diff --git a/service/history/transfer_queue_standby_task_executor.go b/service/history/transfer_queue_standby_task_executor.go index f22532088fc..778a919ebdb 100644 --- a/service/history/transfer_queue_standby_task_executor.go +++ b/service/history/transfer_queue_standby_task_executor.go @@ -711,6 +711,7 @@ func (t *transferQueueStandbyTaskExecutor) pushActivity( ctx, activityTask, pushActivityInfo.taskQueue, + pushActivityInfo.singleSessionBound, pushActivityInfo.activityTaskScheduleToStartTimeout, pushActivityInfo.versionDirective, pushActivityInfo.priority, @@ -733,6 +734,7 @@ func (t *transferQueueStandbyTaskExecutor) pushWorkflowTask( ctx, task.(*tasks.WorkflowTask), pushwtInfo.taskqueue, + false, pushwtInfo.workflowTaskScheduleToStartTimeout, pushwtInfo.versionDirective, pushwtInfo.priority, diff --git a/service/history/transfer_queue_task_executor_base.go b/service/history/transfer_queue_task_executor_base.go index 8f30cdb3907..283e344b1c0 100644 --- a/service/history/transfer_queue_task_executor_base.go +++ b/service/history/transfer_queue_task_executor_base.go @@ -27,6 +27,7 @@ import ( "go.temporal.io/server/service/history/queues" "go.temporal.io/server/service/history/tasks" "go.temporal.io/server/service/history/vclock" + "go.temporal.io/server/service/history/workflow" wcache "go.temporal.io/server/service/history/workflow/cache" "google.golang.org/protobuf/types/known/durationpb" ) @@ -95,6 +96,7 @@ func (t *transferQueueTaskExecutorBase) pushActivity( ctx context.Context, task *tasks.ActivityTask, taskQueue *taskqueuepb.TaskQueue, + singleSessionBound bool, activityScheduleToStartTimeout time.Duration, directive *taskqueuespb.TaskVersionDirective, priority *commonpb.Priority, @@ -107,6 +109,7 @@ func (t *transferQueueTaskExecutorBase) pushActivity( RunId: task.RunID, }, TaskQueue: taskQueue, + SessionDirective: workflow.TaskSessionDirective(singleSessionBound, taskQueue), ScheduledEventId: task.ScheduledEventID, ScheduleToStartTimeout: durationpb.New(activityScheduleToStartTimeout), Clock: vclock.NewVectorClock(t.shardContext.GetClusterMetadata().GetClusterID(), t.shardContext.GetShardID(), task.TaskID), @@ -148,6 +151,7 @@ func (t *transferQueueTaskExecutorBase) pushWorkflowTask( ctx context.Context, task *tasks.WorkflowTask, taskqueue *taskqueuepb.TaskQueue, + singleSessionBound bool, workflowTaskScheduleToStartTimeout time.Duration, directive *taskqueuespb.TaskVersionDirective, priority *commonpb.Priority, @@ -164,6 +168,7 @@ func (t *transferQueueTaskExecutorBase) pushWorkflowTask( RunId: task.RunID, }, TaskQueue: taskqueue, + SessionDirective: workflow.TaskSessionDirective(singleSessionBound, taskqueue), ScheduledEventId: task.ScheduledEventID, ScheduleToStartTimeout: sst, Clock: vclock.NewVectorClock(t.shardContext.GetClusterMetadata().GetClusterID(), t.shardContext.GetShardID(), task.TaskID), diff --git a/service/history/workflow/util.go b/service/history/workflow/util.go index 2d8044f0286..0db0d4c1c67 100644 --- a/service/history/workflow/util.go +++ b/service/history/workflow/util.go @@ -8,9 +8,11 @@ import ( enumspb "go.temporal.io/api/enums/v1" historypb "go.temporal.io/api/history/v1" "go.temporal.io/api/serviceerror" + taskqueuepb "go.temporal.io/api/taskqueue/v1" workflowpb "go.temporal.io/api/workflow/v1" enumsspb "go.temporal.io/server/api/enums/v1" persistencespb "go.temporal.io/server/api/persistence/v1" + taskqueuespb "go.temporal.io/server/api/taskqueue/v1" "go.temporal.io/server/chasm" callbackspb "go.temporal.io/server/chasm/lib/callback/gen/callbackpb/v1" "go.temporal.io/server/common/clock" @@ -26,6 +28,16 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) +func TaskSessionDirective(singleSessionBound bool, taskQueue *taskqueuepb.TaskQueue) *taskqueuespb.TaskSessionDirective { + if !singleSessionBound || taskQueue.GetKind() != enumspb.TASK_QUEUE_KIND_STICKY || taskQueue.GetName() == "" { + return nil + } + return &taskqueuespb.TaskSessionDirective{ + WorkerQueue: taskQueue.GetName(), + IsExclusiveWorkerAssigned: singleSessionBound, + } +} + func failWorkflowTask( mutableState historyi.MutableState, workflowTask *historyi.WorkflowTaskInfo, diff --git a/service/history/workflow/util_test.go b/service/history/workflow/util_test.go index 591a4473c4b..5613abd67b4 100644 --- a/service/history/workflow/util_test.go +++ b/service/history/workflow/util_test.go @@ -4,12 +4,16 @@ import ( "testing" "github.com/stretchr/testify/require" + enumspb "go.temporal.io/api/enums/v1" historypb "go.temporal.io/api/history/v1" + taskqueuepb "go.temporal.io/api/taskqueue/v1" persistencespb "go.temporal.io/server/api/persistence/v1" + taskqueuespb "go.temporal.io/server/api/taskqueue/v1" "go.temporal.io/server/chasm" "go.temporal.io/server/common/metrics" "go.temporal.io/server/common/metrics/metricstest" "go.temporal.io/server/common/namespace" + "go.temporal.io/server/common/testing/protorequire" "go.temporal.io/server/service/history/consts" historyi "go.temporal.io/server/service/history/interfaces" "go.uber.org/mock/gomock" @@ -55,3 +59,25 @@ func TestForceTerminateWorkflowRecordsMetric(t *testing.T) { require.Equal(t, string(chasm.WorkflowArchetype), recordings[0].Tags["archetype"]) require.Equal(t, string(chasm.ExecutionForceTerminationReasonEventBatchSizeExceedsLimit), recordings[0].Tags["reason"]) } + +// TestTaskSessionDirective keeps the request context tied to the actual bound sticky destination. +func TestTaskSessionDirective(t *testing.T) { + t.Parallel() + for _, tc := range []struct { + name string + bound bool + queue *taskqueuepb.TaskQueue + expected *taskqueuespb.TaskSessionDirective + }{ + {name: "bound sticky", bound: true, queue: &taskqueuepb.TaskQueue{Name: "worker", Kind: enumspb.TASK_QUEUE_KIND_STICKY}, expected: &taskqueuespb.TaskSessionDirective{WorkerQueue: "worker", IsExclusiveWorkerAssigned: true}}, + {name: "unbound sticky", queue: &taskqueuepb.TaskQueue{Name: "worker", Kind: enumspb.TASK_QUEUE_KIND_STICKY}}, + {name: "normal fallback", bound: true, queue: &taskqueuepb.TaskQueue{Name: "normal", Kind: enumspb.TASK_QUEUE_KIND_NORMAL}}, + {name: "empty destination", bound: true, queue: &taskqueuepb.TaskQueue{Kind: enumspb.TASK_QUEUE_KIND_STICKY}}, + {name: "missing destination", bound: true}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + protorequire.ProtoEqual(t, tc.expected, TaskSessionDirective(tc.bound, tc.queue)) + }) + } +} diff --git a/service/matching/hooks/task_lifecycle_hooks.go b/service/matching/hooks/task_lifecycle_hooks.go index 5ce110cd5fd..27256ed5812 100644 --- a/service/matching/hooks/task_lifecycle_hooks.go +++ b/service/matching/hooks/task_lifecycle_hooks.go @@ -5,6 +5,7 @@ import ( deploymentpb "go.temporal.io/api/deployment/v1" enumspb "go.temporal.io/api/enums/v1" + sessionpb "go.temporal.io/api/session/v1" "go.temporal.io/server/common/namespace" "go.temporal.io/server/common/tqid" ) @@ -41,6 +42,8 @@ type ( DeploymentVersion *deploymentpb.WorkerDeploymentVersion IsSyncMatch bool // Deprecated: use SyncMatchOutcome instead. SyncMatchOutcome SyncMatchOutcome + // Non-nil only when the task belongs to an already-bound single session. + SingleSessionOptions *sessionpb.SingleSessionOptions } TaskHookFactory interface { diff --git a/service/matching/matching_engine.go b/service/matching/matching_engine.go index 8f446eb3966..abd8b13d9b0 100644 --- a/service/matching/matching_engine.go +++ b/service/matching/matching_engine.go @@ -723,8 +723,9 @@ func (e *matchingEngineImpl) AddWorkflowTask( } return pm.AddTask(ctx, addTaskParams{ - taskInfo: taskInfo, - forwardInfo: addRequest.ForwardInfo, + taskInfo: taskInfo, + forwardInfo: addRequest.ForwardInfo, + sessionDirective: addRequest.GetSessionDirective(), }) } @@ -774,8 +775,9 @@ func (e *matchingEngineImpl) AddActivityTask( } return pm.AddTask(ctx, addTaskParams{ - taskInfo: taskInfo, - forwardInfo: addRequest.ForwardInfo, + taskInfo: taskInfo, + forwardInfo: addRequest.ForwardInfo, + sessionDirective: addRequest.GetSessionDirective(), }) } diff --git a/service/matching/physical_task_queue_manager.go b/service/matching/physical_task_queue_manager.go index cc189a92e82..60752b3ac86 100644 --- a/service/matching/physical_task_queue_manager.go +++ b/service/matching/physical_task_queue_manager.go @@ -54,8 +54,9 @@ const ( type ( addTaskParams struct { - taskInfo *persistencespb.TaskInfo - forwardInfo *taskqueuespb.TaskForwardInfo + taskInfo *persistencespb.TaskInfo + forwardInfo *taskqueuespb.TaskForwardInfo + sessionDirective *taskqueuespb.TaskSessionDirective } // physicalTaskQueueManagerImpl manages a set of physical queues that comprise one logical // queue, corresponding to a single versioned queue of a task queue partition. diff --git a/service/matching/task_queue_partition_manager.go b/service/matching/task_queue_partition_manager.go index 14512346d8b..38a71d151cd 100644 --- a/service/matching/task_queue_partition_manager.go +++ b/service/matching/task_queue_partition_manager.go @@ -17,6 +17,7 @@ import ( deploymentpb "go.temporal.io/api/deployment/v1" enumspb "go.temporal.io/api/enums/v1" "go.temporal.io/api/serviceerror" + sessionpb "go.temporal.io/api/session/v1" taskqueuepb "go.temporal.io/api/taskqueue/v1" "go.temporal.io/api/workflowservice/v1" deploymentspb "go.temporal.io/server/api/deployment/v1" @@ -459,6 +460,13 @@ reredirectTask: return "", false, err } + hookVersion := syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS() + var singleSessionOptions *sessionpb.SingleSessionOptions + if params.sessionDirective.GetIsExclusiveWorkerAssigned() { + singleSessionOptions = &sessionpb.SingleSessionOptions{StableIdentity: params.sessionDirective.GetWorkerQueue()} + hookVersion = worker_versioning.DeploymentVersionFromDeployment(worker_versioning.DirectiveDeployment(directive)) + } + syncMatchTask := newInternalTaskForSyncMatch(params.taskInfo, params.forwardInfo, taskDispatchRevisionNumber, targetVersion) pm.config.setDefaultPriority(syncMatchTask) if spoolQueue != nil && spoolQueue.QueueKey().Version().BuildId() != syncMatchQueue.QueueKey().Version().BuildId() { @@ -506,7 +514,7 @@ reredirectTask: if !forwarded { // We should not use targetVersion because targetVersion is always routing-config-deriven. // For pinned workflows, targetVersion is not necessarily the same as the pinned version. - pm.processTaskAddHooks(ctx, syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS(), outcome) + pm.processTaskAddHooks(ctx, hookVersion, outcome, singleSessionOptions) } syncMatchResult := metrics.TaskAddResultSyncMatch @@ -549,7 +557,7 @@ reredirectTask: // because for unpinned tasks spoolQueue is always the default (unversioned) queue. // Unpinned tasks are written to the default queue for late binding, in case target version // changes by the time they can be dispatched. - pm.processTaskAddHooks(ctx, syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS(), outcome) + pm.processTaskAddHooks(ctx, hookVersion, outcome, singleSessionOptions) } else { spoolQueue.RecordTaskAdd(taskAddErrResult(err), forwarded, behavior) } @@ -783,13 +791,19 @@ func syncMatchOutcomeToHook(outcome syncMatchOutcome) hooks.SyncMatchOutcome { } } -func (pm *taskQueuePartitionManagerImpl) processTaskAddHooks(ctx context.Context, targetVersion *deploymentspb.WorkerDeploymentVersion, outcome syncMatchOutcome) { +func (pm *taskQueuePartitionManagerImpl) processTaskAddHooks( + ctx context.Context, + targetVersion *deploymentspb.WorkerDeploymentVersion, + outcome syncMatchOutcome, + singleSessionOptions *sessionpb.SingleSessionOptions, +) { for _, l := range pm.taskHooks { hookOutcome := syncMatchOutcomeToHook(outcome) l.ProcessTaskAdd(ctx, &hooks.TaskAddHookDetails{ - DeploymentVersion: worker_versioning.ExternalWorkerDeploymentVersionFromVersion(targetVersion), - IsSyncMatch: hookOutcome == hooks.SyncMatchOutcomeSuccess, - SyncMatchOutcome: hookOutcome, + DeploymentVersion: worker_versioning.ExternalWorkerDeploymentVersionFromVersion(targetVersion), + IsSyncMatch: hookOutcome == hooks.SyncMatchOutcomeSuccess, + SyncMatchOutcome: hookOutcome, + SingleSessionOptions: common.CloneProto(singleSessionOptions), }) } } @@ -1084,7 +1098,7 @@ reredirectTask: if request.ForwardInfo == nil && !syncMatchQueue.HasPollerAfter(time.Now().Add(-pm.config.WorkerControllerNoPollerHookWindow())) { queueVersion := syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS() - pm.processTaskAddHooks(ctx, queueVersion, syncMatchNoPoller) + pm.processTaskAddHooks(ctx, queueVersion, syncMatchNoPoller, nil) firedNoPollerHook = true } @@ -1107,7 +1121,7 @@ reredirectTask: // the same task dispatch. if err == nil && res == nil && request.ForwardInfo == nil && !firedNoPollerHook { queueVersion := syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS() - pm.processTaskAddHooks(ctx, queueVersion, syncMatchSuccess) + pm.processTaskAddHooks(ctx, queueVersion, syncMatchSuccess, nil) } return res, err } @@ -1172,7 +1186,7 @@ reredirectTask: if request.ForwardInfo == nil && !syncMatchQueue.HasPollerAfter(time.Now().Add(-pm.config.WorkerControllerNoPollerHookWindow())) { queueVersion := syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS() - pm.processTaskAddHooks(ctx, queueVersion, syncMatchNoPoller) + pm.processTaskAddHooks(ctx, queueVersion, syncMatchNoPoller, nil) firedNoPollerHook = true } @@ -1195,7 +1209,7 @@ reredirectTask: // the same task dispatch. if err == nil && res == nil && request.ForwardInfo == nil && !firedNoPollerHook { queueVersion := syncMatchQueue.QueueKey().Version().WorkerDeploymentVersionS() - pm.processTaskAddHooks(ctx, queueVersion, syncMatchSuccess) + pm.processTaskAddHooks(ctx, queueVersion, syncMatchSuccess, nil) } return res, err } diff --git a/service/matching/task_queue_partition_manager_test.go b/service/matching/task_queue_partition_manager_test.go index b845369a1fa..75a57b7015b 100644 --- a/service/matching/task_queue_partition_manager_test.go +++ b/service/matching/task_queue_partition_manager_test.go @@ -25,6 +25,7 @@ import ( "go.temporal.io/server/api/matchingservicemock/v1" persistencespb "go.temporal.io/server/api/persistence/v1" taskqueuespb "go.temporal.io/server/api/taskqueue/v1" + "go.temporal.io/server/common" "go.temporal.io/server/common/clock" hlc "go.temporal.io/server/common/clock/hybrid_logical_clock" "go.temporal.io/server/common/dynamicconfig" @@ -2033,10 +2034,11 @@ type capturingTaskMatchHook struct { } type capturedTaskMatchDetails struct { - TaskQueueName string - TaskQueueType enumspb.TaskQueueType - SyncMatchOutcome hooks.SyncMatchOutcome - DeploymentVersion *deploymentpb.WorkerDeploymentVersion + TaskQueueName string + TaskQueueType enumspb.TaskQueueType + SyncMatchOutcome hooks.SyncMatchOutcome + DeploymentVersion *deploymentpb.WorkerDeploymentVersion + SingleSessionOptions *sessionpb.SingleSessionOptions } func (h *capturingTaskMatchHook) Create(details *hooks.TaskHookFactoryCreateDetails) hooks.TaskHook { @@ -2055,9 +2057,10 @@ func (h *capturingTaskMatchHook) ProcessTaskAdd(ctx context.Context, event *hook h.mu.Lock() defer h.mu.Unlock() details := capturedTaskMatchDetails{ - TaskQueueName: h.taskQueueName, - TaskQueueType: h.taskQueueType, - SyncMatchOutcome: event.SyncMatchOutcome, + TaskQueueName: h.taskQueueName, + TaskQueueType: h.taskQueueType, + SyncMatchOutcome: event.SyncMatchOutcome, + SingleSessionOptions: common.CloneProto(event.SingleSessionOptions), } if event.DeploymentVersion != nil { details.DeploymentVersion = &deploymentpb.WorkerDeploymentVersion{ @@ -2268,6 +2271,106 @@ func (s *PartitionManagerTestSuite) TestNoRecentPollerMetric_OldPartitionWithRec s.Empty(recordings, "Metric should not be emitted when there are recent pollers") } +func (s *PartitionManagerTestSuite) TestTaskAddHooks_SingleSession() { + for _, tc := range []struct { + name string + taskType enumspb.TaskQueueType + syncMatch bool + general bool + }{ + {name: "workflow sync match", taskType: enumspb.TASK_QUEUE_TYPE_WORKFLOW, syncMatch: true}, + {name: "workflow backlog", taskType: enumspb.TASK_QUEUE_TYPE_WORKFLOW}, + {name: "activity sync match", taskType: enumspb.TASK_QUEUE_TYPE_ACTIVITY, syncMatch: true}, + {name: "activity backlog", taskType: enumspb.TASK_QUEUE_TYPE_ACTIVITY}, + {name: "general workflow sync match", taskType: enumspb.TASK_QUEUE_TYPE_WORKFLOW, syncMatch: true, general: true}, + {name: "general workflow backlog", taskType: enumspb.TASK_QUEUE_TYPE_WORKFLOW, general: true}, + {name: "general activity sync match", taskType: enumspb.TASK_QUEUE_TYPE_ACTIVITY, syncMatch: true, general: true}, + {name: "general activity backlog", taskType: enumspb.TASK_QUEUE_TYPE_ACTIVITY, general: true}, + } { + s.Run(tc.name, func() { + t := s.T() + ctx := t.Context() + tv := testvars.New(t).WithBuildIDNumber(1) + current := tv.WithBuildIDNumber(2) + pm := s.newEagerDispatchPartitionManager(0, nil) + pm.partition = newTestTaskQueue(namespaceID, tv.TaskQueue().GetName(), tc.taskType).StickyPartition(tv.StickyTaskQueue().GetName()) + pm.userDataManager = &mockUserDataManager{data: &persistencespb.VersionedTaskQueueUserData{ + Data: &persistencespb.TaskQueueUserData{ + PerType: map[int32]*persistencespb.TaskQueueTypeUserData{ + int32(tc.taskType): { + DeploymentData: &persistencespb.DeploymentData{ + DeploymentsData: map[string]*persistencespb.WorkerDeploymentData{ + tv.DeploymentSeries(): {RoutingConfig: &deploymentpb.RoutingConfig{ + CurrentDeploymentVersion: current.ExternalDeploymentVersion(), + CurrentVersionChangedTime: timestamppb.Now(), + }}, + }, + }, + }, + }, + }, + }} + queue := pm.defaultQueue().(*MockphysicalTaskQueueManager) + queue.EXPECT().QueueKey().Return(UnversionedQueueKey(pm.partition)).AnyTimes() + queue.EXPECT().HasPollerAfter(gomock.Any()).Return(true).AnyTimes() + outcome := syncMatchNoPoller + hookOutcome := hooks.SyncMatchOutcomeNotMatched + if tc.syncMatch { + outcome = syncMatchSuccess + hookOutcome = hooks.SyncMatchOutcomeSuccess + } else { + queue.EXPECT().SpoolTask(gomock.Any()).Return(nil) + } + queue.EXPECT().TrySyncMatch(gomock.Any(), gomock.Any()).Return(outcome, nil) + queue.EXPECT().RecordTaskAdd(gomock.Any(), false, enumspb.VERSIONING_BEHAVIOR_PINNED) + hook := &capturingTaskMatchHook{} + pm.taskHooks = []hooks.TaskHook{hook.Create(&hooks.TaskHookFactoryCreateDetails{Namespace: pm.ns, Partition: pm.partition})} + pm.engine.updateTaskQueue(pm.partition, pm) + defer func() { + pm.engine.partitionsLock.Lock() + delete(pm.engine.partitions, pm.partition.Key()) + pm.engine.partitionsLock.Unlock() + }() + options := &sessionpb.SingleSessionOptions{StableIdentity: tv.StickyTaskQueue().GetName()} + if tc.general { + options = nil + } + sessionDirective := &taskqueuespb.TaskSessionDirective{ + WorkerQueue: tv.StickyTaskQueue().GetName(), IsExclusiveWorkerAssigned: !tc.general, + } + directive := &taskqueuespb.TaskVersionDirective{ + Behavior: enumspb.VERSIONING_BEHAVIOR_PINNED, + DeploymentVersion: tv.DeploymentVersion(), + } + var matched bool + var err error + if tc.taskType == enumspb.TASK_QUEUE_TYPE_WORKFLOW { + _, matched, err = pm.engine.AddWorkflowTask(ctx, &matchingservice.AddWorkflowTaskRequest{ + NamespaceId: namespaceID, Execution: tv.WorkflowExecution(), TaskQueue: tv.StickyTaskQueue(), + VersionDirective: directive, SessionDirective: sessionDirective, + }) + } else { + _, matched, err = pm.engine.AddActivityTask(ctx, &matchingservice.AddActivityTaskRequest{ + NamespaceId: namespaceID, Execution: tv.WorkflowExecution(), TaskQueue: tv.StickyTaskQueue(), + VersionDirective: directive, SessionDirective: sessionDirective, + }) + } + require.NoError(t, err) + require.Equal(t, tc.syncMatch, matched) + calls := hook.getCalls() + require.Len(t, calls, 1) + require.Equal(t, tc.taskType, calls[0].TaskQueueType) + require.Equal(t, hookOutcome, calls[0].SyncMatchOutcome) + protorequire.ProtoEqual(t, options, calls[0].SingleSessionOptions) + if tc.general { + require.Nil(t, calls[0].DeploymentVersion) + } else { + protorequire.ProtoEqual(t, tv.ExternalDeploymentVersion(), calls[0].DeploymentVersion) + } + }) + } +} + func (s *PartitionManagerTestSuite) TestTaskAddHooks_AddHookSyncMatch() { hook := &capturingTaskMatchHook{} pm, cleanup := s.setupPartitionManagerWithTaskHookFactories([]hooks.TaskHookFactory{hook})