temporalio 0.0.1 → 0.1.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/README.md +180 -7
- data/bridge/Cargo.lock +208 -76
- data/bridge/Cargo.toml +5 -2
- data/bridge/sdk-core/Cargo.toml +1 -1
- data/bridge/sdk-core/README.md +20 -10
- data/bridge/sdk-core/client/Cargo.toml +1 -1
- data/bridge/sdk-core/client/src/lib.rs +227 -59
- data/bridge/sdk-core/client/src/metrics.rs +17 -8
- data/bridge/sdk-core/client/src/raw.rs +13 -12
- data/bridge/sdk-core/client/src/retry.rs +132 -43
- data/bridge/sdk-core/core/Cargo.toml +28 -15
- data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
- data/bridge/sdk-core/core/src/abstractions.rs +225 -36
- data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +217 -79
- data/bridge/sdk-core/core/src/core_tests/determinism.rs +165 -2
- data/bridge/sdk-core/core/src/core_tests/local_activities.rs +565 -34
- data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -90
- data/bridge/sdk-core/core/src/core_tests/workers.rs +3 -5
- data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
- data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +430 -67
- data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +106 -12
- data/bridge/sdk-core/core/src/internal_flags.rs +136 -0
- data/bridge/sdk-core/core/src/lib.rs +148 -34
- data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
- data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
- data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
- data/bridge/sdk-core/core/src/telemetry/metrics.rs +219 -140
- data/bridge/sdk-core/core/src/telemetry/mod.rs +326 -315
- data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +20 -14
- data/bridge/sdk-core/core/src/test_help/mod.rs +85 -21
- data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +112 -156
- data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +89 -0
- data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +364 -128
- data/bridge/sdk-core/core/src/worker/activities.rs +263 -170
- data/bridge/sdk-core/core/src/worker/client/mocks.rs +23 -3
- data/bridge/sdk-core/core/src/worker/client.rs +48 -6
- data/bridge/sdk-core/core/src/worker/mod.rs +186 -75
- data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +1 -3
- data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +13 -24
- data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +879 -226
- data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +101 -48
- data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +8 -12
- data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +6 -9
- data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +90 -32
- data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +6 -9
- data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +7 -10
- data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +6 -9
- data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +160 -83
- data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +36 -54
- data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +179 -0
- data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +104 -157
- data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +8 -12
- data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +9 -13
- data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +10 -4
- data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +14 -11
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +6 -17
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +395 -299
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +12 -20
- data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +33 -18
- data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +1032 -374
- data/bridge/sdk-core/core/src/worker/workflow/mod.rs +525 -392
- data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +40 -57
- data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +125 -0
- data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +3 -6
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +117 -0
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +24 -0
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +456 -681
- data/bridge/sdk-core/core-api/Cargo.toml +6 -4
- data/bridge/sdk-core/core-api/src/errors.rs +1 -34
- data/bridge/sdk-core/core-api/src/lib.rs +7 -45
- data/bridge/sdk-core/core-api/src/telemetry.rs +141 -0
- data/bridge/sdk-core/core-api/src/worker.rs +27 -1
- data/bridge/sdk-core/etc/deps.svg +115 -140
- data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
- data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +18 -15
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
- data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +8 -3
- 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/protos/api_upstream/buf.yaml +0 -3
- data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
- data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
- data/bridge/sdk-core/protos/api_upstream/{temporal/api/enums/v1/cluster.proto → build/tools.go} +7 -18
- data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
- data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
- data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +15 -26
- data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +13 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -9
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +10 -8
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +28 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +24 -19
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +62 -26
- data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +4 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +24 -61
- data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
- data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +57 -0
- data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
- data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +63 -0
- data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
- data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +71 -6
- data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +111 -36
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +19 -5
- data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +1 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +1 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +1 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +1 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +1 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +1 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +9 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +9 -1
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +6 -0
- data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
- data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
- data/bridge/sdk-core/sdk/Cargo.toml +4 -3
- data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
- data/bridge/sdk-core/sdk/src/lib.rs +94 -25
- data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
- data/bridge/sdk-core/sdk/src/workflow_future.rs +10 -13
- data/bridge/sdk-core/sdk-core-protos/Cargo.toml +5 -2
- data/bridge/sdk-core/sdk-core-protos/build.rs +36 -2
- data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +164 -104
- data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +27 -23
- data/bridge/sdk-core/sdk-core-protos/src/lib.rs +252 -74
- data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +12 -2
- data/bridge/sdk-core/test-utils/Cargo.toml +4 -1
- data/bridge/sdk-core/test-utils/src/canned_histories.rs +106 -296
- data/bridge/sdk-core/test-utils/src/histfetch.rs +1 -1
- data/bridge/sdk-core/test-utils/src/lib.rs +161 -50
- data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +50 -0
- data/bridge/sdk-core/test-utils/src/workflows.rs +29 -0
- data/bridge/sdk-core/tests/fuzzy_workflow.rs +130 -0
- data/bridge/sdk-core/tests/{load_tests.rs → heavy_tests.rs} +125 -51
- data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +25 -3
- data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +10 -5
- data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +239 -0
- data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +4 -60
- data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +5 -128
- data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +83 -25
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +93 -69
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -0
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +6 -13
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +1 -0
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +6 -2
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -10
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +151 -116
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +54 -0
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +7 -28
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +115 -24
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -0
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +18 -14
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +6 -20
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +10 -21
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +6 -4
- data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +27 -18
- data/bridge/sdk-core/tests/main.rs +8 -16
- data/bridge/sdk-core/tests/runner.rs +75 -36
- data/bridge/sdk-core/tests/wf_input_replay.rs +32 -0
- data/bridge/src/connection.rs +117 -82
- data/bridge/src/lib.rs +356 -42
- data/bridge/src/runtime.rs +10 -3
- data/bridge/src/test_server.rs +153 -0
- data/bridge/src/worker.rs +133 -9
- data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
- data/lib/gen/temporal/api/command/v1/message_pb.rb +10 -16
- data/lib/gen/temporal/api/common/v1/message_pb.rb +5 -1
- data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
- data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -3
- data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
- data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +5 -4
- data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +9 -1
- data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/update_pb.rb +7 -10
- data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
- data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/history/v1/message_pb.rb +34 -25
- data/lib/gen/temporal/api/namespace/v1/message_pb.rb +2 -1
- data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +14 -51
- data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
- data/lib/gen/temporal/api/protocol/v1/message_pb.rb +30 -0
- data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
- data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +23 -0
- data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
- data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +49 -0
- data/lib/gen/temporal/api/testservice/v1/service_pb.rb +21 -0
- data/lib/gen/temporal/api/update/v1/message_pb.rb +49 -3
- data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
- data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +47 -20
- data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
- data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +13 -9
- data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +10 -6
- data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +13 -9
- data/lib/gen/temporal/sdk/core/common/common_pb.rb +7 -3
- data/lib/gen/temporal/sdk/core/core_interface_pb.rb +9 -3
- data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +7 -3
- data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +28 -21
- data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +32 -24
- data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +12 -5
- data/lib/temporalio/activity/context.rb +102 -0
- data/lib/temporalio/activity/info.rb +67 -0
- data/lib/temporalio/activity.rb +85 -0
- data/lib/temporalio/bridge/connect_options.rb +15 -0
- data/lib/temporalio/bridge/error.rb +8 -0
- data/lib/temporalio/bridge/retry_config.rb +24 -0
- data/lib/temporalio/bridge/tls_options.rb +19 -0
- data/lib/temporalio/bridge.rb +14 -0
- data/lib/{temporal → temporalio}/client/implementation.rb +57 -56
- data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
- data/lib/{temporal → temporalio}/client.rb +19 -32
- data/lib/temporalio/connection/retry_config.rb +44 -0
- data/lib/temporalio/connection/service.rb +20 -0
- data/lib/temporalio/connection/test_service.rb +92 -0
- data/lib/temporalio/connection/tls_options.rb +51 -0
- data/lib/temporalio/connection/workflow_service.rb +731 -0
- data/lib/temporalio/connection.rb +86 -0
- data/lib/{temporal → temporalio}/data_converter.rb +76 -35
- data/lib/{temporal → temporalio}/error/failure.rb +6 -6
- data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
- data/lib/{temporal → temporalio}/errors.rb +19 -1
- data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
- data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
- data/lib/temporalio/failure_converter.rb +7 -0
- data/lib/temporalio/interceptor/activity_inbound.rb +22 -0
- data/lib/temporalio/interceptor/activity_outbound.rb +24 -0
- data/lib/{temporal → temporalio}/interceptor/chain.rb +7 -6
- data/lib/{temporal → temporalio}/interceptor/client.rb +27 -2
- data/lib/temporalio/interceptor.rb +22 -0
- data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
- data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
- data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
- data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
- data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
- data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
- data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
- data/lib/temporalio/payload_converter.rb +14 -0
- data/lib/{temporal → temporalio}/retry_policy.rb +17 -7
- data/lib/{temporal → temporalio}/retry_state.rb +1 -1
- data/lib/temporalio/runtime.rb +25 -0
- data/lib/temporalio/testing/time_skipping_handle.rb +32 -0
- data/lib/temporalio/testing/time_skipping_interceptor.rb +23 -0
- data/lib/temporalio/testing/workflow_environment.rb +112 -0
- data/lib/temporalio/testing.rb +175 -0
- data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
- data/lib/temporalio/version.rb +3 -0
- data/lib/temporalio/worker/activity_runner.rb +114 -0
- data/lib/temporalio/worker/activity_worker.rb +164 -0
- data/lib/temporalio/worker/reactor.rb +46 -0
- data/lib/temporalio/worker/runner.rb +63 -0
- data/lib/temporalio/worker/sync_worker.rb +124 -0
- data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
- data/lib/temporalio/worker.rb +204 -0
- data/lib/temporalio/workflow/async.rb +46 -0
- data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
- data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
- data/lib/temporalio/workflow/future.rb +138 -0
- data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
- data/lib/temporalio/workflow/info.rb +76 -0
- data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
- data/lib/temporalio.rb +12 -3
- data/temporalio.gemspec +11 -6
- metadata +137 -64
- data/bridge/sdk-core/Cargo.lock +0 -2606
- data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
- data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
- data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
- data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
- data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
- data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
- data/bridge/sdk-core/core/src/log_export.rs +0 -62
- data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
- data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
- data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
- data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
- data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
- data/lib/bridge.so +0 -0
- data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
- data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
- data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +0 -222
- data/lib/temporal/bridge.rb +0 -14
- data/lib/temporal/connection.rb +0 -736
- data/lib/temporal/failure_converter.rb +0 -8
- data/lib/temporal/payload_converter.rb +0 -14
- data/lib/temporal/runtime.rb +0 -22
- data/lib/temporal/version.rb +0 -3
- data/lib/temporal.rb +0 -8
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
use super::{
|
|
2
|
-
workflow_machines::MachineResponse, Cancellable, EventInfo,
|
|
2
|
+
workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
|
|
3
3
|
OnEventWrapper, WFMachinesAdapter, WFMachinesError,
|
|
4
4
|
};
|
|
5
|
+
use crate::worker::workflow::machines::HistEventData;
|
|
5
6
|
use rustfsm::{fsm, TransitionResult};
|
|
6
7
|
use std::convert::TryFrom;
|
|
7
8
|
use temporal_sdk_core_protos::{
|
|
@@ -61,16 +62,16 @@ impl CompleteWorkflowMachine {
|
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
|
|
64
|
-
impl TryFrom<
|
|
65
|
+
impl TryFrom<HistEventData> for CompleteWorkflowMachineEvents {
|
|
65
66
|
type Error = WFMachinesError;
|
|
66
67
|
|
|
67
|
-
fn try_from(e:
|
|
68
|
+
fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
|
|
69
|
+
let e = e.event;
|
|
68
70
|
Ok(match e.event_type() {
|
|
69
71
|
EventType::WorkflowExecutionCompleted => Self::WorkflowExecutionCompleted,
|
|
70
72
|
_ => {
|
|
71
73
|
return Err(WFMachinesError::Nondeterminism(format!(
|
|
72
|
-
"Complete workflow machine does not handle this event: {}"
|
|
73
|
-
e
|
|
74
|
+
"Complete workflow machine does not handle this event: {e}"
|
|
74
75
|
)))
|
|
75
76
|
}
|
|
76
77
|
})
|
|
@@ -131,10 +132,6 @@ impl WFMachinesAdapter for CompleteWorkflowMachine {
|
|
|
131
132
|
fn matches_event(&self, event: &HistoryEvent) -> bool {
|
|
132
133
|
event.event_type() == EventType::WorkflowExecutionCompleted
|
|
133
134
|
}
|
|
134
|
-
|
|
135
|
-
fn kind(&self) -> MachineKind {
|
|
136
|
-
MachineKind::CompleteWorkflow
|
|
137
|
-
}
|
|
138
135
|
}
|
|
139
136
|
|
|
140
137
|
impl Cancellable for CompleteWorkflowMachine {}
|
data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
use super::{
|
|
2
|
-
Cancellable, EventInfo, HistoryEvent,
|
|
3
|
-
|
|
2
|
+
Cancellable, EventInfo, HistoryEvent, MachineResponse, NewMachineWithCommand, OnEventWrapper,
|
|
3
|
+
WFMachinesAdapter, WFMachinesError,
|
|
4
4
|
};
|
|
5
|
+
use crate::worker::workflow::machines::HistEventData;
|
|
5
6
|
use rustfsm::{fsm, TransitionResult};
|
|
6
7
|
use std::convert::TryFrom;
|
|
7
8
|
use temporal_sdk_core_protos::{
|
|
@@ -69,16 +70,16 @@ impl From<ContinueAsNewWorkflowCommandCreated> for ContinueAsNewWorkflowCommandR
|
|
|
69
70
|
}
|
|
70
71
|
}
|
|
71
72
|
|
|
72
|
-
impl TryFrom<
|
|
73
|
+
impl TryFrom<HistEventData> for ContinueAsNewWorkflowMachineEvents {
|
|
73
74
|
type Error = WFMachinesError;
|
|
74
75
|
|
|
75
|
-
fn try_from(e:
|
|
76
|
+
fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
|
|
77
|
+
let e = e.event;
|
|
76
78
|
Ok(match e.event_type() {
|
|
77
79
|
EventType::WorkflowExecutionContinuedAsNew => Self::WorkflowExecutionContinuedAsNew,
|
|
78
80
|
_ => {
|
|
79
81
|
return Err(WFMachinesError::Nondeterminism(format!(
|
|
80
|
-
"Continue as new workflow machine does not handle this event: {}"
|
|
81
|
-
e
|
|
82
|
+
"Continue as new workflow machine does not handle this event: {e}"
|
|
82
83
|
)))
|
|
83
84
|
}
|
|
84
85
|
})
|
|
@@ -110,10 +111,6 @@ impl WFMachinesAdapter for ContinueAsNewWorkflowMachine {
|
|
|
110
111
|
fn matches_event(&self, event: &HistoryEvent) -> bool {
|
|
111
112
|
event.event_type() == EventType::WorkflowExecutionContinuedAsNew
|
|
112
113
|
}
|
|
113
|
-
|
|
114
|
-
fn kind(&self) -> MachineKind {
|
|
115
|
-
MachineKind::ContinueAsNewWorkflow
|
|
116
|
-
}
|
|
117
114
|
}
|
|
118
115
|
|
|
119
116
|
impl Cancellable for ContinueAsNewWorkflowMachine {}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
use super::{
|
|
2
|
-
workflow_machines::MachineResponse, Cancellable, EventInfo,
|
|
2
|
+
workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
|
|
3
3
|
OnEventWrapper, WFMachinesAdapter, WFMachinesError,
|
|
4
4
|
};
|
|
5
|
+
use crate::worker::workflow::machines::HistEventData;
|
|
5
6
|
use rustfsm::{fsm, TransitionResult};
|
|
6
7
|
use std::convert::TryFrom;
|
|
7
8
|
use temporal_sdk_core_protos::{
|
|
@@ -85,16 +86,16 @@ impl From<FailWorkflowCommandCreated> for FailWorkflowCommandRecorded {
|
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
impl TryFrom<
|
|
89
|
+
impl TryFrom<HistEventData> for FailWorkflowMachineEvents {
|
|
89
90
|
type Error = WFMachinesError;
|
|
90
91
|
|
|
91
|
-
fn try_from(e:
|
|
92
|
+
fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
|
|
93
|
+
let e = e.event;
|
|
92
94
|
Ok(match e.event_type() {
|
|
93
95
|
EventType::WorkflowExecutionFailed => Self::WorkflowExecutionFailed,
|
|
94
96
|
_ => {
|
|
95
97
|
return Err(WFMachinesError::Nondeterminism(format!(
|
|
96
|
-
"Fail workflow machine does not handle this event: {}"
|
|
97
|
-
e
|
|
98
|
+
"Fail workflow machine does not handle this event: {e}"
|
|
98
99
|
)))
|
|
99
100
|
}
|
|
100
101
|
})
|
|
@@ -124,10 +125,6 @@ impl WFMachinesAdapter for FailWorkflowMachine {
|
|
|
124
125
|
fn matches_event(&self, event: &HistoryEvent) -> bool {
|
|
125
126
|
event.event_type() == EventType::WorkflowExecutionFailed
|
|
126
127
|
}
|
|
127
|
-
|
|
128
|
-
fn kind(&self) -> MachineKind {
|
|
129
|
-
MachineKind::FailWorkflow
|
|
130
|
-
}
|
|
131
128
|
}
|
|
132
129
|
|
|
133
130
|
impl Cancellable for FailWorkflowMachine {}
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
use super::{
|
|
2
|
-
workflow_machines::MachineResponse, Cancellable, EventInfo,
|
|
3
|
-
|
|
2
|
+
workflow_machines::MachineResponse, Cancellable, EventInfo, OnEventWrapper, WFMachinesAdapter,
|
|
3
|
+
WFMachinesError,
|
|
4
4
|
};
|
|
5
5
|
use crate::{
|
|
6
|
+
internal_flags::CoreInternalFlags,
|
|
6
7
|
protosext::{CompleteLocalActivityData, HistoryEventExt, ValidScheduleLA},
|
|
7
|
-
worker::
|
|
8
|
+
worker::{
|
|
9
|
+
workflow::{machines::HistEventData, InternalFlagsRef, OutgoingJob},
|
|
10
|
+
LocalActivityExecutionResult,
|
|
11
|
+
},
|
|
8
12
|
};
|
|
9
13
|
use rustfsm::{fsm, MachineError, StateMachine, TransitionResult};
|
|
10
14
|
use std::{
|
|
@@ -59,15 +63,17 @@ fsm! {
|
|
|
59
63
|
--> MarkerCommandRecorded;
|
|
60
64
|
|
|
61
65
|
// Replay path ================================================================================
|
|
62
|
-
// LAs on the replay path
|
|
63
|
-
// to eventually see the marker
|
|
66
|
+
// LAs on the replay path always need to eventually see the marker
|
|
64
67
|
WaitingMarkerEvent --(MarkerRecorded(CompleteLocalActivityData), shared on_marker_recorded)
|
|
65
68
|
--> MarkerCommandRecorded;
|
|
66
69
|
// If we are told to cancel while waiting for the marker, we still need to wait for the marker.
|
|
67
|
-
WaitingMarkerEvent --(Cancel, on_cancel_requested) -->
|
|
70
|
+
WaitingMarkerEvent --(Cancel, on_cancel_requested) --> WaitingMarkerEvent;
|
|
71
|
+
// Because there could be non-heartbeat WFTs (ex: signals being received) between scheduling
|
|
72
|
+
// the LA and the marker being recorded, peekahead might not always resolve the LA *before*
|
|
73
|
+
// scheduling it. This transition accounts for that.
|
|
74
|
+
WaitingMarkerEvent --(HandleKnownResult(ResolveDat), on_handle_result) --> WaitingMarkerEvent;
|
|
68
75
|
WaitingMarkerEvent --(NoWaitCancel(ActivityCancellationType),
|
|
69
|
-
on_no_wait_cancel) -->
|
|
70
|
-
WaitingMarkerEventCancelled --(HandleResult(ResolveDat), on_handle_result) --> WaitingMarkerEvent;
|
|
76
|
+
on_no_wait_cancel) --> WaitingMarkerEvent;
|
|
71
77
|
|
|
72
78
|
// It is entirely possible to have started the LA while replaying, only to find that we have
|
|
73
79
|
// reached a new WFT and there still was no marker. In such cases we need to execute the LA.
|
|
@@ -79,6 +85,10 @@ fsm! {
|
|
|
79
85
|
// even though we already resolved the activity.
|
|
80
86
|
WaitingMarkerEventPreResolved --(MarkerRecorded(CompleteLocalActivityData),
|
|
81
87
|
shared on_marker_recorded) --> MarkerCommandRecorded;
|
|
88
|
+
// Ignore cancellations when waiting for the marker after being pre-resolved
|
|
89
|
+
WaitingMarkerEventPreResolved --(Cancel) --> WaitingMarkerEventPreResolved;
|
|
90
|
+
WaitingMarkerEventPreResolved --(NoWaitCancel(ActivityCancellationType))
|
|
91
|
+
--> WaitingMarkerEventPreResolved;
|
|
82
92
|
|
|
83
93
|
// Ignore cancellation in final state
|
|
84
94
|
MarkerCommandRecorded --(Cancel, on_cancel_requested) --> MarkerCommandRecorded;
|
|
@@ -131,10 +141,11 @@ impl From<CompleteLocalActivityData> for ResolveDat {
|
|
|
131
141
|
/// must resolve before we send a record marker command. A [MachineResponse] may be produced,
|
|
132
142
|
/// to queue the LA for execution if it needs to be.
|
|
133
143
|
pub(super) fn new_local_activity(
|
|
134
|
-
attrs: ValidScheduleLA,
|
|
144
|
+
mut attrs: ValidScheduleLA,
|
|
135
145
|
replaying_when_invoked: bool,
|
|
136
146
|
maybe_pre_resolved: Option<ResolveDat>,
|
|
137
147
|
wf_time: Option<SystemTime>,
|
|
148
|
+
internal_flags: InternalFlagsRef,
|
|
138
149
|
) -> Result<(LocalActivityMachine, Vec<MachineResponse>), WFMachinesError> {
|
|
139
150
|
let initial_state = if replaying_when_invoked {
|
|
140
151
|
if let Some(dat) = maybe_pre_resolved {
|
|
@@ -151,12 +162,18 @@ pub(super) fn new_local_activity(
|
|
|
151
162
|
Executing {}.into()
|
|
152
163
|
};
|
|
153
164
|
|
|
165
|
+
// If the scheduled LA doesn't already have an "original" schedule time, assign one.
|
|
166
|
+
attrs
|
|
167
|
+
.original_schedule_time
|
|
168
|
+
.get_or_insert(SystemTime::now());
|
|
169
|
+
|
|
154
170
|
let mut machine = LocalActivityMachine {
|
|
155
171
|
state: initial_state,
|
|
156
172
|
shared_state: SharedState {
|
|
157
173
|
attrs,
|
|
158
174
|
replaying_when_invoked,
|
|
159
175
|
wf_time_when_started: wf_time,
|
|
176
|
+
internal_flags,
|
|
160
177
|
},
|
|
161
178
|
};
|
|
162
179
|
|
|
@@ -193,6 +210,12 @@ impl LocalActivityMachine {
|
|
|
193
210
|
}
|
|
194
211
|
}
|
|
195
212
|
|
|
213
|
+
/// Returns true if the machine will willingly accept data from a marker in its current state.
|
|
214
|
+
/// IE: Calling [Self::try_resolve_with_dat] makes sense.
|
|
215
|
+
pub(super) fn will_accept_resolve_marker(&self) -> bool {
|
|
216
|
+
matches!(self.state, LocalActivityMachineState::WaitingMarkerEvent(_))
|
|
217
|
+
}
|
|
218
|
+
|
|
196
219
|
/// Must be called if the workflow encounters a non-replay workflow task
|
|
197
220
|
pub(super) fn encountered_non_replay_wft(
|
|
198
221
|
&mut self,
|
|
@@ -231,28 +254,45 @@ impl LocalActivityMachine {
|
|
|
231
254
|
backoff: Option<prost_types::Duration>,
|
|
232
255
|
original_schedule_time: Option<SystemTime>,
|
|
233
256
|
) -> Result<Vec<MachineResponse>, WFMachinesError> {
|
|
234
|
-
self.
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
257
|
+
self._try_resolve(
|
|
258
|
+
ResolveDat {
|
|
259
|
+
result,
|
|
260
|
+
complete_time: self.shared_state.wf_time_when_started.map(|t| t + runtime),
|
|
261
|
+
attempt,
|
|
262
|
+
backoff,
|
|
263
|
+
original_schedule_time,
|
|
264
|
+
},
|
|
265
|
+
false,
|
|
266
|
+
)
|
|
241
267
|
}
|
|
268
|
+
|
|
242
269
|
/// Attempt to resolve the local activity with already known data, ex pre-resolved data
|
|
243
270
|
pub(super) fn try_resolve_with_dat(
|
|
244
271
|
&mut self,
|
|
245
272
|
dat: ResolveDat,
|
|
246
273
|
) -> Result<Vec<MachineResponse>, WFMachinesError> {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
274
|
+
self._try_resolve(dat, true)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
fn _try_resolve(
|
|
278
|
+
&mut self,
|
|
279
|
+
dat: ResolveDat,
|
|
280
|
+
from_marker: bool,
|
|
281
|
+
) -> Result<Vec<MachineResponse>, WFMachinesError> {
|
|
282
|
+
let evt = if from_marker {
|
|
283
|
+
LocalActivityMachineEvents::HandleKnownResult(dat)
|
|
284
|
+
} else {
|
|
285
|
+
LocalActivityMachineEvents::HandleResult(dat)
|
|
286
|
+
};
|
|
287
|
+
let res = OnEventWrapper::on_event_mut(self, evt).map_err(|e| match e {
|
|
288
|
+
MachineError::InvalidTransition => WFMachinesError::Fatal(format!(
|
|
289
|
+
"Invalid transition resolving local activity (seq {}, from marker: {}) in {}",
|
|
290
|
+
self.shared_state.attrs.seq,
|
|
291
|
+
from_marker,
|
|
292
|
+
self.state(),
|
|
293
|
+
)),
|
|
294
|
+
MachineError::Underlying(e) => e,
|
|
295
|
+
})?;
|
|
256
296
|
|
|
257
297
|
Ok(res
|
|
258
298
|
.into_iter()
|
|
@@ -269,6 +309,7 @@ pub(super) struct SharedState {
|
|
|
269
309
|
attrs: ValidScheduleLA,
|
|
270
310
|
replaying_when_invoked: bool,
|
|
271
311
|
wf_time_when_started: Option<SystemTime>,
|
|
312
|
+
internal_flags: InternalFlagsRef,
|
|
272
313
|
}
|
|
273
314
|
|
|
274
315
|
impl SharedState {
|
|
@@ -286,6 +327,7 @@ impl SharedState {
|
|
|
286
327
|
}
|
|
287
328
|
}
|
|
288
329
|
|
|
330
|
+
#[allow(clippy::large_enum_variant)]
|
|
289
331
|
#[derive(Debug, derive_more::Display)]
|
|
290
332
|
pub(super) enum LocalActivityCommand {
|
|
291
333
|
RequestActivityExecution(ValidScheduleLA),
|
|
@@ -500,6 +542,17 @@ impl WaitingMarkerEvent {
|
|
|
500
542
|
})
|
|
501
543
|
)
|
|
502
544
|
}
|
|
545
|
+
fn on_handle_result(
|
|
546
|
+
self,
|
|
547
|
+
dat: ResolveDat,
|
|
548
|
+
) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
|
|
549
|
+
TransitionResult::ok(
|
|
550
|
+
[LocalActivityCommand::Resolved(dat)],
|
|
551
|
+
WaitingMarkerEvent {
|
|
552
|
+
already_resolved: true,
|
|
553
|
+
},
|
|
554
|
+
)
|
|
555
|
+
}
|
|
503
556
|
pub(super) fn on_started_non_replay_wft(
|
|
504
557
|
self,
|
|
505
558
|
mut dat: SharedState,
|
|
@@ -515,41 +568,22 @@ impl WaitingMarkerEvent {
|
|
|
515
568
|
)
|
|
516
569
|
}
|
|
517
570
|
|
|
518
|
-
fn on_cancel_requested(self) -> LocalActivityMachineTransition<
|
|
571
|
+
fn on_cancel_requested(self) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
|
|
519
572
|
// We still "request a cancel" even though we know the local activity should not be running
|
|
520
573
|
// because the data might be in the pre-resolved list.
|
|
521
|
-
TransitionResult::ok(
|
|
522
|
-
[LocalActivityCommand::RequestCancel],
|
|
523
|
-
WaitingMarkerEventCancelled {},
|
|
524
|
-
)
|
|
574
|
+
TransitionResult::ok([LocalActivityCommand::RequestCancel], self)
|
|
525
575
|
}
|
|
526
576
|
|
|
527
577
|
fn on_no_wait_cancel(
|
|
528
578
|
self,
|
|
529
579
|
_: ActivityCancellationType,
|
|
530
|
-
) -> LocalActivityMachineTransition<
|
|
580
|
+
) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
|
|
531
581
|
// Markers are always recorded when cancelling, so this is the same as a normal cancel on
|
|
532
582
|
// the replay path
|
|
533
583
|
self.on_cancel_requested()
|
|
534
584
|
}
|
|
535
585
|
}
|
|
536
586
|
|
|
537
|
-
#[derive(Default, Clone)]
|
|
538
|
-
pub(super) struct WaitingMarkerEventCancelled {}
|
|
539
|
-
impl WaitingMarkerEventCancelled {
|
|
540
|
-
fn on_handle_result(
|
|
541
|
-
self,
|
|
542
|
-
dat: ResolveDat,
|
|
543
|
-
) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
|
|
544
|
-
TransitionResult::ok(
|
|
545
|
-
[LocalActivityCommand::Resolved(dat)],
|
|
546
|
-
WaitingMarkerEvent {
|
|
547
|
-
already_resolved: true,
|
|
548
|
-
},
|
|
549
|
-
)
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
|
|
553
587
|
#[derive(Default, Clone)]
|
|
554
588
|
pub(super) struct WaitingMarkerEventPreResolved {}
|
|
555
589
|
impl WaitingMarkerEventPreResolved {
|
|
@@ -643,13 +677,14 @@ impl WFMachinesAdapter for LocalActivityMachine {
|
|
|
643
677
|
result.into()
|
|
644
678
|
};
|
|
645
679
|
let mut responses = vec![
|
|
646
|
-
MachineResponse::PushWFJob(
|
|
647
|
-
ResolveActivity {
|
|
680
|
+
MachineResponse::PushWFJob(OutgoingJob {
|
|
681
|
+
variant: ResolveActivity {
|
|
648
682
|
seq: self.shared_state.attrs.seq,
|
|
649
683
|
result: Some(resolution),
|
|
650
684
|
}
|
|
651
685
|
.into(),
|
|
652
|
-
|
|
686
|
+
is_la_resolution: true,
|
|
687
|
+
}),
|
|
653
688
|
MachineResponse::UpdateWFTime(complete_time),
|
|
654
689
|
];
|
|
655
690
|
|
|
@@ -708,10 +743,6 @@ impl WFMachinesAdapter for LocalActivityMachine {
|
|
|
708
743
|
fn matches_event(&self, event: &HistoryEvent) -> bool {
|
|
709
744
|
event.is_local_activity_marker()
|
|
710
745
|
}
|
|
711
|
-
|
|
712
|
-
fn kind(&self) -> MachineKind {
|
|
713
|
-
MachineKind::LocalActivity
|
|
714
|
-
}
|
|
715
746
|
}
|
|
716
747
|
|
|
717
748
|
impl TryFrom<CommandType> for LocalActivityMachineEvents {
|
|
@@ -725,14 +756,14 @@ impl TryFrom<CommandType> for LocalActivityMachineEvents {
|
|
|
725
756
|
}
|
|
726
757
|
}
|
|
727
758
|
|
|
728
|
-
impl TryFrom<
|
|
759
|
+
impl TryFrom<HistEventData> for LocalActivityMachineEvents {
|
|
729
760
|
type Error = WFMachinesError;
|
|
730
761
|
|
|
731
|
-
fn try_from(e:
|
|
762
|
+
fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
|
|
763
|
+
let e = e.event;
|
|
732
764
|
if e.event_type() != EventType::MarkerRecorded {
|
|
733
765
|
return Err(WFMachinesError::Nondeterminism(format!(
|
|
734
|
-
"Local activity machine cannot handle this event: {}"
|
|
735
|
-
e
|
|
766
|
+
"Local activity machine cannot handle this event: {e}"
|
|
736
767
|
)));
|
|
737
768
|
}
|
|
738
769
|
|
|
@@ -756,6 +787,28 @@ fn verify_marker_data_matches(
|
|
|
756
787
|
dat.marker_dat.seq, shared.attrs.seq
|
|
757
788
|
)));
|
|
758
789
|
}
|
|
790
|
+
// Here we use whether or not we were replaying when we _first invoked_ the LA, because we
|
|
791
|
+
// are always replaying when we see the marker recorded event, and that would make this check
|
|
792
|
+
// a bit pointless.
|
|
793
|
+
if shared.internal_flags.borrow_mut().try_use(
|
|
794
|
+
CoreInternalFlags::IdAndTypeDeterminismChecks,
|
|
795
|
+
!shared.replaying_when_invoked,
|
|
796
|
+
) {
|
|
797
|
+
if dat.marker_dat.activity_id != shared.attrs.activity_id {
|
|
798
|
+
return Err(WFMachinesError::Nondeterminism(format!(
|
|
799
|
+
"Activity id of recorded marker '{}' does not \
|
|
800
|
+
match activity id of local activity command '{}'",
|
|
801
|
+
dat.marker_dat.activity_id, shared.attrs.activity_id
|
|
802
|
+
)));
|
|
803
|
+
}
|
|
804
|
+
if dat.marker_dat.activity_type != shared.attrs.activity_type {
|
|
805
|
+
return Err(WFMachinesError::Nondeterminism(format!(
|
|
806
|
+
"Activity type of recorded marker '{}' does not \
|
|
807
|
+
match activity type of local activity command '{}'",
|
|
808
|
+
dat.marker_dat.activity_type, shared.attrs.activity_type
|
|
809
|
+
)));
|
|
810
|
+
}
|
|
811
|
+
}
|
|
759
812
|
|
|
760
813
|
Ok(())
|
|
761
814
|
}
|
|
@@ -798,10 +851,15 @@ mod tests {
|
|
|
798
851
|
temporal::api::{
|
|
799
852
|
command::v1::command, enums::v1::WorkflowTaskFailedCause, failure::v1::Failure,
|
|
800
853
|
},
|
|
854
|
+
DEFAULT_ACTIVITY_TYPE,
|
|
801
855
|
};
|
|
802
856
|
|
|
803
857
|
async fn la_wf(ctx: WfContext) -> WorkflowResult<()> {
|
|
804
|
-
ctx.local_activity(LocalActivityOptions
|
|
858
|
+
ctx.local_activity(LocalActivityOptions {
|
|
859
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
860
|
+
..Default::default()
|
|
861
|
+
})
|
|
862
|
+
.await;
|
|
805
863
|
Ok(().into())
|
|
806
864
|
}
|
|
807
865
|
|
|
@@ -914,8 +972,16 @@ mod tests {
|
|
|
914
972
|
}
|
|
915
973
|
|
|
916
974
|
async fn two_la_wf(ctx: WfContext) -> WorkflowResult<()> {
|
|
917
|
-
ctx.local_activity(LocalActivityOptions
|
|
918
|
-
|
|
975
|
+
ctx.local_activity(LocalActivityOptions {
|
|
976
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
977
|
+
..Default::default()
|
|
978
|
+
})
|
|
979
|
+
.await;
|
|
980
|
+
ctx.local_activity(LocalActivityOptions {
|
|
981
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
982
|
+
..Default::default()
|
|
983
|
+
})
|
|
984
|
+
.await;
|
|
919
985
|
Ok(().into())
|
|
920
986
|
}
|
|
921
987
|
|
|
@@ -940,7 +1006,7 @@ mod tests {
|
|
|
940
1006
|
let commands = wfm.get_server_commands().commands;
|
|
941
1007
|
assert_eq!(commands.len(), 0);
|
|
942
1008
|
let ready_to_execute_las = wfm.drain_queued_local_activities();
|
|
943
|
-
let num_queued =
|
|
1009
|
+
let num_queued = usize::from(!replay);
|
|
944
1010
|
assert_eq!(ready_to_execute_las.len(), num_queued);
|
|
945
1011
|
|
|
946
1012
|
if !replay {
|
|
@@ -1008,8 +1074,14 @@ mod tests {
|
|
|
1008
1074
|
|
|
1009
1075
|
async fn two_la_wf_parallel(ctx: WfContext) -> WorkflowResult<()> {
|
|
1010
1076
|
tokio::join!(
|
|
1011
|
-
ctx.local_activity(LocalActivityOptions
|
|
1012
|
-
|
|
1077
|
+
ctx.local_activity(LocalActivityOptions {
|
|
1078
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
1079
|
+
..Default::default()
|
|
1080
|
+
}),
|
|
1081
|
+
ctx.local_activity(LocalActivityOptions {
|
|
1082
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
1083
|
+
..Default::default()
|
|
1084
|
+
})
|
|
1013
1085
|
);
|
|
1014
1086
|
Ok(().into())
|
|
1015
1087
|
}
|
|
@@ -1092,9 +1164,17 @@ mod tests {
|
|
|
1092
1164
|
}
|
|
1093
1165
|
|
|
1094
1166
|
async fn la_timer_la(ctx: WfContext) -> WorkflowResult<()> {
|
|
1095
|
-
ctx.local_activity(LocalActivityOptions
|
|
1167
|
+
ctx.local_activity(LocalActivityOptions {
|
|
1168
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
1169
|
+
..Default::default()
|
|
1170
|
+
})
|
|
1171
|
+
.await;
|
|
1096
1172
|
ctx.timer(Duration::from_secs(5)).await;
|
|
1097
|
-
ctx.local_activity(LocalActivityOptions
|
|
1173
|
+
ctx.local_activity(LocalActivityOptions {
|
|
1174
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
1175
|
+
..Default::default()
|
|
1176
|
+
})
|
|
1177
|
+
.await;
|
|
1098
1178
|
Ok(().into())
|
|
1099
1179
|
}
|
|
1100
1180
|
|
|
@@ -1116,7 +1196,7 @@ mod tests {
|
|
|
1116
1196
|
let commands = wfm.get_server_commands().commands;
|
|
1117
1197
|
assert_eq!(commands.len(), 0);
|
|
1118
1198
|
let ready_to_execute_las = wfm.drain_queued_local_activities();
|
|
1119
|
-
let num_queued =
|
|
1199
|
+
let num_queued = usize::from(!replay);
|
|
1120
1200
|
assert_eq!(ready_to_execute_las.len(), num_queued);
|
|
1121
1201
|
|
|
1122
1202
|
if !replay {
|
|
@@ -1158,7 +1238,7 @@ mod tests {
|
|
|
1158
1238
|
}]
|
|
1159
1239
|
);
|
|
1160
1240
|
let ready_to_execute_las = wfm.drain_queued_local_activities();
|
|
1161
|
-
let num_queued =
|
|
1241
|
+
let num_queued = usize::from(!replay);
|
|
1162
1242
|
assert_eq!(ready_to_execute_las.len(), num_queued);
|
|
1163
1243
|
if !replay {
|
|
1164
1244
|
wfm.complete_local_activity(2, ActivityExecutionResult::ok(b"Resolved".into()))
|
|
@@ -1210,17 +1290,12 @@ mod tests {
|
|
|
1210
1290
|
let histinfo = t.get_full_history_info().unwrap().into();
|
|
1211
1291
|
let mut wfm = ManagedWFFunc::new_from_update(histinfo, func, vec![]);
|
|
1212
1292
|
|
|
1213
|
-
// First activation will request to run the LA
|
|
1214
|
-
//
|
|
1293
|
+
// First activation will request to run the LA since the heartbeat & wft failure are skipped
|
|
1294
|
+
// over
|
|
1215
1295
|
wfm.get_next_activation().await.unwrap();
|
|
1216
1296
|
let commands = wfm.get_server_commands().commands;
|
|
1217
1297
|
assert_eq!(commands.len(), 0);
|
|
1218
1298
|
let ready_to_execute_las = wfm.drain_queued_local_activities();
|
|
1219
|
-
assert_eq!(ready_to_execute_las.len(), 0);
|
|
1220
|
-
|
|
1221
|
-
// On the *next* activation, we are no longer replaying and the activity should be queued
|
|
1222
|
-
wfm.get_next_activation().await.unwrap();
|
|
1223
|
-
let ready_to_execute_las = wfm.drain_queued_local_activities();
|
|
1224
1299
|
assert_eq!(ready_to_execute_las.len(), 1);
|
|
1225
1300
|
// We can happily complete it now
|
|
1226
1301
|
wfm.complete_local_activity(1, ActivityExecutionResult::ok(b"hi".into()))
|
|
@@ -1340,6 +1415,7 @@ mod tests {
|
|
|
1340
1415
|
let func = WorkflowFunction::new(move |ctx| async move {
|
|
1341
1416
|
let la = ctx.local_activity(LocalActivityOptions {
|
|
1342
1417
|
cancel_type,
|
|
1418
|
+
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
1343
1419
|
..Default::default()
|
|
1344
1420
|
});
|
|
1345
1421
|
ctx.timer(Duration::from_secs(1)).await;
|
|
@@ -1355,14 +1431,14 @@ mod tests {
|
|
|
1355
1431
|
let mut t = TestHistoryBuilder::default();
|
|
1356
1432
|
t.add_by_type(EventType::WorkflowExecutionStarted);
|
|
1357
1433
|
t.add_full_wf_task();
|
|
1358
|
-
let timer_started_event_id = t.
|
|
1434
|
+
let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
|
|
1359
1435
|
t.add_timer_fired(timer_started_event_id, "1".to_string());
|
|
1360
1436
|
t.add_full_wf_task();
|
|
1361
1437
|
if cancel_type != ActivityCancellationType::WaitCancellationCompleted {
|
|
1362
1438
|
// With non-wait cancels, the cancel is immediate
|
|
1363
1439
|
t.add_local_activity_cancel_marker(1, "1");
|
|
1364
1440
|
}
|
|
1365
|
-
let timer_started_event_id = t.
|
|
1441
|
+
let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
|
|
1366
1442
|
if cancel_type == ActivityCancellationType::WaitCancellationCompleted {
|
|
1367
1443
|
// With wait cancels, the cancel marker is not recorded until activity reports.
|
|
1368
1444
|
t.add_local_activity_cancel_marker(1, "1");
|
|
@@ -1383,7 +1459,7 @@ mod tests {
|
|
|
1383
1459
|
assert_eq!(commands.len(), 1);
|
|
1384
1460
|
assert_eq!(commands[0].command_type, CommandType::StartTimer as i32);
|
|
1385
1461
|
let ready_to_execute_las = wfm.drain_queued_local_activities();
|
|
1386
|
-
let num_queued =
|
|
1462
|
+
let num_queued = usize::from(!replay);
|
|
1387
1463
|
assert_eq!(ready_to_execute_las.len(), num_queued);
|
|
1388
1464
|
|
|
1389
1465
|
// Next activation timer fires and activity cancel will be requested
|
|
@@ -1406,8 +1482,9 @@ mod tests {
|
|
|
1406
1482
|
assert_eq!(commands[1].command_type, CommandType::StartTimer as i32);
|
|
1407
1483
|
}
|
|
1408
1484
|
|
|
1409
|
-
if replay {
|
|
1410
|
-
wfm.get_next_activation().await.unwrap()
|
|
1485
|
+
let commands = if replay {
|
|
1486
|
+
wfm.get_next_activation().await.unwrap();
|
|
1487
|
+
wfm.get_server_commands().commands
|
|
1411
1488
|
} else {
|
|
1412
1489
|
// On non replay, there's an additional activation, because completing with the cancel
|
|
1413
1490
|
// wants to wake up the workflow to see if resolving the LA as cancelled did anything.
|
|
@@ -1432,11 +1509,11 @@ mod tests {
|
|
|
1432
1509
|
|
|
1433
1510
|
wfm.new_history(t.get_history_info(3).unwrap().into())
|
|
1434
1511
|
.await
|
|
1435
|
-
.unwrap()
|
|
1512
|
+
.unwrap();
|
|
1513
|
+
wfm.get_next_activation().await.unwrap();
|
|
1514
|
+
wfm.get_server_commands().commands
|
|
1436
1515
|
};
|
|
1437
1516
|
|
|
1438
|
-
wfm.get_next_activation().await.unwrap();
|
|
1439
|
-
let commands = wfm.get_server_commands().commands;
|
|
1440
1517
|
assert_eq!(commands.len(), 1);
|
|
1441
1518
|
assert_eq!(
|
|
1442
1519
|
commands[0].command_type,
|