temporalio 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Cargo.lock +4035 -0
- data/Cargo.toml +25 -0
- data/Gemfile +20 -0
- data/LICENSE +16 -15
- data/README.md +455 -195
- data/Rakefile +387 -0
- data/ext/Cargo.toml +25 -0
- data/lib/temporalio/activity/complete_async_error.rb +11 -0
- data/lib/temporalio/activity/context.rb +82 -77
- data/lib/temporalio/activity/definition.rb +77 -0
- data/lib/temporalio/activity/info.rb +42 -46
- data/lib/temporalio/activity.rb +49 -65
- data/lib/temporalio/api/batch/v1/message.rb +31 -0
- data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
- data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
- data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
- data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
- data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
- data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
- data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
- data/lib/temporalio/api/command/v1/message.rb +46 -0
- data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
- data/lib/temporalio/api/common/v1/message.rb +41 -0
- data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
- data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
- data/lib/temporalio/api/enums/v1/common.rb +26 -0
- data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
- data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
- data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
- data/lib/temporalio/api/enums/v1/query.rb +22 -0
- data/lib/temporalio/api/enums/v1/reset.rb +23 -0
- data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
- data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
- data/lib/temporalio/api/enums/v1/update.rb +22 -0
- data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
- data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
- data/lib/temporalio/api/export/v1/message.rb +24 -0
- data/lib/temporalio/api/failure/v1/message.rb +35 -0
- data/lib/temporalio/api/filter/v1/message.rb +27 -0
- data/lib/temporalio/api/history/v1/message.rb +90 -0
- data/lib/temporalio/api/namespace/v1/message.rb +31 -0
- data/lib/temporalio/api/nexus/v1/message.rb +40 -0
- data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
- data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
- data/lib/temporalio/api/operatorservice.rb +3 -0
- data/lib/temporalio/api/protocol/v1/message.rb +23 -0
- data/lib/temporalio/api/query/v1/message.rb +27 -0
- data/lib/temporalio/api/replication/v1/message.rb +26 -0
- data/lib/temporalio/api/schedule/v1/message.rb +42 -0
- data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
- data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
- data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
- data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
- data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
- data/lib/temporalio/api/update/v1/message.rb +33 -0
- data/lib/temporalio/api/version/v1/message.rb +26 -0
- data/lib/temporalio/api/workflow/v1/message.rb +43 -0
- data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
- data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
- data/lib/temporalio/api/workflowservice.rb +3 -0
- data/lib/temporalio/api.rb +13 -0
- data/lib/temporalio/cancellation.rb +150 -0
- data/lib/temporalio/client/activity_id_reference.rb +32 -0
- data/lib/temporalio/client/async_activity_handle.rb +110 -0
- data/lib/temporalio/client/connection/cloud_service.rb +648 -0
- data/lib/temporalio/client/connection/operator_service.rb +249 -0
- data/lib/temporalio/client/connection/service.rb +41 -0
- data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
- data/lib/temporalio/client/connection.rb +270 -0
- data/lib/temporalio/client/interceptor.rb +316 -0
- data/lib/temporalio/client/workflow_execution.rb +103 -0
- data/lib/temporalio/client/workflow_execution_count.rb +36 -0
- data/lib/temporalio/client/workflow_execution_status.rb +18 -0
- data/lib/temporalio/client/workflow_handle.rb +380 -177
- data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
- data/lib/temporalio/client/workflow_update_handle.rb +67 -0
- data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
- data/lib/temporalio/client.rb +366 -93
- data/lib/temporalio/common_enums.rb +24 -0
- data/lib/temporalio/converters/data_converter.rb +102 -0
- data/lib/temporalio/converters/failure_converter.rb +200 -0
- data/lib/temporalio/converters/payload_codec.rb +26 -0
- data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
- data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
- data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
- data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
- data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
- data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
- data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
- data/lib/temporalio/converters/payload_converter.rb +73 -0
- data/lib/temporalio/converters.rb +9 -0
- data/lib/temporalio/error/failure.rb +119 -94
- data/lib/temporalio/error.rb +147 -0
- data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
- data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
- data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
- data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
- data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
- data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
- data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
- data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
- data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
- data/lib/temporalio/internal/bridge/api.rb +3 -0
- data/lib/temporalio/internal/bridge/client.rb +90 -0
- data/lib/temporalio/internal/bridge/runtime.rb +53 -0
- data/lib/temporalio/internal/bridge/testing.rb +46 -0
- data/lib/temporalio/internal/bridge/worker.rb +83 -0
- data/lib/temporalio/internal/bridge.rb +36 -0
- data/lib/temporalio/internal/client/implementation.rb +525 -0
- data/lib/temporalio/internal/proto_utils.rb +54 -0
- data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
- data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
- data/lib/temporalio/internal.rb +7 -0
- data/lib/temporalio/retry_policy.rb +39 -80
- data/lib/temporalio/runtime.rb +259 -13
- data/lib/temporalio/scoped_logger.rb +96 -0
- data/lib/temporalio/search_attributes.rb +300 -0
- data/lib/temporalio/testing/activity_environment.rb +132 -0
- data/lib/temporalio/testing/workflow_environment.rb +113 -88
- data/lib/temporalio/testing.rb +4 -169
- data/lib/temporalio/version.rb +3 -1
- data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
- data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
- data/lib/temporalio/worker/activity_executor.rb +55 -0
- data/lib/temporalio/worker/interceptor.rb +88 -0
- data/lib/temporalio/worker/tuner.rb +151 -0
- data/lib/temporalio/worker.rb +385 -163
- data/lib/temporalio/workflow_history.rb +22 -0
- data/lib/temporalio.rb +2 -7
- data/temporalio.gemspec +20 -39
- metadata +131 -712
- data/bridge/Cargo.lock +0 -2997
- data/bridge/Cargo.toml +0 -29
- data/bridge/sdk-core/ARCHITECTURE.md +0 -76
- data/bridge/sdk-core/Cargo.toml +0 -2
- data/bridge/sdk-core/LICENSE.txt +0 -23
- data/bridge/sdk-core/README.md +0 -117
- data/bridge/sdk-core/arch_docs/diagrams/README.md +0 -10
- data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +0 -40
- data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
- data/bridge/sdk-core/arch_docs/sticky_queues.md +0 -51
- data/bridge/sdk-core/client/Cargo.toml +0 -40
- data/bridge/sdk-core/client/LICENSE.txt +0 -23
- data/bridge/sdk-core/client/src/lib.rs +0 -1462
- data/bridge/sdk-core/client/src/metrics.rs +0 -174
- data/bridge/sdk-core/client/src/raw.rs +0 -932
- data/bridge/sdk-core/client/src/retry.rs +0 -763
- data/bridge/sdk-core/client/src/workflow_handle/mod.rs +0 -185
- data/bridge/sdk-core/core/Cargo.toml +0 -129
- data/bridge/sdk-core/core/LICENSE.txt +0 -23
- data/bridge/sdk-core/core/benches/workflow_replay.rs +0 -76
- data/bridge/sdk-core/core/src/abstractions.rs +0 -355
- data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +0 -1049
- data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +0 -221
- data/bridge/sdk-core/core/src/core_tests/determinism.rs +0 -270
- data/bridge/sdk-core/core/src/core_tests/local_activities.rs +0 -1046
- data/bridge/sdk-core/core/src/core_tests/mod.rs +0 -100
- data/bridge/sdk-core/core/src/core_tests/queries.rs +0 -893
- data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +0 -65
- data/bridge/sdk-core/core/src/core_tests/workers.rs +0 -257
- data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +0 -124
- data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +0 -2433
- data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +0 -609
- data/bridge/sdk-core/core/src/internal_flags.rs +0 -136
- data/bridge/sdk-core/core/src/lib.rs +0 -289
- data/bridge/sdk-core/core/src/pollers/mod.rs +0 -54
- data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +0 -297
- data/bridge/sdk-core/core/src/protosext/mod.rs +0 -428
- data/bridge/sdk-core/core/src/replay/mod.rs +0 -215
- data/bridge/sdk-core/core/src/retry_logic.rs +0 -202
- data/bridge/sdk-core/core/src/telemetry/log_export.rs +0 -190
- data/bridge/sdk-core/core/src/telemetry/metrics.rs +0 -462
- data/bridge/sdk-core/core/src/telemetry/mod.rs +0 -423
- data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +0 -83
- data/bridge/sdk-core/core/src/test_help/mod.rs +0 -939
- data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +0 -536
- data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +0 -89
- data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +0 -1278
- data/bridge/sdk-core/core/src/worker/activities.rs +0 -557
- data/bridge/sdk-core/core/src/worker/client/mocks.rs +0 -107
- data/bridge/sdk-core/core/src/worker/client.rs +0 -389
- data/bridge/sdk-core/core/src/worker/mod.rs +0 -677
- data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +0 -35
- data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +0 -99
- data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +0 -1111
- data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +0 -964
- data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -294
- data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -168
- data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +0 -918
- data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +0 -137
- data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -158
- data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +0 -130
- data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +0 -1525
- data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +0 -324
- data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -179
- data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -659
- data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -439
- data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +0 -435
- data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +0 -175
- data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +0 -249
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +0 -85
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +0 -1280
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +0 -269
- data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +0 -213
- data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +0 -1305
- data/bridge/sdk-core/core/src/worker/workflow/mod.rs +0 -1276
- data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +0 -128
- data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +0 -125
- data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +0 -85
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +0 -117
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +0 -24
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +0 -715
- data/bridge/sdk-core/core-api/Cargo.toml +0 -33
- data/bridge/sdk-core/core-api/LICENSE.txt +0 -23
- data/bridge/sdk-core/core-api/src/errors.rs +0 -62
- data/bridge/sdk-core/core-api/src/lib.rs +0 -113
- data/bridge/sdk-core/core-api/src/telemetry.rs +0 -141
- data/bridge/sdk-core/core-api/src/worker.rs +0 -161
- data/bridge/sdk-core/etc/deps.svg +0 -162
- data/bridge/sdk-core/etc/dynamic-config.yaml +0 -2
- data/bridge/sdk-core/etc/otel-collector-config.yaml +0 -36
- data/bridge/sdk-core/etc/prometheus.yaml +0 -6
- data/bridge/sdk-core/etc/regen-depgraph.sh +0 -5
- data/bridge/sdk-core/fsm/Cargo.toml +0 -18
- data/bridge/sdk-core/fsm/LICENSE.txt +0 -23
- data/bridge/sdk-core/fsm/README.md +0 -3
- data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +0 -27
- data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +0 -23
- data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +0 -650
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +0 -8
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +0 -18
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +0 -12
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +0 -41
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +0 -14
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +0 -11
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +0 -32
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +0 -31
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +0 -46
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +0 -29
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +0 -12
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +0 -32
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +0 -18
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +0 -5
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +0 -11
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +0 -5
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +0 -11
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +0 -5
- data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +0 -14
- data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +0 -23
- data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +0 -254
- data/bridge/sdk-core/fsm/src/lib.rs +0 -2
- data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
- data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
- data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
- data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
- data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
- data/bridge/sdk-core/integ-with-otel.sh +0 -7
- data/bridge/sdk-core/protos/api_upstream/README.md +0 -9
- data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +0 -40
- data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -9
- data/bridge/sdk-core/protos/api_upstream/build/go.mod +0 -7
- data/bridge/sdk-core/protos/api_upstream/build/go.sum +0 -5
- data/bridge/sdk-core/protos/api_upstream/build/tools.go +0 -29
- data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +0 -141
- data/bridge/sdk-core/protos/api_upstream/go.mod +0 -6
- data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +0 -89
- data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +0 -248
- data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +0 -123
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -47
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -52
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +0 -56
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +0 -170
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -123
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -51
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -50
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -41
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -60
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -59
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -56
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +0 -122
- data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -108
- data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +0 -114
- data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -56
- data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +0 -787
- data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +0 -99
- data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -124
- data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -80
- data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -57
- data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +0 -61
- data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -55
- data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -379
- data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -63
- data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +0 -108
- data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +0 -111
- data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +0 -59
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +0 -146
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +0 -1199
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +0 -415
- data/bridge/sdk-core/protos/grpc/health/v1/health.proto +0 -63
- data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +0 -79
- data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +0 -80
- data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -78
- data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +0 -16
- data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +0 -31
- data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +0 -31
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +0 -270
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +0 -305
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -35
- data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +0 -38
- data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +0 -13
- data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +0 -141
- data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -63
- data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -90
- data/bridge/sdk-core/rustfmt.toml +0 -1
- data/bridge/sdk-core/sdk/Cargo.toml +0 -48
- data/bridge/sdk-core/sdk/LICENSE.txt +0 -23
- data/bridge/sdk-core/sdk/src/activity_context.rs +0 -230
- data/bridge/sdk-core/sdk/src/app_data.rs +0 -37
- data/bridge/sdk-core/sdk/src/interceptors.rs +0 -50
- data/bridge/sdk-core/sdk/src/lib.rs +0 -861
- data/bridge/sdk-core/sdk/src/payload_converter.rs +0 -11
- data/bridge/sdk-core/sdk/src/workflow_context/options.rs +0 -295
- data/bridge/sdk-core/sdk/src/workflow_context.rs +0 -694
- data/bridge/sdk-core/sdk/src/workflow_future.rs +0 -500
- data/bridge/sdk-core/sdk-core-protos/Cargo.toml +0 -33
- data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +0 -23
- data/bridge/sdk-core/sdk-core-protos/build.rs +0 -142
- data/bridge/sdk-core/sdk-core-protos/src/constants.rs +0 -7
- data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +0 -557
- data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +0 -234
- data/bridge/sdk-core/sdk-core-protos/src/lib.rs +0 -2088
- data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +0 -48
- data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +0 -14
- data/bridge/sdk-core/test-utils/Cargo.toml +0 -38
- data/bridge/sdk-core/test-utils/src/canned_histories.rs +0 -1389
- data/bridge/sdk-core/test-utils/src/histfetch.rs +0 -28
- data/bridge/sdk-core/test-utils/src/lib.rs +0 -709
- data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +0 -50
- data/bridge/sdk-core/test-utils/src/workflows.rs +0 -29
- data/bridge/sdk-core/tests/fuzzy_workflow.rs +0 -130
- data/bridge/sdk-core/tests/heavy_tests.rs +0 -265
- data/bridge/sdk-core/tests/integ_tests/client_tests.rs +0 -36
- data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +0 -150
- data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +0 -223
- data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +0 -239
- data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -90
- data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +0 -314
- data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +0 -151
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +0 -902
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +0 -60
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +0 -51
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +0 -51
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +0 -64
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +0 -47
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +0 -669
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +0 -54
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +0 -92
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +0 -228
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +0 -94
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +0 -171
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +0 -85
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +0 -120
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +0 -77
- data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +0 -596
- data/bridge/sdk-core/tests/main.rs +0 -103
- data/bridge/sdk-core/tests/runner.rs +0 -132
- data/bridge/sdk-core/tests/wf_input_replay.rs +0 -32
- data/bridge/src/connection.rs +0 -202
- data/bridge/src/lib.rs +0 -494
- data/bridge/src/runtime.rs +0 -54
- data/bridge/src/test_server.rs +0 -153
- data/bridge/src/worker.rs +0 -197
- data/ext/Rakefile +0 -9
- data/lib/gen/dependencies/gogoproto/gogo_pb.rb +0 -14
- data/lib/gen/temporal/api/batch/v1/message_pb.rb +0 -50
- data/lib/gen/temporal/api/command/v1/message_pb.rb +0 -160
- data/lib/gen/temporal/api/common/v1/message_pb.rb +0 -73
- data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +0 -33
- data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +0 -37
- data/lib/gen/temporal/api/enums/v1/common_pb.rb +0 -42
- data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +0 -68
- data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +0 -79
- data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +0 -37
- data/lib/gen/temporal/api/enums/v1/query_pb.rb +0 -31
- data/lib/gen/temporal/api/enums/v1/reset_pb.rb +0 -24
- data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +0 -28
- data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +0 -30
- data/lib/gen/temporal/api/enums/v1/update_pb.rb +0 -25
- data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +0 -89
- data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +0 -84
- data/lib/gen/temporal/api/failure/v1/message_pb.rb +0 -83
- data/lib/gen/temporal/api/filter/v1/message_pb.rb +0 -40
- data/lib/gen/temporal/api/history/v1/message_pb.rb +0 -498
- data/lib/gen/temporal/api/namespace/v1/message_pb.rb +0 -64
- data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +0 -88
- data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +0 -20
- data/lib/gen/temporal/api/protocol/v1/message_pb.rb +0 -30
- data/lib/gen/temporal/api/query/v1/message_pb.rb +0 -38
- data/lib/gen/temporal/api/replication/v1/message_pb.rb +0 -37
- data/lib/gen/temporal/api/schedule/v1/message_pb.rb +0 -149
- data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +0 -23
- data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +0 -73
- data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +0 -49
- data/lib/gen/temporal/api/testservice/v1/service_pb.rb +0 -21
- data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -72
- data/lib/gen/temporal/api/version/v1/message_pb.rb +0 -41
- data/lib/gen/temporal/api/workflow/v1/message_pb.rb +0 -111
- data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +0 -798
- data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +0 -20
- data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +0 -62
- data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +0 -61
- data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +0 -61
- data/lib/gen/temporal/sdk/core/common/common_pb.rb +0 -26
- data/lib/gen/temporal/sdk/core/core_interface_pb.rb +0 -40
- data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +0 -31
- data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +0 -171
- data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +0 -200
- data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +0 -41
- data/lib/temporalio/bridge/connect_options.rb +0 -15
- data/lib/temporalio/bridge/error.rb +0 -8
- data/lib/temporalio/bridge/retry_config.rb +0 -24
- data/lib/temporalio/bridge/tls_options.rb +0 -19
- data/lib/temporalio/bridge.rb +0 -14
- data/lib/temporalio/client/implementation.rb +0 -340
- data/lib/temporalio/connection/retry_config.rb +0 -44
- data/lib/temporalio/connection/service.rb +0 -20
- data/lib/temporalio/connection/test_service.rb +0 -92
- data/lib/temporalio/connection/tls_options.rb +0 -51
- data/lib/temporalio/connection/workflow_service.rb +0 -731
- data/lib/temporalio/connection.rb +0 -86
- data/lib/temporalio/data_converter.rb +0 -191
- data/lib/temporalio/error/workflow_failure.rb +0 -19
- data/lib/temporalio/errors.rb +0 -40
- data/lib/temporalio/failure_converter/base.rb +0 -26
- data/lib/temporalio/failure_converter/basic.rb +0 -319
- data/lib/temporalio/failure_converter.rb +0 -7
- data/lib/temporalio/interceptor/activity_inbound.rb +0 -22
- data/lib/temporalio/interceptor/activity_outbound.rb +0 -24
- data/lib/temporalio/interceptor/chain.rb +0 -28
- data/lib/temporalio/interceptor/client.rb +0 -127
- data/lib/temporalio/interceptor.rb +0 -22
- data/lib/temporalio/payload_codec/base.rb +0 -32
- data/lib/temporalio/payload_converter/base.rb +0 -24
- data/lib/temporalio/payload_converter/bytes.rb +0 -27
- data/lib/temporalio/payload_converter/composite.rb +0 -49
- data/lib/temporalio/payload_converter/encoding_base.rb +0 -35
- data/lib/temporalio/payload_converter/json.rb +0 -26
- data/lib/temporalio/payload_converter/nil.rb +0 -26
- data/lib/temporalio/payload_converter.rb +0 -14
- data/lib/temporalio/retry_state.rb +0 -35
- data/lib/temporalio/testing/time_skipping_handle.rb +0 -32
- data/lib/temporalio/testing/time_skipping_interceptor.rb +0 -23
- data/lib/temporalio/timeout_type.rb +0 -29
- data/lib/temporalio/worker/activity_runner.rb +0 -114
- data/lib/temporalio/worker/activity_worker.rb +0 -164
- data/lib/temporalio/worker/reactor.rb +0 -46
- data/lib/temporalio/worker/runner.rb +0 -63
- data/lib/temporalio/worker/sync_worker.rb +0 -124
- data/lib/temporalio/worker/thread_pool_executor.rb +0 -51
- data/lib/temporalio/workflow/async.rb +0 -46
- data/lib/temporalio/workflow/execution_info.rb +0 -54
- data/lib/temporalio/workflow/execution_status.rb +0 -36
- data/lib/temporalio/workflow/future.rb +0 -138
- data/lib/temporalio/workflow/id_reuse_policy.rb +0 -36
- data/lib/temporalio/workflow/info.rb +0 -76
- data/lib/temporalio/workflow/query_reject_condition.rb +0 -33
- data/lib/thermite_patch.rb +0 -33
- data/sig/async.rbs +0 -17
- data/sig/protobuf.rbs +0 -16
- data/sig/protos/dependencies/gogoproto/gogo.rbs +0 -914
- data/sig/protos/google/protobuf/any.rbs +0 -157
- data/sig/protos/google/protobuf/descriptor.rbs +0 -2825
- data/sig/protos/google/protobuf/duration.rbs +0 -114
- data/sig/protos/google/protobuf/empty.rbs +0 -36
- data/sig/protos/google/protobuf/timestamp.rbs +0 -145
- data/sig/protos/google/protobuf/wrappers.rbs +0 -358
- data/sig/protos/temporal/api/batch/v1/message.rbs +0 -300
- data/sig/protos/temporal/api/command/v1/message.rbs +0 -1399
- data/sig/protos/temporal/api/common/v1/message.rbs +0 -528
- data/sig/protos/temporal/api/enums/v1/batch_operation.rbs +0 -79
- data/sig/protos/temporal/api/enums/v1/command_type.rbs +0 -68
- data/sig/protos/temporal/api/enums/v1/common.rbs +0 -118
- data/sig/protos/temporal/api/enums/v1/event_type.rbs +0 -264
- data/sig/protos/temporal/api/enums/v1/failed_cause.rbs +0 -277
- data/sig/protos/temporal/api/enums/v1/namespace.rbs +0 -108
- data/sig/protos/temporal/api/enums/v1/query.rbs +0 -81
- data/sig/protos/temporal/api/enums/v1/reset.rbs +0 -44
- data/sig/protos/temporal/api/enums/v1/schedule.rbs +0 -72
- data/sig/protos/temporal/api/enums/v1/task_queue.rbs +0 -92
- data/sig/protos/temporal/api/enums/v1/update.rbs +0 -64
- data/sig/protos/temporal/api/enums/v1/workflow.rbs +0 -371
- data/sig/protos/temporal/api/errordetails/v1/message.rbs +0 -551
- data/sig/protos/temporal/api/failure/v1/message.rbs +0 -581
- data/sig/protos/temporal/api/filter/v1/message.rbs +0 -171
- data/sig/protos/temporal/api/history/v1/message.rbs +0 -4609
- data/sig/protos/temporal/api/namespace/v1/message.rbs +0 -410
- data/sig/protos/temporal/api/operatorservice/v1/request_response.rbs +0 -643
- data/sig/protos/temporal/api/operatorservice/v1/service.rbs +0 -17
- data/sig/protos/temporal/api/protocol/v1/message.rbs +0 -84
- data/sig/protos/temporal/api/query/v1/message.rbs +0 -182
- data/sig/protos/temporal/api/replication/v1/message.rbs +0 -148
- data/sig/protos/temporal/api/schedule/v1/message.rbs +0 -1488
- data/sig/protos/temporal/api/sdk/v1/task_complete_metadata.rbs +0 -110
- data/sig/protos/temporal/api/taskqueue/v1/message.rbs +0 -486
- data/sig/protos/temporal/api/testservice/v1/request_response.rbs +0 -249
- data/sig/protos/temporal/api/testservice/v1/service.rbs +0 -15
- data/sig/protos/temporal/api/update/v1/message.rbs +0 -489
- data/sig/protos/temporal/api/version/v1/message.rbs +0 -184
- data/sig/protos/temporal/api/workflow/v1/message.rbs +0 -824
- data/sig/protos/temporal/api/workflowservice/v1/request_response.rbs +0 -7250
- data/sig/protos/temporal/api/workflowservice/v1/service.rbs +0 -22
- data/sig/protos/temporal/sdk/core/activity_result/activity_result.rbs +0 -380
- data/sig/protos/temporal/sdk/core/activity_task/activity_task.rbs +0 -386
- data/sig/protos/temporal/sdk/core/child_workflow/child_workflow.rbs +0 -323
- data/sig/protos/temporal/sdk/core/common/common.rbs +0 -62
- data/sig/protos/temporal/sdk/core/core_interface.rbs +0 -101
- data/sig/protos/temporal/sdk/core/external_data/external_data.rbs +0 -119
- data/sig/protos/temporal/sdk/core/workflow_activation/workflow_activation.rbs +0 -1473
- data/sig/protos/temporal/sdk/core/workflow_commands/workflow_commands.rbs +0 -1784
- data/sig/protos/temporal/sdk/core/workflow_completion/workflow_completion.rbs +0 -180
- data/sig/ruby.rbs +0 -12
- data/sig/temporalio/activity/context.rbs +0 -29
- data/sig/temporalio/activity/info.rbs +0 -43
- data/sig/temporalio/activity.rbs +0 -19
- data/sig/temporalio/bridge/connect_options.rbs +0 -19
- data/sig/temporalio/bridge/error.rbs +0 -8
- data/sig/temporalio/bridge/retry_config.rbs +0 -21
- data/sig/temporalio/bridge/tls_options.rbs +0 -17
- data/sig/temporalio/bridge.rbs +0 -71
- data/sig/temporalio/client/implementation.rbs +0 -38
- data/sig/temporalio/client/workflow_handle.rbs +0 -41
- data/sig/temporalio/client.rbs +0 -35
- data/sig/temporalio/connection/retry_config.rbs +0 -37
- data/sig/temporalio/connection/service.rbs +0 -14
- data/sig/temporalio/connection/test_service.rbs +0 -13
- data/sig/temporalio/connection/tls_options.rbs +0 -43
- data/sig/temporalio/connection/workflow_service.rbs +0 -48
- data/sig/temporalio/connection.rbs +0 -30
- data/sig/temporalio/data_converter.rbs +0 -35
- data/sig/temporalio/error/failure.rbs +0 -121
- data/sig/temporalio/error/workflow_failure.rbs +0 -9
- data/sig/temporalio/errors.rbs +0 -36
- data/sig/temporalio/failure_converter/base.rbs +0 -12
- data/sig/temporalio/failure_converter/basic.rbs +0 -86
- data/sig/temporalio/failure_converter.rbs +0 -5
- data/sig/temporalio/interceptor/activity_inbound.rbs +0 -21
- data/sig/temporalio/interceptor/activity_outbound.rbs +0 -10
- data/sig/temporalio/interceptor/chain.rbs +0 -24
- data/sig/temporalio/interceptor/client.rbs +0 -148
- data/sig/temporalio/interceptor.rbs +0 -6
- data/sig/temporalio/payload_codec/base.rbs +0 -12
- data/sig/temporalio/payload_converter/base.rbs +0 -12
- data/sig/temporalio/payload_converter/bytes.rbs +0 -9
- data/sig/temporalio/payload_converter/composite.rbs +0 -19
- data/sig/temporalio/payload_converter/encoding_base.rbs +0 -14
- data/sig/temporalio/payload_converter/json.rbs +0 -9
- data/sig/temporalio/payload_converter/nil.rbs +0 -9
- data/sig/temporalio/payload_converter.rbs +0 -5
- data/sig/temporalio/retry_policy.rbs +0 -25
- data/sig/temporalio/retry_state.rbs +0 -20
- data/sig/temporalio/runtime.rbs +0 -12
- data/sig/temporalio/testing/time_skipping_handle.rbs +0 -15
- data/sig/temporalio/testing/time_skipping_interceptor.rbs +0 -13
- data/sig/temporalio/testing/workflow_environment.rbs +0 -22
- data/sig/temporalio/testing.rbs +0 -35
- data/sig/temporalio/timeout_type.rbs +0 -15
- data/sig/temporalio/version.rbs +0 -3
- data/sig/temporalio/worker/activity_runner.rbs +0 -35
- data/sig/temporalio/worker/activity_worker.rbs +0 -44
- data/sig/temporalio/worker/reactor.rbs +0 -22
- data/sig/temporalio/worker/runner.rbs +0 -21
- data/sig/temporalio/worker/sync_worker.rbs +0 -23
- data/sig/temporalio/worker/thread_pool_executor.rbs +0 -23
- data/sig/temporalio/worker.rbs +0 -46
- data/sig/temporalio/workflow/async.rbs +0 -9
- data/sig/temporalio/workflow/execution_info.rbs +0 -55
- data/sig/temporalio/workflow/execution_status.rbs +0 -21
- data/sig/temporalio/workflow/future.rbs +0 -40
- data/sig/temporalio/workflow/id_reuse_policy.rbs +0 -15
- data/sig/temporalio/workflow/info.rbs +0 -55
- data/sig/temporalio/workflow/query_reject_condition.rbs +0 -14
- data/sig/temporalio.rbs +0 -2
- data/sig/thermite_patch.rbs +0 -15
|
@@ -1,557 +0,0 @@
|
|
|
1
|
-
mod activity_heartbeat_manager;
|
|
2
|
-
mod activity_task_poller_stream;
|
|
3
|
-
mod local_activities;
|
|
4
|
-
|
|
5
|
-
pub(crate) use local_activities::{
|
|
6
|
-
DispatchOrTimeoutLA, ExecutingLAId, LACompleteAction, LocalActRequest,
|
|
7
|
-
LocalActivityExecutionResult, LocalActivityManager, LocalActivityResolution,
|
|
8
|
-
LocalInFlightActInfo, NewLocalAct,
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
use crate::abstractions::{ClosableMeteredSemaphore, TrackedOwnedMeteredSemPermit};
|
|
12
|
-
use crate::worker::activities::activity_task_poller_stream::new_activity_task_poller;
|
|
13
|
-
use crate::{
|
|
14
|
-
abstractions::{MeteredSemaphore, OwnedMeteredSemPermit, UsedMeteredSemPermit},
|
|
15
|
-
pollers::BoxedActPoller,
|
|
16
|
-
telemetry::metrics::{
|
|
17
|
-
activity_type, activity_worker_type, eager, workflow_type, MetricsContext,
|
|
18
|
-
},
|
|
19
|
-
worker::{
|
|
20
|
-
activities::activity_heartbeat_manager::ActivityHeartbeatError, client::WorkerClient,
|
|
21
|
-
},
|
|
22
|
-
PollActivityError, TaskToken,
|
|
23
|
-
};
|
|
24
|
-
use activity_heartbeat_manager::ActivityHeartbeatManager;
|
|
25
|
-
use dashmap::DashMap;
|
|
26
|
-
use futures::{stream, stream::BoxStream, stream::PollNext, Stream, StreamExt};
|
|
27
|
-
use governor::{Quota, RateLimiter};
|
|
28
|
-
use std::{
|
|
29
|
-
convert::TryInto,
|
|
30
|
-
future,
|
|
31
|
-
sync::Arc,
|
|
32
|
-
time::{Duration, Instant},
|
|
33
|
-
};
|
|
34
|
-
use temporal_sdk_core_protos::{
|
|
35
|
-
coresdk::{
|
|
36
|
-
activity_result::{self as ar, activity_execution_result as aer},
|
|
37
|
-
activity_task::{ActivityCancelReason, ActivityTask},
|
|
38
|
-
ActivityHeartbeat,
|
|
39
|
-
},
|
|
40
|
-
temporal::api::{
|
|
41
|
-
failure::v1::{failure::FailureInfo, CanceledFailureInfo, Failure},
|
|
42
|
-
workflowservice::v1::PollActivityTaskQueueResponse,
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
use tokio::sync::mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender};
|
|
46
|
-
use tokio::sync::{Mutex, Notify};
|
|
47
|
-
use tokio_stream::wrappers::UnboundedReceiverStream;
|
|
48
|
-
use tokio_util::sync::CancellationToken;
|
|
49
|
-
use tracing::Span;
|
|
50
|
-
|
|
51
|
-
#[derive(Debug, derive_more::Constructor)]
|
|
52
|
-
struct PendingActivityCancel {
|
|
53
|
-
task_token: TaskToken,
|
|
54
|
-
reason: ActivityCancelReason,
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/// Contains details that core wants to store while an activity is running.
|
|
58
|
-
#[derive(Debug)]
|
|
59
|
-
struct InFlightActInfo {
|
|
60
|
-
pub activity_type: String,
|
|
61
|
-
pub workflow_type: String,
|
|
62
|
-
/// Only kept for logging reasons
|
|
63
|
-
pub workflow_id: String,
|
|
64
|
-
/// Only kept for logging reasons
|
|
65
|
-
pub workflow_run_id: String,
|
|
66
|
-
start_time: Instant,
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/// Augments [InFlightActInfo] with details specific to remote activities
|
|
70
|
-
struct RemoteInFlightActInfo {
|
|
71
|
-
pub base: InFlightActInfo,
|
|
72
|
-
/// Used to calculate aggregation delay between activity heartbeats.
|
|
73
|
-
pub heartbeat_timeout: Option<prost_types::Duration>,
|
|
74
|
-
/// Set to true if we have already issued a cancellation activation to lang for this activity
|
|
75
|
-
pub issued_cancel_to_lang: bool,
|
|
76
|
-
/// Set to true if we have already learned from the server this activity doesn't exist. EX:
|
|
77
|
-
/// we have learned from heartbeating and issued a cancel task, in which case we may simply
|
|
78
|
-
/// discard the reply.
|
|
79
|
-
pub known_not_found: bool,
|
|
80
|
-
/// The permit from the max concurrent semaphore
|
|
81
|
-
_permit: UsedMeteredSemPermit,
|
|
82
|
-
}
|
|
83
|
-
impl RemoteInFlightActInfo {
|
|
84
|
-
fn new(poll_resp: &PollActivityTaskQueueResponse, permit: UsedMeteredSemPermit) -> Self {
|
|
85
|
-
let wec = poll_resp.workflow_execution.clone().unwrap_or_default();
|
|
86
|
-
Self {
|
|
87
|
-
base: InFlightActInfo {
|
|
88
|
-
activity_type: poll_resp.activity_type.clone().unwrap_or_default().name,
|
|
89
|
-
workflow_type: poll_resp.workflow_type.clone().unwrap_or_default().name,
|
|
90
|
-
workflow_id: wec.workflow_id,
|
|
91
|
-
workflow_run_id: wec.run_id,
|
|
92
|
-
start_time: Instant::now(),
|
|
93
|
-
},
|
|
94
|
-
heartbeat_timeout: poll_resp.heartbeat_timeout.clone(),
|
|
95
|
-
issued_cancel_to_lang: false,
|
|
96
|
-
known_not_found: false,
|
|
97
|
-
_permit: permit,
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
pub(crate) struct WorkerActivityTasks {
|
|
103
|
-
/// Token used to signal the server task poller that shutdown is beginning
|
|
104
|
-
poller_shutdown_token: CancellationToken,
|
|
105
|
-
/// Centralizes management of heartbeat issuing / throttling
|
|
106
|
-
heartbeat_manager: ActivityHeartbeatManager,
|
|
107
|
-
/// Combined stream for any ActivityTask producing source (polls, eager activities, cancellations)
|
|
108
|
-
activity_task_stream: Mutex<BoxStream<'static, Result<ActivityTask, PollActivityError>>>,
|
|
109
|
-
/// Activities that have been issued to lang but not yet completed
|
|
110
|
-
outstanding_activity_tasks: Arc<DashMap<TaskToken, RemoteInFlightActInfo>>,
|
|
111
|
-
/// Ensures we don't exceed this worker's maximum concurrent activity limit for activities.
|
|
112
|
-
/// This semaphore is used to limit eager activities but shares the same underlying [MeteredSemaphore] that is used
|
|
113
|
-
/// to limit the concurrency for non-eager activities.
|
|
114
|
-
eager_activities_semaphore: Arc<ClosableMeteredSemaphore>,
|
|
115
|
-
/// Holds activity tasks we have received in direct response to workflow task completion (a.k.a eager activities).
|
|
116
|
-
/// Tasks received in this stream hold a "tracked" permit that is issued by the `eager_activities_semaphore`.
|
|
117
|
-
eager_activities_tx: UnboundedSender<TrackedPermittedTqResp>,
|
|
118
|
-
|
|
119
|
-
metrics: MetricsContext,
|
|
120
|
-
|
|
121
|
-
max_heartbeat_throttle_interval: Duration,
|
|
122
|
-
default_heartbeat_throttle_interval: Duration,
|
|
123
|
-
|
|
124
|
-
/// Wakes every time an activity is removed from the outstanding map
|
|
125
|
-
complete_notify: Arc<Notify>,
|
|
126
|
-
/// Token to notify when poll returned a shutdown error
|
|
127
|
-
poll_returned_shutdown_token: CancellationToken,
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
#[derive(derive_more::From)]
|
|
131
|
-
enum ActivityTaskSource {
|
|
132
|
-
PendingCancel(PendingActivityCancel),
|
|
133
|
-
PendingStart(Result<(PermittedTqResp, bool), PollActivityError>),
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
impl WorkerActivityTasks {
|
|
137
|
-
pub(crate) fn new(
|
|
138
|
-
max_activity_tasks: usize,
|
|
139
|
-
max_worker_act_per_sec: Option<f64>,
|
|
140
|
-
poller: BoxedActPoller,
|
|
141
|
-
client: Arc<dyn WorkerClient>,
|
|
142
|
-
metrics: MetricsContext,
|
|
143
|
-
max_heartbeat_throttle_interval: Duration,
|
|
144
|
-
default_heartbeat_throttle_interval: Duration,
|
|
145
|
-
) -> Self {
|
|
146
|
-
let semaphore = Arc::new(MeteredSemaphore::new(
|
|
147
|
-
max_activity_tasks,
|
|
148
|
-
metrics.with_new_attrs([activity_worker_type()]),
|
|
149
|
-
MetricsContext::available_task_slots,
|
|
150
|
-
));
|
|
151
|
-
let poller_shutdown_token = CancellationToken::new();
|
|
152
|
-
let rate_limiter = max_worker_act_per_sec.and_then(|ps| {
|
|
153
|
-
Quota::with_period(Duration::from_secs_f64(ps.recip())).map(RateLimiter::direct)
|
|
154
|
-
});
|
|
155
|
-
let outstanding_activity_tasks = Arc::new(DashMap::new());
|
|
156
|
-
let server_poller_stream = new_activity_task_poller(
|
|
157
|
-
poller,
|
|
158
|
-
semaphore.clone(),
|
|
159
|
-
rate_limiter,
|
|
160
|
-
metrics.clone(),
|
|
161
|
-
poller_shutdown_token.clone(),
|
|
162
|
-
);
|
|
163
|
-
let (eager_activities_tx, eager_activities_rx) = unbounded_channel();
|
|
164
|
-
let eager_activities_semaphore = ClosableMeteredSemaphore::new_arc(semaphore);
|
|
165
|
-
|
|
166
|
-
let start_tasks_stream_complete = CancellationToken::new();
|
|
167
|
-
let starts_stream = Self::merge_start_task_sources(
|
|
168
|
-
eager_activities_rx,
|
|
169
|
-
server_poller_stream,
|
|
170
|
-
eager_activities_semaphore.clone(),
|
|
171
|
-
start_tasks_stream_complete.clone(),
|
|
172
|
-
);
|
|
173
|
-
let (heartbeat_manager, cancels_rx) = ActivityHeartbeatManager::new(client);
|
|
174
|
-
let complete_notify = Arc::new(Notify::new());
|
|
175
|
-
let source_stream = stream::select_with_strategy(
|
|
176
|
-
UnboundedReceiverStream::new(cancels_rx).map(ActivityTaskSource::from),
|
|
177
|
-
starts_stream.map(ActivityTaskSource::from),
|
|
178
|
-
|_: &mut ()| PollNext::Left,
|
|
179
|
-
);
|
|
180
|
-
// Create a task stream composed of (in poll preference order):
|
|
181
|
-
// cancels_stream ------------------------------+--- activity_task_stream
|
|
182
|
-
// eager_activities_rx ---+--- starts_stream ---|
|
|
183
|
-
// server_poll_stream ---|
|
|
184
|
-
let activity_task_stream = Self::merge_source_streams(
|
|
185
|
-
source_stream,
|
|
186
|
-
outstanding_activity_tasks.clone(),
|
|
187
|
-
start_tasks_stream_complete,
|
|
188
|
-
complete_notify.clone(),
|
|
189
|
-
metrics.clone(),
|
|
190
|
-
);
|
|
191
|
-
|
|
192
|
-
Self {
|
|
193
|
-
poller_shutdown_token,
|
|
194
|
-
eager_activities_tx,
|
|
195
|
-
heartbeat_manager,
|
|
196
|
-
activity_task_stream: Mutex::new(activity_task_stream.boxed()),
|
|
197
|
-
outstanding_activity_tasks,
|
|
198
|
-
eager_activities_semaphore,
|
|
199
|
-
complete_notify,
|
|
200
|
-
metrics,
|
|
201
|
-
max_heartbeat_throttle_interval,
|
|
202
|
-
default_heartbeat_throttle_interval,
|
|
203
|
-
poll_returned_shutdown_token: CancellationToken::new(),
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/// Merges the server poll and eager [ActivityTask] sources
|
|
208
|
-
fn merge_start_task_sources(
|
|
209
|
-
non_poll_tasks_rx: UnboundedReceiver<TrackedPermittedTqResp>,
|
|
210
|
-
poller_stream: impl Stream<Item = Result<PermittedTqResp, tonic::Status>>,
|
|
211
|
-
eager_activities_semaphore: Arc<ClosableMeteredSemaphore>,
|
|
212
|
-
on_complete_token: CancellationToken,
|
|
213
|
-
) -> impl Stream<Item = Result<(PermittedTqResp, bool), PollActivityError>> {
|
|
214
|
-
let non_poll_stream = stream::unfold(
|
|
215
|
-
(non_poll_tasks_rx, eager_activities_semaphore),
|
|
216
|
-
|(mut non_poll_tasks_rx, eager_activities_semaphore)| async move {
|
|
217
|
-
loop {
|
|
218
|
-
tokio::select! {
|
|
219
|
-
biased;
|
|
220
|
-
|
|
221
|
-
task_opt = non_poll_tasks_rx.recv() => {
|
|
222
|
-
// Add is_eager true and wrap in Result
|
|
223
|
-
return task_opt.map(|task| (Ok((PermittedTqResp{ permit: task.permit.into(), resp: task.resp }, true)), (non_poll_tasks_rx, eager_activities_semaphore)));
|
|
224
|
-
}
|
|
225
|
-
_ = eager_activities_semaphore.close_complete() => {
|
|
226
|
-
// Once shutting down, we stop accepting eager activities
|
|
227
|
-
non_poll_tasks_rx.close();
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
},
|
|
233
|
-
);
|
|
234
|
-
// Add is_eager false
|
|
235
|
-
let poller_stream = poller_stream.map(|res| res.map(|task| (task, false)));
|
|
236
|
-
|
|
237
|
-
// Prefer eager activities over polling the server
|
|
238
|
-
stream::select_with_strategy(non_poll_stream, poller_stream, |_: &mut ()| PollNext::Left)
|
|
239
|
-
.map(|res| res.map_err(|err| err.into()))
|
|
240
|
-
// This map, chain, filter_map sequence is here to cancel the token when this stream ends.
|
|
241
|
-
.map(Some)
|
|
242
|
-
.chain(futures::stream::once(async move {
|
|
243
|
-
on_complete_token.cancel();
|
|
244
|
-
None
|
|
245
|
-
}))
|
|
246
|
-
.filter_map(future::ready)
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/// Builds an [ActivityTask] stream for cancellation tasks from cancels delivered from heartbeats
|
|
250
|
-
fn merge_source_streams(
|
|
251
|
-
source_stream: impl Stream<Item = ActivityTaskSource>,
|
|
252
|
-
outstanding_tasks: Arc<DashMap<TaskToken, RemoteInFlightActInfo>>,
|
|
253
|
-
start_tasks_stream_complete: CancellationToken,
|
|
254
|
-
complete_notify: Arc<Notify>,
|
|
255
|
-
metrics: MetricsContext,
|
|
256
|
-
) -> impl Stream<Item = Result<ActivityTask, PollActivityError>> {
|
|
257
|
-
let outstanding_tasks_clone = outstanding_tasks.clone();
|
|
258
|
-
source_stream.filter_map(move |source| {
|
|
259
|
-
let outstanding_tasks = outstanding_tasks.clone();
|
|
260
|
-
let metrics = metrics.clone();
|
|
261
|
-
async move {
|
|
262
|
-
match source {
|
|
263
|
-
ActivityTaskSource::PendingCancel(next_pc) => {
|
|
264
|
-
// It's possible that activity has been completed and we no longer have an
|
|
265
|
-
// outstanding activity task. This is fine because it means that we no
|
|
266
|
-
// longer need to cancel this activity, so we'll just ignore such orphaned
|
|
267
|
-
// cancellations.
|
|
268
|
-
if let Some(mut details) = outstanding_tasks.get_mut(&next_pc.task_token) {
|
|
269
|
-
if details.issued_cancel_to_lang {
|
|
270
|
-
// Don't double-issue cancellations
|
|
271
|
-
return None
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
details.issued_cancel_to_lang = true;
|
|
275
|
-
if next_pc.reason == ActivityCancelReason::NotFound {
|
|
276
|
-
details.known_not_found = true;
|
|
277
|
-
}
|
|
278
|
-
Some(Ok(ActivityTask::cancel_from_ids(next_pc.task_token.0, next_pc.reason)))
|
|
279
|
-
} else {
|
|
280
|
-
debug!(task_token = ?next_pc.task_token, "Unknown activity task when issuing cancel");
|
|
281
|
-
// If we can't find the activity here, it's already been completed,
|
|
282
|
-
// in which case issuing a cancel again is pointless.
|
|
283
|
-
None
|
|
284
|
-
}
|
|
285
|
-
},
|
|
286
|
-
ActivityTaskSource::PendingStart(res) => {
|
|
287
|
-
Some(res.map(|(task, is_eager)| {
|
|
288
|
-
Self::about_to_issue_task(outstanding_tasks, task, is_eager, metrics)
|
|
289
|
-
}))
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}).take_until(async move {
|
|
294
|
-
start_tasks_stream_complete.cancelled().await;
|
|
295
|
-
while !outstanding_tasks_clone.is_empty() {
|
|
296
|
-
complete_notify.notified().await
|
|
297
|
-
}
|
|
298
|
-
})
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
pub(crate) fn notify_shutdown(&self) {
|
|
302
|
-
self.poller_shutdown_token.cancel();
|
|
303
|
-
self.eager_activities_semaphore.close();
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
async fn shutdown_complete(&self) {
|
|
307
|
-
self.poll_returned_shutdown_token.cancelled().await;
|
|
308
|
-
self.heartbeat_manager.shutdown().await;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
pub(crate) async fn shutdown(&self) {
|
|
312
|
-
self.notify_shutdown();
|
|
313
|
-
self.shutdown_complete().await;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/// Exclusive poll for activity tasks
|
|
317
|
-
///
|
|
318
|
-
/// Polls the various task sources (server polls, eager activities, cancellations) while respecting the provided rate limits and allowed concurrency.
|
|
319
|
-
/// Returns Err(PollActivityError::ShutDown) after shutdown is completed and all tasks sources are depleted.
|
|
320
|
-
pub(crate) async fn poll(&self) -> Result<ActivityTask, PollActivityError> {
|
|
321
|
-
let mut poller_stream = self.activity_task_stream.lock().await;
|
|
322
|
-
poller_stream.next().await.unwrap_or_else(|| {
|
|
323
|
-
self.poll_returned_shutdown_token.cancel();
|
|
324
|
-
Err(PollActivityError::ShutDown)
|
|
325
|
-
})
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
pub(crate) async fn complete(
|
|
329
|
-
&self,
|
|
330
|
-
task_token: TaskToken,
|
|
331
|
-
status: aer::Status,
|
|
332
|
-
client: &dyn WorkerClient,
|
|
333
|
-
) {
|
|
334
|
-
if let Some((_, act_info)) = self.outstanding_activity_tasks.remove(&task_token) {
|
|
335
|
-
let act_metrics = self.metrics.with_new_attrs([
|
|
336
|
-
activity_type(act_info.base.activity_type),
|
|
337
|
-
workflow_type(act_info.base.workflow_type),
|
|
338
|
-
]);
|
|
339
|
-
Span::current().record("workflow_id", act_info.base.workflow_id);
|
|
340
|
-
Span::current().record("run_id", act_info.base.workflow_run_id);
|
|
341
|
-
act_metrics.act_execution_latency(act_info.base.start_time.elapsed());
|
|
342
|
-
let known_not_found = act_info.known_not_found;
|
|
343
|
-
|
|
344
|
-
self.heartbeat_manager.evict(task_token.clone()).await;
|
|
345
|
-
self.complete_notify.notify_waiters();
|
|
346
|
-
|
|
347
|
-
// No need to report activities which we already know the server doesn't care about
|
|
348
|
-
if !known_not_found {
|
|
349
|
-
let maybe_net_err = match status {
|
|
350
|
-
aer::Status::WillCompleteAsync(_) => None,
|
|
351
|
-
aer::Status::Completed(ar::Success { result }) => client
|
|
352
|
-
.complete_activity_task(task_token.clone(), result.map(Into::into))
|
|
353
|
-
.await
|
|
354
|
-
.err(),
|
|
355
|
-
aer::Status::Failed(ar::Failure { failure }) => {
|
|
356
|
-
act_metrics.act_execution_failed();
|
|
357
|
-
client
|
|
358
|
-
.fail_activity_task(task_token.clone(), failure.map(Into::into))
|
|
359
|
-
.await
|
|
360
|
-
.err()
|
|
361
|
-
}
|
|
362
|
-
aer::Status::Cancelled(ar::Cancellation { failure }) => {
|
|
363
|
-
let details = if let Some(Failure {
|
|
364
|
-
failure_info:
|
|
365
|
-
Some(FailureInfo::CanceledFailureInfo(CanceledFailureInfo { details })),
|
|
366
|
-
..
|
|
367
|
-
}) = failure
|
|
368
|
-
{
|
|
369
|
-
details
|
|
370
|
-
} else {
|
|
371
|
-
warn!(task_token = ? task_token,
|
|
372
|
-
"Expected activity cancelled status with CanceledFailureInfo");
|
|
373
|
-
None
|
|
374
|
-
};
|
|
375
|
-
client
|
|
376
|
-
.cancel_activity_task(task_token.clone(), details.map(Into::into))
|
|
377
|
-
.await
|
|
378
|
-
.err()
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
|
|
382
|
-
if let Some(e) = maybe_net_err {
|
|
383
|
-
if e.code() == tonic::Code::NotFound {
|
|
384
|
-
warn!(task_token = ?task_token, details = ?e, "Activity not found on \
|
|
385
|
-
completion. This may happen if the activity has already been cancelled but \
|
|
386
|
-
completed anyway.");
|
|
387
|
-
} else {
|
|
388
|
-
warn!(error=?e, "Network error while completing activity");
|
|
389
|
-
};
|
|
390
|
-
};
|
|
391
|
-
};
|
|
392
|
-
} else {
|
|
393
|
-
warn!(
|
|
394
|
-
"Attempted to complete activity task {} but we were not tracking it",
|
|
395
|
-
&task_token
|
|
396
|
-
);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/// Attempt to record an activity heartbeat
|
|
401
|
-
pub(crate) fn record_heartbeat(
|
|
402
|
-
&self,
|
|
403
|
-
details: ActivityHeartbeat,
|
|
404
|
-
) -> Result<(), ActivityHeartbeatError> {
|
|
405
|
-
// TODO: Propagate these back as cancels. Silent fails is too nonobvious
|
|
406
|
-
let heartbeat_timeout: Duration = self
|
|
407
|
-
.outstanding_activity_tasks
|
|
408
|
-
.get(&TaskToken(details.task_token.clone()))
|
|
409
|
-
.ok_or(ActivityHeartbeatError::UnknownActivity)?
|
|
410
|
-
.heartbeat_timeout
|
|
411
|
-
.clone()
|
|
412
|
-
// We treat None as 0 (even though heartbeat_timeout is never set to None by the server)
|
|
413
|
-
.unwrap_or_default()
|
|
414
|
-
.try_into()
|
|
415
|
-
// This technically should never happen since prost duration should be directly mappable
|
|
416
|
-
// to std::time::Duration.
|
|
417
|
-
.or(Err(ActivityHeartbeatError::InvalidHeartbeatTimeout))?;
|
|
418
|
-
|
|
419
|
-
// There is a bug in the server that translates non-set heartbeat timeouts into 0 duration.
|
|
420
|
-
// That's why we treat 0 the same way as None, otherwise we wouldn't know which aggregation
|
|
421
|
-
// delay to use, and using 0 is not a good idea as SDK would hammer the server too hard.
|
|
422
|
-
let throttle_interval = if heartbeat_timeout.as_millis() == 0 {
|
|
423
|
-
self.default_heartbeat_throttle_interval
|
|
424
|
-
} else {
|
|
425
|
-
heartbeat_timeout.mul_f64(0.8)
|
|
426
|
-
};
|
|
427
|
-
let throttle_interval =
|
|
428
|
-
std::cmp::min(throttle_interval, self.max_heartbeat_throttle_interval);
|
|
429
|
-
self.heartbeat_manager.record(details, throttle_interval)
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
/// Returns a handle that the workflows management side can use to interact with this manager
|
|
433
|
-
pub(crate) fn get_handle_for_workflows(&self) -> ActivitiesFromWFTsHandle {
|
|
434
|
-
ActivitiesFromWFTsHandle {
|
|
435
|
-
sem: self.eager_activities_semaphore.clone(),
|
|
436
|
-
tx: self.eager_activities_tx.clone(),
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/// Called when there is a new [ActivityTask] about to be bubbled up out of the poller
|
|
441
|
-
fn about_to_issue_task(
|
|
442
|
-
outstanding_tasks: Arc<DashMap<TaskToken, RemoteInFlightActInfo>>,
|
|
443
|
-
task: PermittedTqResp,
|
|
444
|
-
is_eager: bool,
|
|
445
|
-
metrics: MetricsContext,
|
|
446
|
-
) -> ActivityTask {
|
|
447
|
-
if let Some(ref act_type) = task.resp.activity_type {
|
|
448
|
-
if let Some(ref wf_type) = task.resp.workflow_type {
|
|
449
|
-
metrics
|
|
450
|
-
.with_new_attrs([
|
|
451
|
-
activity_type(act_type.name.clone()),
|
|
452
|
-
workflow_type(wf_type.name.clone()),
|
|
453
|
-
eager(is_eager),
|
|
454
|
-
])
|
|
455
|
-
.act_task_received();
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
// There could be an else statement here but since the response should always contain both
|
|
459
|
-
// activity_type and workflow_type, we won't bother.
|
|
460
|
-
|
|
461
|
-
if let Some(dur) = task.resp.sched_to_start() {
|
|
462
|
-
metrics.act_sched_to_start_latency(dur);
|
|
463
|
-
};
|
|
464
|
-
|
|
465
|
-
outstanding_tasks.insert(
|
|
466
|
-
task.resp.task_token.clone().into(),
|
|
467
|
-
RemoteInFlightActInfo::new(&task.resp, task.permit.into_used()),
|
|
468
|
-
);
|
|
469
|
-
|
|
470
|
-
ActivityTask::start_from_poll_resp(task.resp)
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
#[cfg(test)]
|
|
474
|
-
pub(crate) fn remaining_activity_capacity(&self) -> usize {
|
|
475
|
-
self.eager_activities_semaphore.available_permits()
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
/// Provides facilities for the workflow side of things to interact with the activity manager.
|
|
480
|
-
/// Allows for the handling of activities returned by WFT completions.
|
|
481
|
-
pub(crate) struct ActivitiesFromWFTsHandle {
|
|
482
|
-
sem: Arc<ClosableMeteredSemaphore>,
|
|
483
|
-
tx: UnboundedSender<TrackedPermittedTqResp>,
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
impl ActivitiesFromWFTsHandle {
|
|
487
|
-
/// Returns a handle that can be used to reserve an activity slot. EX: When requesting eager
|
|
488
|
-
/// dispatch of an activity to this worker upon workflow task completion
|
|
489
|
-
pub(crate) fn reserve_slot(&self) -> Option<TrackedOwnedMeteredSemPermit> {
|
|
490
|
-
// TODO: check if rate limit is not exceeded and count this reservation towards the rate limit
|
|
491
|
-
self.sem.try_acquire_owned().ok()
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/// Queue new activity tasks for dispatch received from non-polling sources (ex: eager returns
|
|
495
|
-
/// from WFT completion)
|
|
496
|
-
pub(crate) fn add_tasks(&self, tasks: impl IntoIterator<Item = TrackedPermittedTqResp>) {
|
|
497
|
-
for t in tasks.into_iter() {
|
|
498
|
-
// Technically we should be reporting `activity_task_received` here, but for simplicity
|
|
499
|
-
// and time insensitivity, that metric is tracked in `about_to_issue_task`.
|
|
500
|
-
self.tx.send(t).expect("Receive half cannot be dropped");
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
#[derive(Debug)]
|
|
506
|
-
pub(crate) struct PermittedTqResp {
|
|
507
|
-
pub permit: OwnedMeteredSemPermit,
|
|
508
|
-
pub resp: PollActivityTaskQueueResponse,
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
#[derive(Debug)]
|
|
512
|
-
pub(crate) struct TrackedPermittedTqResp {
|
|
513
|
-
pub permit: TrackedOwnedMeteredSemPermit,
|
|
514
|
-
pub resp: PollActivityTaskQueueResponse,
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
#[cfg(test)]
|
|
518
|
-
mod tests {
|
|
519
|
-
use super::*;
|
|
520
|
-
use crate::{
|
|
521
|
-
test_help::mock_poller_from_resps, worker::client::mocks::mock_manual_workflow_client,
|
|
522
|
-
};
|
|
523
|
-
|
|
524
|
-
#[tokio::test]
|
|
525
|
-
async fn per_worker_ratelimit() {
|
|
526
|
-
let poller = mock_poller_from_resps([
|
|
527
|
-
PollActivityTaskQueueResponse {
|
|
528
|
-
task_token: vec![1],
|
|
529
|
-
activity_id: "act1".to_string(),
|
|
530
|
-
..Default::default()
|
|
531
|
-
}
|
|
532
|
-
.into(),
|
|
533
|
-
PollActivityTaskQueueResponse {
|
|
534
|
-
task_token: vec![2],
|
|
535
|
-
activity_id: "act2".to_string(),
|
|
536
|
-
..Default::default()
|
|
537
|
-
}
|
|
538
|
-
.into(),
|
|
539
|
-
]);
|
|
540
|
-
let atm = WorkerActivityTasks::new(
|
|
541
|
-
10,
|
|
542
|
-
Some(2.0),
|
|
543
|
-
poller,
|
|
544
|
-
Arc::new(mock_manual_workflow_client()),
|
|
545
|
-
MetricsContext::no_op(),
|
|
546
|
-
Duration::from_secs(1),
|
|
547
|
-
Duration::from_secs(1),
|
|
548
|
-
);
|
|
549
|
-
let start = Instant::now();
|
|
550
|
-
atm.poll().await.unwrap();
|
|
551
|
-
atm.poll().await.unwrap();
|
|
552
|
-
// At least half a second will have elapsed since we only allow 2 tasks per second.
|
|
553
|
-
// With no ratelimit, even on a slow CI server with lots of load, this would typically take
|
|
554
|
-
// low single digit ms or less.
|
|
555
|
-
assert!(start.elapsed() > Duration::from_secs_f64(0.5));
|
|
556
|
-
}
|
|
557
|
-
}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
use super::*;
|
|
2
|
-
use futures::Future;
|
|
3
|
-
|
|
4
|
-
pub(crate) static DEFAULT_TEST_CAPABILITIES: &Capabilities = &Capabilities {
|
|
5
|
-
signal_and_query_header: true,
|
|
6
|
-
internal_error_differentiation: true,
|
|
7
|
-
activity_failure_include_heartbeat: true,
|
|
8
|
-
supports_schedules: true,
|
|
9
|
-
encoded_failure_attributes: true,
|
|
10
|
-
build_id_based_versioning: true,
|
|
11
|
-
upsert_memo: true,
|
|
12
|
-
eager_workflow_start: true,
|
|
13
|
-
sdk_metadata: true,
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
#[cfg(test)]
|
|
17
|
-
/// Create a mock client primed with basic necessary expectations
|
|
18
|
-
pub(crate) fn mock_workflow_client() -> MockWorkerClient {
|
|
19
|
-
let mut r = MockWorkerClient::new();
|
|
20
|
-
r.expect_capabilities()
|
|
21
|
-
.returning(|| Some(DEFAULT_TEST_CAPABILITIES));
|
|
22
|
-
r
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/// Create a mock manual client primed with basic necessary expectations
|
|
26
|
-
pub(crate) fn mock_manual_workflow_client() -> MockManualWorkerClient {
|
|
27
|
-
let mut r = MockManualWorkerClient::new();
|
|
28
|
-
r.expect_capabilities()
|
|
29
|
-
.returning(|| Some(DEFAULT_TEST_CAPABILITIES));
|
|
30
|
-
r
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Need a version of the mock that can return futures so we can return potentially pending
|
|
34
|
-
// results. This is really annoying b/c of the async trait stuff. Need
|
|
35
|
-
// https://github.com/asomers/mockall/issues/189 to be fixed for it to go away.
|
|
36
|
-
mockall::mock! {
|
|
37
|
-
pub(crate) ManualWorkerClient {}
|
|
38
|
-
#[allow(unused)]
|
|
39
|
-
impl WorkerClient for ManualWorkerClient {
|
|
40
|
-
fn poll_workflow_task<'a, 'b>(&'a self, task_queue: String, is_sticky: bool)
|
|
41
|
-
-> impl Future<Output = Result<PollWorkflowTaskQueueResponse>> + Send + 'b
|
|
42
|
-
where 'a: 'b, Self: 'b;
|
|
43
|
-
|
|
44
|
-
fn poll_activity_task<'a, 'b>(&self, task_queue: String, max_tasks_per_sec: Option<f64>)
|
|
45
|
-
-> impl Future<Output = Result<PollActivityTaskQueueResponse>> + Send + 'b
|
|
46
|
-
where 'a: 'b, Self: 'b;
|
|
47
|
-
|
|
48
|
-
fn complete_workflow_task<'a, 'b>(
|
|
49
|
-
&self,
|
|
50
|
-
request: WorkflowTaskCompletion,
|
|
51
|
-
) -> impl Future<Output = Result<RespondWorkflowTaskCompletedResponse>> + Send + 'b
|
|
52
|
-
where 'a: 'b, Self: 'b;
|
|
53
|
-
|
|
54
|
-
fn complete_activity_task<'a, 'b>(
|
|
55
|
-
&self,
|
|
56
|
-
task_token: TaskToken,
|
|
57
|
-
result: Option<Payloads>,
|
|
58
|
-
) -> impl Future<Output = Result<RespondActivityTaskCompletedResponse>> + Send + 'b
|
|
59
|
-
where 'a: 'b, Self: 'b;
|
|
60
|
-
|
|
61
|
-
fn cancel_activity_task<'a, 'b>(
|
|
62
|
-
&self,
|
|
63
|
-
task_token: TaskToken,
|
|
64
|
-
details: Option<Payloads>,
|
|
65
|
-
) -> impl Future<Output = Result<RespondActivityTaskCanceledResponse>> + Send + 'b
|
|
66
|
-
where 'a: 'b, Self: 'b;
|
|
67
|
-
|
|
68
|
-
fn fail_activity_task<'a, 'b>(
|
|
69
|
-
&self,
|
|
70
|
-
task_token: TaskToken,
|
|
71
|
-
failure: Option<Failure>,
|
|
72
|
-
) -> impl Future<Output = Result<RespondActivityTaskFailedResponse>> + Send + 'b
|
|
73
|
-
where 'a: 'b, Self: 'b;
|
|
74
|
-
|
|
75
|
-
fn fail_workflow_task<'a, 'b>(
|
|
76
|
-
&self,
|
|
77
|
-
task_token: TaskToken,
|
|
78
|
-
cause: WorkflowTaskFailedCause,
|
|
79
|
-
failure: Option<Failure>,
|
|
80
|
-
) -> impl Future<Output = Result<RespondWorkflowTaskFailedResponse>> + Send + 'b
|
|
81
|
-
where 'a: 'b, Self: 'b;
|
|
82
|
-
|
|
83
|
-
fn record_activity_heartbeat<'a, 'b>(
|
|
84
|
-
&self,
|
|
85
|
-
task_token: TaskToken,
|
|
86
|
-
details: Option<Payloads>,
|
|
87
|
-
) -> impl Future<Output = Result<RecordActivityTaskHeartbeatResponse>> + Send + 'b
|
|
88
|
-
where 'a: 'b, Self: 'b;
|
|
89
|
-
|
|
90
|
-
fn get_workflow_execution_history<'a, 'b>(
|
|
91
|
-
&self,
|
|
92
|
-
workflow_id: String,
|
|
93
|
-
run_id: Option<String>,
|
|
94
|
-
page_token: Vec<u8>
|
|
95
|
-
) -> impl Future<Output = Result<GetWorkflowExecutionHistoryResponse>> + Send + 'b
|
|
96
|
-
where 'a: 'b, Self: 'b;
|
|
97
|
-
|
|
98
|
-
fn respond_legacy_query<'a, 'b>(
|
|
99
|
-
&self,
|
|
100
|
-
task_token: TaskToken,
|
|
101
|
-
query_result: QueryResult,
|
|
102
|
-
) -> impl Future<Output = Result<RespondQueryTaskCompletedResponse>> + Send + 'b
|
|
103
|
-
where 'a: 'b, Self: 'b;
|
|
104
|
-
|
|
105
|
-
fn capabilities(&self) -> Option<&'static get_system_info_response::Capabilities>;
|
|
106
|
-
}
|
|
107
|
-
}
|