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,715 +0,0 @@
|
|
|
1
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
2
|
-
mod saved_wf_inputs;
|
|
3
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
4
|
-
mod tonic_status_serde;
|
|
5
|
-
|
|
6
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
7
|
-
pub use saved_wf_inputs::replay_wf_state_inputs;
|
|
8
|
-
|
|
9
|
-
use crate::{
|
|
10
|
-
abstractions::dbg_panic,
|
|
11
|
-
worker::workflow::{
|
|
12
|
-
managed_run::RunUpdateAct,
|
|
13
|
-
run_cache::RunCache,
|
|
14
|
-
wft_extraction::{HistfetchRC, HistoryFetchReq, WFTExtractorOutput},
|
|
15
|
-
*,
|
|
16
|
-
},
|
|
17
|
-
MetricsContext,
|
|
18
|
-
};
|
|
19
|
-
use futures::{stream, stream::PollNext, Stream, StreamExt};
|
|
20
|
-
use std::{collections::VecDeque, fmt::Debug, future, sync::Arc};
|
|
21
|
-
use temporal_sdk_core_api::errors::PollWfError;
|
|
22
|
-
use temporal_sdk_core_protos::coresdk::workflow_activation::remove_from_cache::EvictionReason;
|
|
23
|
-
use tokio_util::sync::CancellationToken;
|
|
24
|
-
use tracing::{Level, Span};
|
|
25
|
-
|
|
26
|
-
/// This struct holds all the state needed for tracking the state of currently cached workflow runs
|
|
27
|
-
/// and directs all actions which affect them. It is ultimately the top-level arbiter of nearly
|
|
28
|
-
/// everything important relating to workflow state.
|
|
29
|
-
///
|
|
30
|
-
/// See [WFStream::build] for more
|
|
31
|
-
pub(super) struct WFStream {
|
|
32
|
-
runs: RunCache,
|
|
33
|
-
/// Buffered polls for new runs which need a cache slot to open up before we can handle them
|
|
34
|
-
buffered_polls_need_cache_slot: VecDeque<PermittedWFT>,
|
|
35
|
-
/// Is filled with runs that we decided need to have their history fetched during state
|
|
36
|
-
/// manipulation. Must be drained after handling each input.
|
|
37
|
-
runs_needing_fetching: VecDeque<HistoryFetchReq>,
|
|
38
|
-
|
|
39
|
-
history_fetch_refcounter: Arc<HistfetchRC>,
|
|
40
|
-
shutdown_token: CancellationToken,
|
|
41
|
-
ignore_evicts_on_shutdown: bool,
|
|
42
|
-
|
|
43
|
-
metrics: MetricsContext,
|
|
44
|
-
|
|
45
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
46
|
-
wf_state_inputs: Option<UnboundedSender<Vec<u8>>>,
|
|
47
|
-
}
|
|
48
|
-
impl WFStream {
|
|
49
|
-
/// Constructs workflow state management and returns a stream which outputs activations.
|
|
50
|
-
///
|
|
51
|
-
/// * `wft_stream` is a stream of validated poll responses and fetched history pages as returned
|
|
52
|
-
/// by a poller (or mock), via [WFTExtractor].
|
|
53
|
-
/// * `local_rx` is a stream of actions that workflow state needs to see. Things like
|
|
54
|
-
/// completions, local activities finishing, etc. See [LocalInputs].
|
|
55
|
-
/// * `local_activity_request_sink` is used to handle outgoing requests to start or cancel
|
|
56
|
-
/// local activities, and may return resolutions that need to be handled immediately.
|
|
57
|
-
///
|
|
58
|
-
/// The stream inputs are combined into a stream of [WFActStreamInput]s. The stream processor
|
|
59
|
-
/// then takes action on those inputs, mutating the [WFStream] state, and then may yield
|
|
60
|
-
/// activations.
|
|
61
|
-
///
|
|
62
|
-
/// Importantly, nothing async happens while actually mutating state. This means all changes to
|
|
63
|
-
/// all workflow state can be represented purely via the stream of inputs, plus the
|
|
64
|
-
/// calls/retvals from the LA request sink, which is the last unfortunate bit of impurity in
|
|
65
|
-
/// the design. Eliminating it would be nice, so that all inputs come from the passed-in streams
|
|
66
|
-
/// and all outputs flow from the return stream, but it's difficult to do so since it would
|
|
67
|
-
/// require "pausing" in-progress changes to a run while sending & waiting for response from
|
|
68
|
-
/// local activity management. Likely the best option would be to move the pure state info
|
|
69
|
-
/// needed to determine immediate responses into LA state machines themselves (out of the LA
|
|
70
|
-
/// manager), which is a quite substantial change.
|
|
71
|
-
pub(super) fn build(
|
|
72
|
-
basics: WorkflowBasics,
|
|
73
|
-
wft_stream: impl Stream<Item = Result<WFTExtractorOutput, tonic::Status>> + Send + 'static,
|
|
74
|
-
local_rx: impl Stream<Item = LocalInput> + Send + 'static,
|
|
75
|
-
local_activity_request_sink: impl LocalActivityRequestSink,
|
|
76
|
-
) -> impl Stream<Item = Result<WFStreamOutput, PollWfError>> {
|
|
77
|
-
let all_inputs = stream::select_with_strategy(
|
|
78
|
-
local_rx.map(Into::into),
|
|
79
|
-
wft_stream
|
|
80
|
-
.map(Into::into)
|
|
81
|
-
.chain(stream::once(async { ExternalPollerInputs::PollerDead }))
|
|
82
|
-
.map(Into::into)
|
|
83
|
-
.boxed(),
|
|
84
|
-
// Priority always goes to the local stream
|
|
85
|
-
|_: &mut ()| PollNext::Left,
|
|
86
|
-
);
|
|
87
|
-
Self::build_internal(all_inputs, basics, local_activity_request_sink)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
fn build_internal(
|
|
91
|
-
all_inputs: impl Stream<Item = WFStreamInput>,
|
|
92
|
-
basics: WorkflowBasics,
|
|
93
|
-
local_activity_request_sink: impl LocalActivityRequestSink,
|
|
94
|
-
) -> impl Stream<Item = Result<WFStreamOutput, PollWfError>> {
|
|
95
|
-
let mut state = WFStream {
|
|
96
|
-
buffered_polls_need_cache_slot: Default::default(),
|
|
97
|
-
runs: RunCache::new(
|
|
98
|
-
basics.max_cached_workflows,
|
|
99
|
-
basics.namespace.clone(),
|
|
100
|
-
basics.server_capabilities.clone(),
|
|
101
|
-
local_activity_request_sink,
|
|
102
|
-
basics.metrics.clone(),
|
|
103
|
-
),
|
|
104
|
-
shutdown_token: basics.shutdown_token,
|
|
105
|
-
ignore_evicts_on_shutdown: basics.ignore_evicts_on_shutdown,
|
|
106
|
-
metrics: basics.metrics,
|
|
107
|
-
runs_needing_fetching: Default::default(),
|
|
108
|
-
history_fetch_refcounter: Arc::new(HistfetchRC {}),
|
|
109
|
-
|
|
110
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
111
|
-
wf_state_inputs: basics.wf_state_inputs,
|
|
112
|
-
};
|
|
113
|
-
all_inputs
|
|
114
|
-
.map(move |action: WFStreamInput| {
|
|
115
|
-
let span = span!(Level::DEBUG, "new_stream_input", action=?action);
|
|
116
|
-
let _span_g = span.enter();
|
|
117
|
-
|
|
118
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
119
|
-
let maybe_write = state.prep_input(&action);
|
|
120
|
-
|
|
121
|
-
let mut activations = vec![];
|
|
122
|
-
let maybe_act = match action {
|
|
123
|
-
WFStreamInput::NewWft(pwft) => {
|
|
124
|
-
debug!(run_id=%pwft.work.execution.run_id, "New WFT");
|
|
125
|
-
state.instantiate_or_update(pwft)
|
|
126
|
-
}
|
|
127
|
-
WFStreamInput::Local(local_input) => {
|
|
128
|
-
let _span_g = local_input.span.enter();
|
|
129
|
-
if let Some(rid) = local_input.input.run_id() {
|
|
130
|
-
if let Some(rh) = state.runs.get_mut(rid) {
|
|
131
|
-
rh.record_span_fields(&local_input.span);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
match local_input.input {
|
|
135
|
-
LocalInputs::Completion(completion) => {
|
|
136
|
-
activations.extend(
|
|
137
|
-
state.process_completion(NewOrFetchedComplete::New(completion)),
|
|
138
|
-
);
|
|
139
|
-
None // completions can return more than one activation
|
|
140
|
-
}
|
|
141
|
-
LocalInputs::FetchedPageCompletion { paginator, update } => {
|
|
142
|
-
activations.extend(state.process_completion(
|
|
143
|
-
NewOrFetchedComplete::Fetched(update, paginator),
|
|
144
|
-
));
|
|
145
|
-
None // completions can return more than one activation
|
|
146
|
-
}
|
|
147
|
-
LocalInputs::PostActivation(report) => {
|
|
148
|
-
state.process_post_activation(report)
|
|
149
|
-
}
|
|
150
|
-
LocalInputs::LocalResolution(res) => state.local_resolution(res),
|
|
151
|
-
LocalInputs::HeartbeatTimeout(hbt) => {
|
|
152
|
-
state.process_heartbeat_timeout(hbt)
|
|
153
|
-
}
|
|
154
|
-
LocalInputs::RequestEviction(evict) => {
|
|
155
|
-
state.request_eviction(evict).into_run_update_resp()
|
|
156
|
-
}
|
|
157
|
-
LocalInputs::GetStateInfo(gsi) => {
|
|
158
|
-
let _ = gsi.response_tx.send(WorkflowStateInfo {
|
|
159
|
-
cached_workflows: state.runs.len(),
|
|
160
|
-
outstanding_wft: state.outstanding_wfts(),
|
|
161
|
-
});
|
|
162
|
-
None
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
WFStreamInput::FailedFetch { run_id, err } => state
|
|
167
|
-
.request_eviction(RequestEvictMsg {
|
|
168
|
-
run_id,
|
|
169
|
-
message: format!("Fetching history failed: {err:?}"),
|
|
170
|
-
reason: EvictionReason::PaginationOrHistoryFetch,
|
|
171
|
-
})
|
|
172
|
-
.into_run_update_resp(),
|
|
173
|
-
WFStreamInput::PollerDead => {
|
|
174
|
-
debug!("WFT poller died, beginning shutdown");
|
|
175
|
-
state.shutdown_token.cancel();
|
|
176
|
-
None
|
|
177
|
-
}
|
|
178
|
-
WFStreamInput::PollerError(e) => {
|
|
179
|
-
warn!("WFT poller errored, shutting down");
|
|
180
|
-
return Err(PollWfError::TonicError(e));
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
activations.extend(maybe_act.into_iter());
|
|
185
|
-
activations.extend(state.reconcile_buffered());
|
|
186
|
-
|
|
187
|
-
// Always flush *after* actually handling the input, as this allows LA sink
|
|
188
|
-
// responses to be recorded before the input, so they can be read and buffered to be
|
|
189
|
-
// replayed during the handling of the input itself.
|
|
190
|
-
#[cfg(feature = "save_wf_inputs")]
|
|
191
|
-
if let Some(write) = maybe_write {
|
|
192
|
-
state.flush_write(write);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
if state.shutdown_done() {
|
|
196
|
-
info!("Workflow shutdown is done");
|
|
197
|
-
return Err(PollWfError::ShutDown);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
Ok(WFStreamOutput {
|
|
201
|
-
activations: activations.into(),
|
|
202
|
-
fetch_histories: std::mem::take(&mut state.runs_needing_fetching),
|
|
203
|
-
})
|
|
204
|
-
})
|
|
205
|
-
.inspect(|o| {
|
|
206
|
-
if let Some(e) = o.as_ref().err() {
|
|
207
|
-
if !matches!(e, PollWfError::ShutDown) {
|
|
208
|
-
error!(
|
|
209
|
-
"Workflow processing encountered fatal error and must shut down {:?}",
|
|
210
|
-
e
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
})
|
|
215
|
-
// Stop the stream once we have shut down
|
|
216
|
-
.take_while(|o| future::ready(!matches!(o, Err(PollWfError::ShutDown))))
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/// Instantiate or update run machines with a new WFT
|
|
220
|
-
#[instrument(skip(self, pwft)
|
|
221
|
-
fields(run_id=%pwft.work.execution.run_id,
|
|
222
|
-
workflow_id=%pwft.work.execution.workflow_id))]
|
|
223
|
-
fn instantiate_or_update(&mut self, pwft: PermittedWFT) -> RunUpdateAct {
|
|
224
|
-
match self._instantiate_or_update(pwft) {
|
|
225
|
-
Err(histfetch) => {
|
|
226
|
-
self.runs_needing_fetching.push_back(histfetch);
|
|
227
|
-
Default::default()
|
|
228
|
-
}
|
|
229
|
-
Ok(r) => r,
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
fn _instantiate_or_update(
|
|
234
|
-
&mut self,
|
|
235
|
-
pwft: PermittedWFT,
|
|
236
|
-
) -> Result<RunUpdateAct, HistoryFetchReq> {
|
|
237
|
-
// If the run already exists, possibly buffer the work and return early if we can't handle
|
|
238
|
-
// it yet.
|
|
239
|
-
let pwft = if let Some(rh) = self.runs.get_mut(&pwft.work.execution.run_id) {
|
|
240
|
-
if let Some(w) = rh.buffer_wft_if_outstanding_work(pwft) {
|
|
241
|
-
w
|
|
242
|
-
} else {
|
|
243
|
-
return Ok(None);
|
|
244
|
-
}
|
|
245
|
-
} else {
|
|
246
|
-
pwft
|
|
247
|
-
};
|
|
248
|
-
|
|
249
|
-
let run_id = pwft.work.execution.run_id.clone();
|
|
250
|
-
// If our cache is full and this WFT is for an unseen run we must first evict a run before
|
|
251
|
-
// we can deal with this task. So, buffer the task in that case.
|
|
252
|
-
if !self.runs.has_run(&run_id) && self.runs.is_full() {
|
|
253
|
-
self.buffer_resp_on_full_cache(pwft);
|
|
254
|
-
return Ok(None);
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
// This check can't really be lifted up higher since we could EX: See it's in the cache,
|
|
258
|
-
// not fetch more history, send the task, see cache is full, buffer it, then evict that
|
|
259
|
-
// run, and now we still have a cache miss.
|
|
260
|
-
if !self.runs.has_run(&run_id) && pwft.work.is_incremental() {
|
|
261
|
-
debug!(run_id=?run_id, "Workflow task has partial history, but workflow is not in \
|
|
262
|
-
cache. Will fetch history");
|
|
263
|
-
self.metrics.sticky_cache_miss();
|
|
264
|
-
return Err(HistoryFetchReq::Full(
|
|
265
|
-
CacheMissFetchReq { original_wft: pwft },
|
|
266
|
-
self.history_fetch_refcounter.clone(),
|
|
267
|
-
));
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
let rur = self.runs.instantiate_or_update(pwft);
|
|
271
|
-
Ok(rur)
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
fn process_completion(&mut self, complete: NewOrFetchedComplete) -> Vec<ActivationOrAuto> {
|
|
275
|
-
let rh = if let Some(rh) = self.runs.get_mut(complete.run_id()) {
|
|
276
|
-
rh
|
|
277
|
-
} else {
|
|
278
|
-
dbg_panic!("Run missing during completion {:?}", complete);
|
|
279
|
-
return vec![];
|
|
280
|
-
};
|
|
281
|
-
let mut acts: Vec<_> = match complete {
|
|
282
|
-
NewOrFetchedComplete::New(complete) => match complete.completion {
|
|
283
|
-
ValidatedCompletion::Success {
|
|
284
|
-
commands,
|
|
285
|
-
used_flags,
|
|
286
|
-
..
|
|
287
|
-
} => match rh.successful_completion(commands, used_flags, complete.response_tx) {
|
|
288
|
-
Ok(acts) => acts,
|
|
289
|
-
Err(npr) => {
|
|
290
|
-
self.runs_needing_fetching
|
|
291
|
-
.push_back(HistoryFetchReq::NextPage(
|
|
292
|
-
npr,
|
|
293
|
-
self.history_fetch_refcounter.clone(),
|
|
294
|
-
));
|
|
295
|
-
None
|
|
296
|
-
}
|
|
297
|
-
},
|
|
298
|
-
ValidatedCompletion::Fail { failure, .. } => rh.failed_completion(
|
|
299
|
-
failure.force_cause(),
|
|
300
|
-
EvictionReason::LangFail,
|
|
301
|
-
failure,
|
|
302
|
-
complete.response_tx,
|
|
303
|
-
),
|
|
304
|
-
},
|
|
305
|
-
NewOrFetchedComplete::Fetched(update, paginator) => {
|
|
306
|
-
rh.fetched_page_completion(update, paginator)
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
.into_iter()
|
|
310
|
-
.collect();
|
|
311
|
-
// Always queue evictions after completion when we have a zero-size cache
|
|
312
|
-
if self.runs.cache_capacity() == 0 {
|
|
313
|
-
acts.extend(self.request_eviction_of_lru_run().into_run_update_resp())
|
|
314
|
-
}
|
|
315
|
-
acts
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
fn process_post_activation(&mut self, report: PostActivationMsg) -> RunUpdateAct {
|
|
319
|
-
let run_id = &report.run_id;
|
|
320
|
-
let wft_from_complete = report.wft_from_complete;
|
|
321
|
-
if let Some((wft, _)) = &wft_from_complete {
|
|
322
|
-
if &wft.execution.run_id != run_id {
|
|
323
|
-
dbg_panic!(
|
|
324
|
-
"Server returned a WFT on completion for a different run ({}) than the \
|
|
325
|
-
one being completed ({}). This is a server bug.",
|
|
326
|
-
wft.execution.run_id,
|
|
327
|
-
run_id
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
let mut res = None;
|
|
333
|
-
|
|
334
|
-
// If we reported to server, we always want to mark it complete.
|
|
335
|
-
let maybe_t = self.complete_wft(run_id, report.wft_report_status);
|
|
336
|
-
// Delete the activation
|
|
337
|
-
let activation = self
|
|
338
|
-
.runs
|
|
339
|
-
.get_mut(run_id)
|
|
340
|
-
.and_then(|rh| rh.delete_activation());
|
|
341
|
-
|
|
342
|
-
// Evict the run if the activation contained an eviction
|
|
343
|
-
let mut applied_buffered_poll_for_this_run = false;
|
|
344
|
-
if activation.map(|a| a.has_eviction()).unwrap_or_default() {
|
|
345
|
-
debug!(run_id=%run_id, "Evicting run");
|
|
346
|
-
|
|
347
|
-
if let Some(mut rh) = self.runs.remove(run_id) {
|
|
348
|
-
if let Some(buff) = rh.take_buffered_wft() {
|
|
349
|
-
// Don't try to apply a buffered poll for this run if we just got a new WFT
|
|
350
|
-
// from completing, because by definition that buffered poll is now an
|
|
351
|
-
// out-of-date WFT.
|
|
352
|
-
if wft_from_complete.is_none() {
|
|
353
|
-
res = self.instantiate_or_update(buff);
|
|
354
|
-
applied_buffered_poll_for_this_run = true;
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// Attempt to apply a buffered poll for some *other* run, if we didn't have a wft
|
|
360
|
-
// from complete or a buffered poll for *this* run.
|
|
361
|
-
if wft_from_complete.is_none() && !applied_buffered_poll_for_this_run {
|
|
362
|
-
if let Some(buff) = self.buffered_polls_need_cache_slot.pop_front() {
|
|
363
|
-
res = self.instantiate_or_update(buff);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
};
|
|
367
|
-
|
|
368
|
-
if let Some((wft, pag)) = wft_from_complete {
|
|
369
|
-
debug!(run_id=%wft.execution.run_id, "New WFT from completion");
|
|
370
|
-
if let Some(t) = maybe_t {
|
|
371
|
-
res = self.instantiate_or_update(PermittedWFT {
|
|
372
|
-
work: wft,
|
|
373
|
-
permit: t.permit,
|
|
374
|
-
paginator: pag,
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
if res.is_none() {
|
|
380
|
-
if let Some(rh) = self.runs.get_mut(run_id) {
|
|
381
|
-
// Attempt to produce the next activation if needed
|
|
382
|
-
res = rh.check_more_activations();
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
res
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
fn local_resolution(&mut self, msg: LocalResolutionMsg) -> RunUpdateAct {
|
|
389
|
-
let run_id = msg.run_id;
|
|
390
|
-
if let Some(rh) = self.runs.get_mut(&run_id) {
|
|
391
|
-
rh.local_resolution(msg.res)
|
|
392
|
-
} else {
|
|
393
|
-
// It isn't an explicit error if the machine is missing when a local activity resolves.
|
|
394
|
-
// This can happen if an activity reports a timeout after we stopped caring about it.
|
|
395
|
-
debug!(run_id = %run_id,
|
|
396
|
-
"Tried to resolve a local activity for a run we are no longer tracking");
|
|
397
|
-
None
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
fn process_heartbeat_timeout(&mut self, run_id: String) -> RunUpdateAct {
|
|
402
|
-
if let Some(rh) = self.runs.get_mut(&run_id) {
|
|
403
|
-
rh.heartbeat_timeout()
|
|
404
|
-
} else {
|
|
405
|
-
None
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
/// Request a workflow eviction. This will (eventually, after replay is done) queue up an
|
|
410
|
-
/// activation to evict the workflow from the lang side. Workflow will not *actually* be evicted
|
|
411
|
-
/// until lang replies to that activation
|
|
412
|
-
fn request_eviction(&mut self, info: RequestEvictMsg) -> EvictionRequestResult {
|
|
413
|
-
if let Some(rh) = self.runs.get_mut(&info.run_id) {
|
|
414
|
-
rh.request_eviction(info)
|
|
415
|
-
} else {
|
|
416
|
-
debug!(run_id=%info.run_id, "Eviction requested for unknown run");
|
|
417
|
-
EvictionRequestResult::NotFound
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
fn request_eviction_of_lru_run(&mut self) -> EvictionRequestResult {
|
|
422
|
-
if let Some(lru_run_id) = self.runs.current_lru_run() {
|
|
423
|
-
let run_id = lru_run_id.to_string();
|
|
424
|
-
self.request_eviction(RequestEvictMsg {
|
|
425
|
-
run_id,
|
|
426
|
-
message: "Workflow cache full".to_string(),
|
|
427
|
-
reason: EvictionReason::CacheFull,
|
|
428
|
-
})
|
|
429
|
-
} else {
|
|
430
|
-
// This branch shouldn't really be possible
|
|
431
|
-
EvictionRequestResult::NotFound
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
fn complete_wft(
|
|
436
|
-
&mut self,
|
|
437
|
-
run_id: &str,
|
|
438
|
-
wft_report_status: WFTReportStatus,
|
|
439
|
-
) -> Option<OutstandingTask> {
|
|
440
|
-
// If the WFT completion wasn't sent to the server, but we did see the final event, we still
|
|
441
|
-
// want to clear the workflow task. This can really only happen in replay testing, where we
|
|
442
|
-
// will generate poll responses with complete history but no attached query, and such a WFT
|
|
443
|
-
// would never really exist. The server wouldn't send a workflow task with nothing to do,
|
|
444
|
-
// but they are very useful for testing complete replay.
|
|
445
|
-
let saw_final = self
|
|
446
|
-
.runs
|
|
447
|
-
.get(run_id)
|
|
448
|
-
.map(|r| r.have_seen_terminal_event())
|
|
449
|
-
.unwrap_or_default();
|
|
450
|
-
if !saw_final && matches!(wft_report_status, WFTReportStatus::NotReported) {
|
|
451
|
-
return None;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
if let Some(rh) = self.runs.get_mut(run_id) {
|
|
455
|
-
// Can't mark the WFT complete if there are pending queries, as doing so would destroy
|
|
456
|
-
// them.
|
|
457
|
-
if rh
|
|
458
|
-
.wft()
|
|
459
|
-
.map(|wft| !wft.pending_queries.is_empty())
|
|
460
|
-
.unwrap_or_default()
|
|
461
|
-
{
|
|
462
|
-
return None;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
rh.mark_wft_complete(wft_report_status)
|
|
466
|
-
} else {
|
|
467
|
-
None
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
fn buffer_resp_on_full_cache(&mut self, work: PermittedWFT) {
|
|
472
|
-
debug!(run_id=%work.work.execution.run_id, "Buffering WFT because cache is full");
|
|
473
|
-
// If there's already a buffered poll for the run, replace it.
|
|
474
|
-
if let Some(rh) = self
|
|
475
|
-
.buffered_polls_need_cache_slot
|
|
476
|
-
.iter_mut()
|
|
477
|
-
.find(|w| w.work.execution.run_id == work.work.execution.run_id)
|
|
478
|
-
{
|
|
479
|
-
*rh = work;
|
|
480
|
-
} else {
|
|
481
|
-
// Otherwise push it to the back
|
|
482
|
-
self.buffered_polls_need_cache_slot.push_back(work);
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
/// Makes sure we have enough pending evictions to fulfill the needs of buffered WFTs who are
|
|
487
|
-
/// waiting on a cache slot
|
|
488
|
-
fn reconcile_buffered(&mut self) -> Vec<ActivationOrAuto> {
|
|
489
|
-
// We must ensure that there are at least as many pending evictions as there are tasks
|
|
490
|
-
// that we might need to un-buffer (skipping runs which already have buffered tasks for
|
|
491
|
-
// themselves)
|
|
492
|
-
let num_in_buff = self.buffered_polls_need_cache_slot.len();
|
|
493
|
-
let mut evict_these = vec![];
|
|
494
|
-
let num_existing_evictions = self
|
|
495
|
-
.runs
|
|
496
|
-
.runs_lru_order()
|
|
497
|
-
.filter(|(_, h)| h.is_trying_to_evict())
|
|
498
|
-
.count();
|
|
499
|
-
let mut num_evicts_needed = num_in_buff.saturating_sub(num_existing_evictions);
|
|
500
|
-
for (rid, handle) in self.runs.runs_lru_order() {
|
|
501
|
-
if num_evicts_needed == 0 {
|
|
502
|
-
break;
|
|
503
|
-
}
|
|
504
|
-
if !handle.has_buffered_wft() {
|
|
505
|
-
num_evicts_needed -= 1;
|
|
506
|
-
evict_these.push(rid.to_string());
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
let mut acts = vec![];
|
|
510
|
-
for run_id in evict_these {
|
|
511
|
-
acts.extend(
|
|
512
|
-
self.request_eviction(RequestEvictMsg {
|
|
513
|
-
run_id,
|
|
514
|
-
message: "Workflow cache full".to_string(),
|
|
515
|
-
reason: EvictionReason::CacheFull,
|
|
516
|
-
})
|
|
517
|
-
.into_run_update_resp(),
|
|
518
|
-
);
|
|
519
|
-
}
|
|
520
|
-
acts
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
fn shutdown_done(&self) -> bool {
|
|
524
|
-
if self.shutdown_token.is_cancelled() {
|
|
525
|
-
if Arc::strong_count(&self.history_fetch_refcounter) > 1 {
|
|
526
|
-
// Don't exit if there are outstanding fetch requests
|
|
527
|
-
return false;
|
|
528
|
-
}
|
|
529
|
-
let all_runs_ready = self
|
|
530
|
-
.runs
|
|
531
|
-
.handles()
|
|
532
|
-
.all(|r| !r.has_any_pending_work(self.ignore_evicts_on_shutdown, false));
|
|
533
|
-
if all_runs_ready {
|
|
534
|
-
return true;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
false
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
fn outstanding_wfts(&self) -> usize {
|
|
541
|
-
self.runs.handles().filter(|r| r.wft().is_some()).count()
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
// Useful when debugging
|
|
545
|
-
#[allow(dead_code)]
|
|
546
|
-
fn info_dump(&self, run_id: &str) {
|
|
547
|
-
if let Some(r) = self.runs.peek(run_id) {
|
|
548
|
-
info!(run_id, wft=?r.wft(), activation=?r.activation(),
|
|
549
|
-
buffered_wft=r.has_buffered_wft(),
|
|
550
|
-
trying_to_evict=r.is_trying_to_evict(), more_work=r.more_pending_work());
|
|
551
|
-
} else {
|
|
552
|
-
info!(run_id, "Run not found");
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
/// All possible inputs to the [WFStream]
|
|
558
|
-
#[derive(derive_more::From, Debug)]
|
|
559
|
-
#[cfg_attr(
|
|
560
|
-
feature = "save_wf_inputs",
|
|
561
|
-
derive(serde::Serialize, serde::Deserialize)
|
|
562
|
-
)]
|
|
563
|
-
enum WFStreamInput {
|
|
564
|
-
NewWft(PermittedWFT),
|
|
565
|
-
Local(LocalInput),
|
|
566
|
-
/// The stream given to us which represents the poller (or a mock) terminated.
|
|
567
|
-
PollerDead,
|
|
568
|
-
/// The stream given to us which represents the poller (or a mock) encountered a non-retryable
|
|
569
|
-
/// error while polling
|
|
570
|
-
PollerError(
|
|
571
|
-
#[cfg_attr(
|
|
572
|
-
feature = "save_wf_inputs",
|
|
573
|
-
serde(with = "tonic_status_serde::SerdeStatus")
|
|
574
|
-
)]
|
|
575
|
-
tonic::Status,
|
|
576
|
-
),
|
|
577
|
-
FailedFetch {
|
|
578
|
-
run_id: String,
|
|
579
|
-
#[cfg_attr(
|
|
580
|
-
feature = "save_wf_inputs",
|
|
581
|
-
serde(with = "tonic_status_serde::SerdeStatus")
|
|
582
|
-
)]
|
|
583
|
-
err: tonic::Status,
|
|
584
|
-
},
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
/// A non-poller-received input to the [WFStream]
|
|
588
|
-
#[derive(derive_more::DebugCustom)]
|
|
589
|
-
#[cfg_attr(
|
|
590
|
-
feature = "save_wf_inputs",
|
|
591
|
-
derive(serde::Serialize, serde::Deserialize)
|
|
592
|
-
)]
|
|
593
|
-
#[debug(fmt = "LocalInput {{ {input:?} }}")]
|
|
594
|
-
pub(super) struct LocalInput {
|
|
595
|
-
pub input: LocalInputs,
|
|
596
|
-
#[cfg_attr(feature = "save_wf_inputs", serde(skip, default = "Span::current"))]
|
|
597
|
-
pub span: Span,
|
|
598
|
-
}
|
|
599
|
-
impl From<HeartbeatTimeoutMsg> for LocalInput {
|
|
600
|
-
fn from(hb: HeartbeatTimeoutMsg) -> Self {
|
|
601
|
-
Self {
|
|
602
|
-
input: LocalInputs::HeartbeatTimeout(hb.run_id),
|
|
603
|
-
span: hb.span,
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
/// Everything that _isn't_ a poll which may affect workflow state. Always higher priority than
|
|
608
|
-
/// new polls.
|
|
609
|
-
#[derive(Debug, derive_more::From)]
|
|
610
|
-
#[cfg_attr(
|
|
611
|
-
feature = "save_wf_inputs",
|
|
612
|
-
derive(serde::Serialize, serde::Deserialize)
|
|
613
|
-
)]
|
|
614
|
-
pub(super) enum LocalInputs {
|
|
615
|
-
Completion(WFActCompleteMsg),
|
|
616
|
-
FetchedPageCompletion {
|
|
617
|
-
paginator: HistoryPaginator,
|
|
618
|
-
update: HistoryUpdate,
|
|
619
|
-
},
|
|
620
|
-
LocalResolution(LocalResolutionMsg),
|
|
621
|
-
PostActivation(PostActivationMsg),
|
|
622
|
-
RequestEviction(RequestEvictMsg),
|
|
623
|
-
HeartbeatTimeout(String),
|
|
624
|
-
#[cfg_attr(feature = "save_wf_inputs", serde(skip))]
|
|
625
|
-
GetStateInfo(GetStateInfoMsg),
|
|
626
|
-
}
|
|
627
|
-
impl LocalInputs {
|
|
628
|
-
fn run_id(&self) -> Option<&str> {
|
|
629
|
-
Some(match self {
|
|
630
|
-
LocalInputs::Completion(c) => c.completion.run_id(),
|
|
631
|
-
LocalInputs::FetchedPageCompletion { paginator, .. } => &paginator.run_id,
|
|
632
|
-
LocalInputs::LocalResolution(lr) => &lr.run_id,
|
|
633
|
-
LocalInputs::PostActivation(pa) => &pa.run_id,
|
|
634
|
-
LocalInputs::RequestEviction(re) => &re.run_id,
|
|
635
|
-
LocalInputs::HeartbeatTimeout(hb) => hb,
|
|
636
|
-
LocalInputs::GetStateInfo(_) => return None,
|
|
637
|
-
})
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
#[derive(Debug)]
|
|
641
|
-
#[allow(clippy::large_enum_variant)] // PollerDead only ever gets used once, so not important.
|
|
642
|
-
enum ExternalPollerInputs {
|
|
643
|
-
NewWft(PermittedWFT),
|
|
644
|
-
PollerDead,
|
|
645
|
-
PollerError(tonic::Status),
|
|
646
|
-
FetchedUpdate(PermittedWFT),
|
|
647
|
-
NextPage {
|
|
648
|
-
paginator: HistoryPaginator,
|
|
649
|
-
update: HistoryUpdate,
|
|
650
|
-
span: Span,
|
|
651
|
-
},
|
|
652
|
-
FailedFetch {
|
|
653
|
-
run_id: String,
|
|
654
|
-
err: tonic::Status,
|
|
655
|
-
},
|
|
656
|
-
}
|
|
657
|
-
impl From<ExternalPollerInputs> for WFStreamInput {
|
|
658
|
-
fn from(l: ExternalPollerInputs) -> Self {
|
|
659
|
-
match l {
|
|
660
|
-
ExternalPollerInputs::NewWft(v) => WFStreamInput::NewWft(v),
|
|
661
|
-
ExternalPollerInputs::PollerDead => WFStreamInput::PollerDead,
|
|
662
|
-
ExternalPollerInputs::PollerError(e) => WFStreamInput::PollerError(e),
|
|
663
|
-
ExternalPollerInputs::FetchedUpdate(wft) => WFStreamInput::NewWft(wft),
|
|
664
|
-
ExternalPollerInputs::FailedFetch { run_id, err } => {
|
|
665
|
-
WFStreamInput::FailedFetch { run_id, err }
|
|
666
|
-
}
|
|
667
|
-
ExternalPollerInputs::NextPage {
|
|
668
|
-
paginator,
|
|
669
|
-
update,
|
|
670
|
-
span,
|
|
671
|
-
} => WFStreamInput::Local(LocalInput {
|
|
672
|
-
input: LocalInputs::FetchedPageCompletion { paginator, update },
|
|
673
|
-
span,
|
|
674
|
-
}),
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
impl From<Result<WFTExtractorOutput, tonic::Status>> for ExternalPollerInputs {
|
|
679
|
-
fn from(v: Result<WFTExtractorOutput, tonic::Status>) -> Self {
|
|
680
|
-
match v {
|
|
681
|
-
Ok(WFTExtractorOutput::NewWFT(pwft)) => ExternalPollerInputs::NewWft(pwft),
|
|
682
|
-
Ok(WFTExtractorOutput::FetchResult(updated_wft, _)) => {
|
|
683
|
-
ExternalPollerInputs::FetchedUpdate(updated_wft)
|
|
684
|
-
}
|
|
685
|
-
Ok(WFTExtractorOutput::NextPage {
|
|
686
|
-
paginator,
|
|
687
|
-
update,
|
|
688
|
-
span,
|
|
689
|
-
rc: _rc,
|
|
690
|
-
}) => ExternalPollerInputs::NextPage {
|
|
691
|
-
paginator,
|
|
692
|
-
update,
|
|
693
|
-
span,
|
|
694
|
-
},
|
|
695
|
-
Ok(WFTExtractorOutput::FailedFetch { run_id, err }) => {
|
|
696
|
-
ExternalPollerInputs::FailedFetch { run_id, err }
|
|
697
|
-
}
|
|
698
|
-
Ok(WFTExtractorOutput::PollerDead) => ExternalPollerInputs::PollerDead,
|
|
699
|
-
Err(e) => ExternalPollerInputs::PollerError(e),
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
#[derive(Debug)]
|
|
704
|
-
enum NewOrFetchedComplete {
|
|
705
|
-
New(WFActCompleteMsg),
|
|
706
|
-
Fetched(HistoryUpdate, HistoryPaginator),
|
|
707
|
-
}
|
|
708
|
-
impl NewOrFetchedComplete {
|
|
709
|
-
fn run_id(&self) -> &str {
|
|
710
|
-
match self {
|
|
711
|
-
NewOrFetchedComplete::New(c) => c.completion.run_id(),
|
|
712
|
-
NewOrFetchedComplete::Fetched(_, p) => &p.run_id,
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|