@temporalio/core-bridge 1.13.1 → 1.14.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.
- package/Cargo.lock +350 -436
- package/Cargo.toml +14 -13
- package/{sdk-core/fsm/rustfsm_procmacro/LICENSE.txt → LICENSE} +5 -5
- package/README.md +0 -1
- package/bridge-macros/Cargo.toml +16 -0
- package/bridge-macros/src/derive_js_function.rs +126 -0
- package/bridge-macros/src/derive_tryfromjs.rs +138 -0
- package/bridge-macros/src/derive_tryintojs.rs +151 -0
- package/bridge-macros/src/lib.rs +42 -0
- package/lib/native.d.ts +23 -9
- package/package.json +6 -5
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/releases/x86_64-apple-darwin/index.node +0 -0
- package/releases/x86_64-pc-windows-msvc/index.node +0 -0
- package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
- package/sdk-core/.cargo/config.toml +78 -12
- package/sdk-core/.clippy.toml +1 -0
- package/sdk-core/.github/workflows/heavy.yml +2 -0
- package/sdk-core/.github/workflows/per-pr.yml +90 -21
- package/sdk-core/AGENTS.md +17 -19
- package/sdk-core/ARCHITECTURE.md +44 -48
- package/sdk-core/Cargo.toml +25 -7
- package/sdk-core/README.md +16 -15
- package/sdk-core/arch_docs/diagrams/TimerMachine_Coverage.puml +14 -0
- package/sdk-core/arch_docs/diagrams/deps.svg +102 -0
- package/sdk-core/arch_docs/diagrams/initial_event_history.png +0 -0
- package/sdk-core/arch_docs/sdks_intro.md +299 -0
- package/sdk-core/{client → crates/client}/Cargo.toml +15 -16
- package/sdk-core/{client → crates/client}/src/callback_based.rs +1 -2
- package/sdk-core/{client → crates/client}/src/lib.rs +594 -457
- package/sdk-core/{client → crates/client}/src/metrics.rs +32 -8
- package/sdk-core/crates/client/src/proxy.rs +209 -0
- package/sdk-core/{client → crates/client}/src/raw.rs +648 -328
- package/sdk-core/crates/client/src/replaceable.rs +253 -0
- package/sdk-core/crates/client/src/request_extensions.rs +40 -0
- package/sdk-core/{client → crates/client}/src/retry.rs +32 -22
- package/sdk-core/crates/client/src/worker/mod.rs +1468 -0
- package/sdk-core/{client → crates/client}/src/workflow_handle/mod.rs +24 -21
- package/sdk-core/{core-api → crates/common}/Cargo.toml +21 -12
- package/sdk-core/{sdk-core-protos → crates/common}/build.rs +10 -23
- package/sdk-core/crates/common/protos/api_cloud_upstream/VERSION +1 -0
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/account/v1/message.proto +18 -0
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/cloudservice/v1/request_response.proto +38 -11
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/cloudservice/v1/service.proto +21 -4
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/operation/v1/message.proto +6 -6
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/sink/v1/message.proto +22 -0
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/create-release.yml +13 -0
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/openapi/openapiv2.json +254 -5
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/openapi/openapiv3.yaml +234 -5
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/common/v1/message.proto +1 -1
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/deployment/v1/message.proto +6 -0
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -2
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -2
- package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +30 -6
- package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
- package/sdk-core/{core-api → crates/common}/src/envconfig.rs +155 -56
- package/sdk-core/{core-api → crates/common}/src/errors.rs +8 -1
- package/sdk-core/{fsm/rustfsm_trait/src/lib.rs → crates/common/src/fsm_trait.rs} +1 -27
- package/sdk-core/{core-api → crates/common}/src/lib.rs +92 -9
- package/sdk-core/{test-utils/src → crates/common/src/protos}/canned_histories.rs +5 -5
- package/sdk-core/{sdk-core-protos/src → crates/common/src/protos}/history_builder.rs +3 -3
- package/sdk-core/{sdk-core-protos/src → crates/common/src/protos}/history_info.rs +2 -2
- package/sdk-core/{sdk-core-protos/src/lib.rs → crates/common/src/protos/mod.rs} +43 -26
- package/sdk-core/crates/common/src/protos/test_utils.rs +89 -0
- package/sdk-core/{sdk-core-protos/src → crates/common/src/protos}/utilities.rs +14 -5
- package/sdk-core/{core-api → crates/common}/src/telemetry/metrics.rs +449 -51
- package/sdk-core/{core-api → crates/common}/src/telemetry.rs +16 -1
- package/sdk-core/{core-api → crates/common}/src/worker.rs +112 -18
- package/sdk-core/crates/common/tests/worker_task_types_test.rs +129 -0
- package/sdk-core/crates/macros/Cargo.toml +23 -0
- package/sdk-core/{fsm/rustfsm_procmacro → crates/macros}/src/lib.rs +12 -12
- package/sdk-core/{sdk → crates/sdk}/Cargo.toml +18 -12
- package/sdk-core/{sdk → crates/sdk}/src/activity_context.rs +9 -7
- package/sdk-core/{sdk → crates/sdk}/src/app_data.rs +1 -1
- package/sdk-core/{sdk → crates/sdk}/src/interceptors.rs +2 -5
- package/sdk-core/{sdk → crates/sdk}/src/lib.rs +43 -42
- package/sdk-core/{sdk → crates/sdk}/src/workflow_context/options.rs +12 -3
- package/sdk-core/{sdk → crates/sdk}/src/workflow_context.rs +21 -19
- package/sdk-core/{sdk → crates/sdk}/src/workflow_future.rs +2 -2
- package/sdk-core/crates/sdk-core/Cargo.toml +222 -0
- package/sdk-core/{core/benches/workflow_replay.rs → crates/sdk-core/benches/workflow_replay_bench.rs} +15 -10
- package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +32 -0
- package/sdk-core/crates/sdk-core/machine_coverage/CancelExternalMachine_Coverage.puml +9 -0
- package/sdk-core/crates/sdk-core/machine_coverage/CancelWorkflowMachine_Coverage.puml +6 -0
- package/sdk-core/crates/sdk-core/machine_coverage/ChildWorkflowMachine_Coverage.puml +27 -0
- package/sdk-core/crates/sdk-core/machine_coverage/CompleteWorkflowMachine_Coverage.puml +6 -0
- package/sdk-core/crates/sdk-core/machine_coverage/ContinueAsNewWorkflowMachine_Coverage.puml +6 -0
- package/sdk-core/crates/sdk-core/machine_coverage/FailWorkflowMachine_Coverage.puml +6 -0
- package/sdk-core/crates/sdk-core/machine_coverage/LocalActivityMachine_Coverage.puml +23 -0
- package/sdk-core/crates/sdk-core/machine_coverage/ModifyWorkflowPropertiesMachine_Coverage.puml +5 -0
- package/sdk-core/crates/sdk-core/machine_coverage/PatchMachine_Coverage.puml +8 -0
- package/sdk-core/crates/sdk-core/machine_coverage/SignalExternalMachine_Coverage.puml +12 -0
- package/sdk-core/crates/sdk-core/machine_coverage/TimerMachine_Coverage.puml +13 -0
- package/sdk-core/crates/sdk-core/machine_coverage/UpdateMachine_Coverage.puml +19 -0
- package/sdk-core/crates/sdk-core/machine_coverage/UpsertSearchAttributesMachine_Coverage.puml +5 -0
- package/sdk-core/crates/sdk-core/machine_coverage/WorkflowTaskMachine_Coverage.puml +11 -0
- package/sdk-core/{core → crates/sdk-core}/src/abstractions.rs +62 -6
- package/sdk-core/crates/sdk-core/src/antithesis.rs +60 -0
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/activity_tasks.rs +85 -250
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/mod.rs +13 -16
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/queries.rs +25 -24
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/replay_flag.rs +11 -68
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/updates.rs +21 -20
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/workers.rs +242 -16
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/workflow_cancels.rs +10 -7
- package/sdk-core/{core → crates/sdk-core}/src/core_tests/workflow_tasks.rs +150 -326
- package/sdk-core/{core → crates/sdk-core}/src/debug_client.rs +1 -1
- package/sdk-core/{core → crates/sdk-core}/src/ephemeral_server/mod.rs +18 -6
- package/sdk-core/{test-utils → crates/sdk-core}/src/histfetch.rs +9 -4
- package/sdk-core/{core → crates/sdk-core}/src/internal_flags.rs +15 -4
- package/sdk-core/{core → crates/sdk-core}/src/lib.rs +128 -72
- package/sdk-core/{core → crates/sdk-core}/src/pollers/mod.rs +13 -11
- package/sdk-core/{core → crates/sdk-core}/src/pollers/poll_buffer.rs +53 -18
- package/sdk-core/{core → crates/sdk-core}/src/protosext/mod.rs +14 -6
- package/sdk-core/{core → crates/sdk-core}/src/protosext/protocol_messages.rs +5 -12
- package/sdk-core/{core → crates/sdk-core}/src/replay/mod.rs +14 -11
- package/sdk-core/crates/sdk-core/src/retry_logic.rs +390 -0
- package/sdk-core/{core → crates/sdk-core}/src/telemetry/log_export.rs +2 -2
- package/sdk-core/{core → crates/sdk-core}/src/telemetry/metrics.rs +80 -33
- package/sdk-core/{core → crates/sdk-core}/src/telemetry/mod.rs +12 -6
- package/sdk-core/{core → crates/sdk-core}/src/telemetry/otel.rs +1 -1
- package/sdk-core/{core → crates/sdk-core}/src/telemetry/prometheus_meter.rs +14 -14
- package/sdk-core/{core → crates/sdk-core}/src/telemetry/prometheus_server.rs +2 -2
- package/sdk-core/{core/src/test_help/mod.rs → crates/sdk-core/src/test_help/integ_helpers.rs} +284 -329
- package/sdk-core/crates/sdk-core/src/test_help/mod.rs +13 -0
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +220 -0
- package/sdk-core/{core → crates/sdk-core}/src/worker/activities/activity_heartbeat_manager.rs +44 -8
- package/sdk-core/{core → crates/sdk-core}/src/worker/activities/local_activities.rs +33 -31
- package/sdk-core/{core → crates/sdk-core}/src/worker/activities.rs +31 -15
- package/sdk-core/{core → crates/sdk-core}/src/worker/client/mocks.rs +28 -15
- package/sdk-core/{core → crates/sdk-core}/src/worker/client.rs +275 -145
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +246 -0
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1462 -0
- package/sdk-core/{core → crates/sdk-core}/src/worker/nexus.rs +24 -12
- package/sdk-core/{core → crates/sdk-core}/src/worker/slot_provider.rs +18 -10
- package/sdk-core/{core → crates/sdk-core}/src/worker/tuner/fixed_size.rs +5 -1
- package/sdk-core/{core → crates/sdk-core}/src/worker/tuner/resource_based.rs +453 -57
- package/sdk-core/{core → crates/sdk-core}/src/worker/tuner.rs +179 -3
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/driven_workflow.rs +1 -1
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/history_update.rs +5 -267
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/activity_state_machine.rs +147 -90
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/cancel_external_state_machine.rs +8 -91
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/cancel_nexus_op_state_machine.rs +14 -12
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +97 -0
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/child_workflow_state_machine.rs +32 -229
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/complete_workflow_state_machine.rs +13 -8
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +6 -50
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/fail_workflow_state_machine.rs +6 -7
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/local_activity_state_machine.rs +39 -584
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/mod.rs +22 -17
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +4 -74
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/nexus_operation_state_machine.rs +118 -21
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +273 -0
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/signal_external_state_machine.rs +9 -151
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/timer_state_machine.rs +27 -132
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/transition_coverage.rs +1 -2
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/update_state_machine.rs +19 -13
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +25 -80
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/workflow_machines/local_acts.rs +1 -1
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/workflow_machines.rs +68 -72
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/machines/workflow_task_state_machine.rs +13 -15
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/managed_run.rs +55 -37
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/mod.rs +171 -61
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/run_cache.rs +10 -7
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/wft_extraction.rs +4 -2
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/wft_poller.rs +15 -4
- package/sdk-core/{core → crates/sdk-core}/src/worker/workflow/workflow_stream.rs +38 -19
- package/sdk-core/crates/sdk-core/tests/c_bridge_smoke_test.c +10 -0
- package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +25 -0
- package/sdk-core/crates/sdk-core/tests/common/fake_grpc_server.rs +106 -0
- package/sdk-core/crates/sdk-core/tests/common/http_proxy.rs +134 -0
- package/sdk-core/{test-utils/src/lib.rs → crates/sdk-core/tests/common/mod.rs} +286 -334
- package/sdk-core/{test-utils/src → crates/sdk-core/tests/common}/workflows.rs +6 -4
- package/sdk-core/crates/sdk-core/tests/fsm_procmacro.rs +6 -0
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/dupe_transitions_fail.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/fsm_trybuild/dupe_transitions_fail.stderr +12 -0
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/dynamic_dest_pass.rs +2 -4
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/forgot_name_fail.rs +1 -3
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/forgot_name_fail.stderr +4 -4
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/handler_arg_pass.rs +2 -4
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/handler_pass.rs +2 -4
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/medium_complex_pass.rs +2 -4
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/no_handle_conversions_require_into_fail.rs +2 -4
- package/sdk-core/crates/sdk-core/tests/fsm_trybuild/no_handle_conversions_require_into_fail.stderr +15 -0
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/simple_pass.rs +2 -4
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/struct_event_variant_fail.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/fsm_trybuild/struct_event_variant_fail.stderr +5 -0
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/tuple_more_item_event_variant_fail.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/fsm_trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
- package/sdk-core/{fsm/rustfsm_procmacro/tests/trybuild → crates/sdk-core/tests/fsm_trybuild}/tuple_zero_item_event_variant_fail.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/fsm_trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/global_metric_tests.rs +22 -22
- package/sdk-core/{tests → crates/sdk-core/tests/heavy_tests}/fuzzy_workflow.rs +4 -4
- package/sdk-core/{tests → crates/sdk-core/tests}/heavy_tests.rs +25 -14
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/activity_functions.rs +1 -1
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/client_tests.rs +115 -123
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/ephemeral_server_tests.rs +19 -15
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/heartbeat_tests.rs +24 -20
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/metrics_tests.rs +241 -67
- package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +273 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +513 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/queries_tests.rs +13 -11
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/update_tests.rs +47 -29
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/visibility_tests.rs +49 -27
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +1061 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +920 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/worker_versioning_tests.rs +58 -40
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/activities.rs +268 -30
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/appdata_propagation.rs +4 -4
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +155 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +121 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +717 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +109 -0
- package/sdk-core/{core/src/core_tests → crates/sdk-core/tests/integ_tests/workflow_tests}/determinism.rs +108 -20
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/eager.rs +10 -5
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +2884 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +119 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/nexus.rs +174 -46
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +740 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/replay.rs +78 -27
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/resets.rs +46 -28
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +294 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/stickyness.rs +9 -8
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +249 -0
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/upsert_search_attrs.rs +72 -7
- package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests.rs +97 -33
- package/sdk-core/{tests → crates/sdk-core/tests}/main.rs +40 -25
- package/sdk-core/{tests → crates/sdk-core/tests}/manual_tests.rs +25 -15
- package/sdk-core/{tests → crates/sdk-core/tests}/runner.rs +23 -41
- package/sdk-core/{tests → crates/sdk-core/tests}/shared_tests/mod.rs +11 -6
- package/sdk-core/{tests → crates/sdk-core/tests}/shared_tests/priority.rs +6 -6
- package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +59 -0
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/include/temporal-sdk-core-c-bridge.h +215 -44
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/client.rs +515 -214
- package/sdk-core/crates/sdk-core-c-bridge/src/envconfig.rs +314 -0
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/lib.rs +2 -1
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/metric.rs +1 -1
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/random.rs +4 -4
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/runtime.rs +42 -28
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/testing.rs +2 -5
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/tests/context.rs +42 -41
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/tests/mod.rs +38 -34
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/tests/utils.rs +10 -11
- package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/src/worker.rs +427 -121
- package/sdk-core/docker-cgroup-tests.sh +24 -0
- package/sdk-core/{docker → etc/docker}/docker-compose-ci.yaml +9 -9
- package/sdk-core/{docker → etc/docker}/docker-compose-telem.yaml +11 -11
- package/sdk-core/{docker → etc/docker}/docker-compose.yaml +8 -8
- package/sdk-core/{integ-with-otel.sh → etc/integ-with-otel.sh} +1 -1
- package/sdk-core/etc/regen-depgraph.sh +2 -2
- package/src/client.rs +117 -49
- package/src/helpers/callbacks.rs +4 -4
- package/src/helpers/errors.rs +7 -1
- package/src/helpers/handles.rs +1 -0
- package/src/helpers/try_from_js.rs +5 -4
- package/src/lib.rs +3 -2
- package/src/logs.rs +1 -1
- package/src/metrics.rs +6 -3
- package/src/runtime.rs +41 -24
- package/src/testing.rs +3 -3
- package/src/worker.rs +77 -44
- package/ts/native.ts +26 -9
- package/LICENSE.md +0 -23
- package/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
- package/sdk-core/client/src/proxy.rs +0 -90
- package/sdk-core/client/src/worker_registry/mod.rs +0 -266
- package/sdk-core/core/Cargo.toml +0 -146
- package/sdk-core/core/src/core_tests/child_workflows.rs +0 -281
- package/sdk-core/core/src/core_tests/local_activities.rs +0 -1442
- package/sdk-core/core/src/retry_logic.rs +0 -224
- package/sdk-core/core/src/worker/heartbeat.rs +0 -231
- package/sdk-core/core/src/worker/mod.rs +0 -980
- package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -165
- package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -801
- package/sdk-core/core-c-bridge/Cargo.toml +0 -51
- package/sdk-core/etc/deps.svg +0 -162
- package/sdk-core/fsm/Cargo.toml +0 -21
- package/sdk-core/fsm/README.md +0 -3
- package/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +0 -27
- package/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +0 -8
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +0 -12
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +0 -15
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +0 -5
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +0 -5
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +0 -5
- package/sdk-core/fsm/rustfsm_trait/Cargo.toml +0 -14
- package/sdk-core/fsm/rustfsm_trait/LICENSE.txt +0 -21
- package/sdk-core/fsm/src/lib.rs +0 -2
- package/sdk-core/sdk-core-protos/Cargo.toml +0 -37
- package/sdk-core/sdk-core-protos/protos/api_cloud_upstream/VERSION +0 -1
- package/sdk-core/test-utils/Cargo.toml +0 -38
- package/sdk-core/test-utils/src/interceptors.rs +0 -46
- package/sdk-core/tests/cloud_tests.rs +0 -23
- package/sdk-core/tests/integ_tests/polling_tests.rs +0 -294
- package/sdk-core/tests/integ_tests/worker_tests.rs +0 -203
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +0 -74
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +0 -57
- package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +0 -246
- package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +0 -65
- package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +0 -85
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +0 -908
- package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +0 -51
- package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +0 -206
- package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +0 -164
- package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +0 -123
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/.github/workflows/build.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/.github/workflows/push-to-buf.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/CODEOWNERS +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/LICENSE +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/Makefile +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/README.md +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/buf.gen.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/buf.lock +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/buf.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/connectivityrule/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/identity/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/namespace/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/nexus/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/region/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/resource/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_cloud_upstream/temporal/api/cloud/usage/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/CODEOWNERS +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/ci.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/publish-docs.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/push-to-buf.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/trigger-api-go-delete-release.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/trigger-api-go-publish-release.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/.github/workflows/trigger-api-go-update.yml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/LICENSE +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/Makefile +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/README.md +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/api-linter.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/buf.gen.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/buf.lock +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/buf.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/api/annotations.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/api/http.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/any.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/descriptor.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/duration.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/empty.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/struct.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/timestamp.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/google/protobuf/wrappers.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/openapi/payload_description.txt +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/activity/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/batch/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/command/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/common.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/deployment.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/event_type.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/nexus.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/enums/v1/workflow.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/export/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/failure/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/history/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/nexus/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/query/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/rules/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/sdk/v1/enhanced_stack_trace.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/sdk/v1/user_metadata.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/sdk/v1/worker_config.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/sdk/v1/workflow_metadata.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/update/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/version/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/worker/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/api_upstream/temporal/api/workflow/v1/message.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/google/rpc/status.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/grpc/health/v1/health.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/activity_result/activity_result.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/activity_task/activity_task.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/common/common.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/core_interface.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/external_data/external_data.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/nexus/nexus.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/testsrv_upstream/Makefile +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/testsrv_upstream/api-linter.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/testsrv_upstream/buf.yaml +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -0
- /package/sdk-core/{sdk-core-protos → crates/common}/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -0
- /package/sdk-core/{sdk-core-protos/src → crates/common/src/protos}/constants.rs +0 -0
- /package/sdk-core/{sdk-core-protos/src → crates/common/src/protos}/task_token.rs +0 -0
- /package/sdk-core/{fsm → crates/macros}/LICENSE.txt +0 -0
- /package/sdk-core/{core → crates/sdk-core}/src/abstractions/take_cell.rs +0 -0
- /package/sdk-core/{core → crates/sdk-core}/src/worker/slot_supplier.rs +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/ends_empty_wft_complete.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/evict_while_la_running_no_interference-16_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/evict_while_la_running_no_interference-23_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/evict_while_la_running_no_interference-85_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/fail_wf_task.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/long_local_activity_with_update-0_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/long_local_activity_with_update-1_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/long_local_activity_with_update-2_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/long_local_activity_with_update-3_history.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/old_change_marker_format.bin +0 -0
- /package/sdk-core/{histories → crates/sdk-core/tests/histories}/timer_workflow_history.bin +0 -0
- /package/sdk-core/{tests → crates/sdk-core/tests}/integ_tests/workflow_tests/priority.rs +0 -0
- /package/sdk-core/{core-c-bridge → crates/sdk-core-c-bridge}/build.rs +0 -0
- /package/sdk-core/{cargo-tokio-console.sh → etc/cargo-tokio-console.sh} +0 -0
|
@@ -28,22 +28,25 @@ use std::{
|
|
|
28
28
|
sync::{Arc, mpsc::Sender},
|
|
29
29
|
time::{Duration, Instant},
|
|
30
30
|
};
|
|
31
|
-
use
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
31
|
+
use temporalio_common::{
|
|
32
|
+
errors::WorkflowErrorType,
|
|
33
|
+
protos::{
|
|
34
|
+
TaskToken,
|
|
35
|
+
coresdk::{
|
|
36
|
+
workflow_activation::{
|
|
37
|
+
WorkflowActivation, create_evict_activation, query_to_job,
|
|
38
|
+
remove_from_cache::EvictionReason, workflow_activation_job,
|
|
39
|
+
},
|
|
40
|
+
workflow_commands::{FailWorkflowExecution, QueryResult},
|
|
41
|
+
workflow_completion,
|
|
42
|
+
},
|
|
43
|
+
temporal::api::{
|
|
44
|
+
command::v1::command::Attributes as CmdAttribs,
|
|
45
|
+
enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
|
|
46
|
+
failure::v1::Failure,
|
|
38
47
|
},
|
|
39
|
-
workflow_commands::{FailWorkflowExecution, QueryResult},
|
|
40
|
-
workflow_completion,
|
|
41
|
-
},
|
|
42
|
-
temporal::api::{
|
|
43
|
-
command::v1::command::Attributes as CmdAttribs,
|
|
44
|
-
enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
|
|
45
|
-
failure::v1::Failure,
|
|
46
48
|
},
|
|
49
|
+
worker::WorkerConfig,
|
|
47
50
|
};
|
|
48
51
|
use tokio::sync::oneshot;
|
|
49
52
|
use tracing::Span;
|
|
@@ -70,7 +73,9 @@ pub(super) struct ManagedRun {
|
|
|
70
73
|
/// pushing things out and then directly back in. The downside is this is the only "impure" part
|
|
71
74
|
/// of the in/out nature of workflow state management. If there's ever a sensible way to lift it
|
|
72
75
|
/// up, that'd be nice.
|
|
73
|
-
|
|
76
|
+
///
|
|
77
|
+
/// This field is `None` when `WorkerTaskTypes.enable_local_activities` is false.
|
|
78
|
+
local_activity_request_sink: Option<Rc<dyn LocalActivityRequestSink>>,
|
|
74
79
|
/// Set if the run is currently waiting on the execution of some local activities.
|
|
75
80
|
waiting_on_la: Option<WaitingOnLAs>,
|
|
76
81
|
/// Is set to true if the machines encounter an error and the only subsequent thing we should
|
|
@@ -105,7 +110,7 @@ impl ManagedRun {
|
|
|
105
110
|
pub(super) fn new(
|
|
106
111
|
basics: RunBasics,
|
|
107
112
|
wft: PermittedWFT,
|
|
108
|
-
local_activity_request_sink: Rc<dyn LocalActivityRequestSink
|
|
113
|
+
local_activity_request_sink: Option<Rc<dyn LocalActivityRequestSink>>,
|
|
109
114
|
) -> (Self, RunUpdateAct) {
|
|
110
115
|
let metrics = basics.metrics.clone();
|
|
111
116
|
let config = basics.worker_config.clone();
|
|
@@ -240,10 +245,10 @@ impl ManagedRun {
|
|
|
240
245
|
let r = self.wfm.get_next_activation()?;
|
|
241
246
|
if r.jobs.is_empty() {
|
|
242
247
|
return Err(RunUpdateErr {
|
|
243
|
-
source:
|
|
248
|
+
source: crate::worker::workflow::fatal!(
|
|
244
249
|
"Machines created for {} with no jobs",
|
|
245
250
|
self.wfm.machines.run_id
|
|
246
|
-
)
|
|
251
|
+
),
|
|
247
252
|
complete_resp_chan: None,
|
|
248
253
|
});
|
|
249
254
|
}
|
|
@@ -261,7 +266,7 @@ impl ManagedRun {
|
|
|
261
266
|
lawait.hb_timeout_handle.abort();
|
|
262
267
|
lawait.hb_timeout_handle = sink_heartbeat_timeout_start(
|
|
263
268
|
self.wfm.machines.run_id.clone(),
|
|
264
|
-
self.local_activity_request_sink.
|
|
269
|
+
self.local_activity_request_sink.as_deref(),
|
|
265
270
|
start_time,
|
|
266
271
|
lawait.wft_timeout,
|
|
267
272
|
);
|
|
@@ -307,9 +312,13 @@ impl ManagedRun {
|
|
|
307
312
|
self.wfm.machines.reset_last_started_id(id);
|
|
308
313
|
}
|
|
309
314
|
// Tell the LA manager that we're done with the WFT
|
|
310
|
-
self.local_activity_request_sink
|
|
311
|
-
|
|
312
|
-
|
|
315
|
+
if let Some(ref local_act_request_sink) = self.local_activity_request_sink {
|
|
316
|
+
local_act_request_sink.sink_reqs(vec![
|
|
317
|
+
LocalActRequest::IndicateWorkflowTaskCompleted(
|
|
318
|
+
self.wfm.machines.run_id.clone(),
|
|
319
|
+
),
|
|
320
|
+
]);
|
|
321
|
+
}
|
|
313
322
|
}
|
|
314
323
|
|
|
315
324
|
retme
|
|
@@ -402,7 +411,7 @@ impl ManagedRun {
|
|
|
402
411
|
}) {
|
|
403
412
|
ActivationCompleteOutcome::ReportWFTFail(FailedActivationWFTReport::Report(
|
|
404
413
|
tt,
|
|
405
|
-
WorkflowTaskFailedCause::
|
|
414
|
+
WorkflowTaskFailedCause::WorkflowWorkerUnhandledFailure,
|
|
406
415
|
Failure::application_failure(reason, true).into(),
|
|
407
416
|
))
|
|
408
417
|
} else {
|
|
@@ -759,7 +768,7 @@ impl ManagedRun {
|
|
|
759
768
|
completion_dat: Some((data, completion.resp_chan)),
|
|
760
769
|
hb_timeout_handle: sink_heartbeat_timeout_start(
|
|
761
770
|
self.run_id().to_string(),
|
|
762
|
-
self.local_activity_request_sink.
|
|
771
|
+
self.local_activity_request_sink.as_deref(),
|
|
763
772
|
start_t,
|
|
764
773
|
wft_timeout,
|
|
765
774
|
),
|
|
@@ -885,7 +894,7 @@ impl ManagedRun {
|
|
|
885
894
|
// We just checked it is some, unwrap OK.
|
|
886
895
|
let c = self.completion_waiting_on_page_fetch.take().unwrap();
|
|
887
896
|
let run_upd = self.failed_completion(
|
|
888
|
-
WorkflowTaskFailedCause::
|
|
897
|
+
WorkflowTaskFailedCause::WorkflowWorkerUnhandledFailure,
|
|
889
898
|
info.reason,
|
|
890
899
|
Failure::application_failure(info.message, false).into(),
|
|
891
900
|
true,
|
|
@@ -1019,7 +1028,7 @@ impl ManagedRun {
|
|
|
1019
1028
|
let fail_cause = if matches!(&fail.source, WFMachinesError::Nondeterminism(_)) {
|
|
1020
1029
|
WorkflowTaskFailedCause::NonDeterministicError
|
|
1021
1030
|
} else {
|
|
1022
|
-
WorkflowTaskFailedCause::
|
|
1031
|
+
WorkflowTaskFailedCause::WorkflowWorkerUnhandledFailure
|
|
1023
1032
|
};
|
|
1024
1033
|
self.failed_completion(
|
|
1025
1034
|
fail_cause,
|
|
@@ -1139,6 +1148,7 @@ impl ManagedRun {
|
|
|
1139
1148
|
}
|
|
1140
1149
|
}
|
|
1141
1150
|
|
|
1151
|
+
let attempt = self.wft.as_ref().map(|t| t.info.attempt).unwrap_or(1);
|
|
1142
1152
|
ActivationCompleteOutcome::ReportWFTSuccess(ServerCommandsWithWorkflowInfo {
|
|
1143
1153
|
task_token: data.task_token,
|
|
1144
1154
|
action: ActivationAction::WftComplete {
|
|
@@ -1148,6 +1158,7 @@ impl ManagedRun {
|
|
|
1148
1158
|
query_responses,
|
|
1149
1159
|
sdk_metadata: machines_wft_response.metadata_for_complete(),
|
|
1150
1160
|
versioning_behavior: data.versioning_behavior,
|
|
1161
|
+
attempt,
|
|
1151
1162
|
},
|
|
1152
1163
|
})
|
|
1153
1164
|
} else {
|
|
@@ -1168,7 +1179,12 @@ impl ManagedRun {
|
|
|
1168
1179
|
&mut self,
|
|
1169
1180
|
new_local_acts: Vec<LocalActRequest>,
|
|
1170
1181
|
) -> Result<(), WFMachinesError> {
|
|
1171
|
-
let immediate_resolutions =
|
|
1182
|
+
let immediate_resolutions =
|
|
1183
|
+
if let Some(ref local_act_request_sink) = self.local_activity_request_sink {
|
|
1184
|
+
local_act_request_sink.sink_reqs(new_local_acts)
|
|
1185
|
+
} else {
|
|
1186
|
+
Vec::new()
|
|
1187
|
+
};
|
|
1172
1188
|
for resolution in immediate_resolutions {
|
|
1173
1189
|
self.wfm
|
|
1174
1190
|
.notify_of_local_result(LocalResolution::LocalActivity(resolution))?;
|
|
@@ -1306,21 +1322,23 @@ fn put_queries_in_act(act: &mut WorkflowActivation, wft: &mut OutstandingTask) {
|
|
|
1306
1322
|
}
|
|
1307
1323
|
fn sink_heartbeat_timeout_start(
|
|
1308
1324
|
run_id: String,
|
|
1309
|
-
sink:
|
|
1325
|
+
sink: Option<&dyn LocalActivityRequestSink>,
|
|
1310
1326
|
wft_start_time: Instant,
|
|
1311
1327
|
wft_timeout: Duration,
|
|
1312
1328
|
) -> AbortHandle {
|
|
1313
1329
|
// The heartbeat deadline is 80% of the WFT timeout
|
|
1314
1330
|
let deadline = wft_start_time.add(wft_timeout.mul_f32(WFT_HEARTBEAT_TIMEOUT_FRACTION));
|
|
1315
1331
|
let (abort_handle, abort_reg) = AbortHandle::new_pair();
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1332
|
+
if let Some(la_sink) = sink {
|
|
1333
|
+
la_sink.sink_reqs(vec![LocalActRequest::StartHeartbeatTimeout {
|
|
1334
|
+
send_on_elapse: HeartbeatTimeoutMsg {
|
|
1335
|
+
run_id,
|
|
1336
|
+
span: Span::current(),
|
|
1337
|
+
},
|
|
1338
|
+
deadline,
|
|
1339
|
+
abort_reg,
|
|
1340
|
+
}]);
|
|
1341
|
+
}
|
|
1324
1342
|
abort_handle
|
|
1325
1343
|
}
|
|
1326
1344
|
|
|
@@ -1606,7 +1624,7 @@ mod tests {
|
|
|
1606
1624
|
}
|
|
1607
1625
|
|
|
1608
1626
|
mod command_utils {
|
|
1609
|
-
use
|
|
1627
|
+
use temporalio_common::protos::coresdk::workflow_commands::{
|
|
1610
1628
|
CancelWorkflowExecution, CompleteWorkflowExecution, QueryResult, UpdateResponse,
|
|
1611
1629
|
};
|
|
1612
1630
|
|
|
@@ -23,7 +23,11 @@ use crate::{
|
|
|
23
23
|
internal_flags::InternalFlags,
|
|
24
24
|
pollers::TrackedPermittedTqResp,
|
|
25
25
|
protosext::{ValidPollWFTQResponse, protocol_messages::IncomingProtocolMessage},
|
|
26
|
-
telemetry::{
|
|
26
|
+
telemetry::{
|
|
27
|
+
VecDisplayer,
|
|
28
|
+
metrics::{self, FailureReason},
|
|
29
|
+
set_trace_subscriber_for_current_thread,
|
|
30
|
+
},
|
|
27
31
|
worker::{
|
|
28
32
|
LocalActRequest, LocalActivityExecutionResult, LocalActivityResolution,
|
|
29
33
|
PostActivateHookData,
|
|
@@ -31,6 +35,7 @@ use crate::{
|
|
|
31
35
|
client::{LegacyQueryResult, WorkerClient, WorkflowTaskCompletion},
|
|
32
36
|
workflow::{
|
|
33
37
|
history_update::HistoryPaginator,
|
|
38
|
+
machines::MachineError,
|
|
34
39
|
managed_run::RunUpdateAct,
|
|
35
40
|
wft_extraction::{HistoryFetchReq, WFTExtractor, WFTStreamIn},
|
|
36
41
|
wft_poller::validate_wft,
|
|
@@ -42,7 +47,6 @@ use anyhow::anyhow;
|
|
|
42
47
|
use futures_util::{Stream, StreamExt, future::abortable, stream, stream::BoxStream};
|
|
43
48
|
use itertools::Itertools;
|
|
44
49
|
use prost_types::TimestampError;
|
|
45
|
-
use rustfsm::MachineError;
|
|
46
50
|
use std::{
|
|
47
51
|
cell::RefCell,
|
|
48
52
|
collections::VecDeque,
|
|
@@ -55,35 +59,36 @@ use std::{
|
|
|
55
59
|
thread,
|
|
56
60
|
time::{Duration, Instant},
|
|
57
61
|
};
|
|
58
|
-
use
|
|
59
|
-
use
|
|
62
|
+
use temporalio_client::MESSAGE_TOO_LARGE_KEY;
|
|
63
|
+
use temporalio_common::{
|
|
60
64
|
errors::{CompleteWfError, PollError},
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
protos::{
|
|
66
|
+
TaskToken,
|
|
67
|
+
coresdk::{
|
|
68
|
+
workflow_activation::{
|
|
69
|
+
QueryWorkflow, WorkflowActivation, WorkflowActivationJob,
|
|
70
|
+
remove_from_cache::EvictionReason, workflow_activation_job,
|
|
71
|
+
},
|
|
72
|
+
workflow_commands::*,
|
|
73
|
+
workflow_completion::{
|
|
74
|
+
self, Failure, WorkflowActivationCompletion, workflow_activation_completion,
|
|
75
|
+
},
|
|
69
76
|
},
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
77
|
+
temporal::api::{
|
|
78
|
+
command::v1::{Command as ProtoCommand, Command, command::Attributes},
|
|
79
|
+
common::v1::{
|
|
80
|
+
Memo, MeteringMetadata, RetryPolicy, SearchAttributes, WorkflowExecution,
|
|
81
|
+
},
|
|
82
|
+
enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
|
|
83
|
+
failure::v1::{ApplicationFailureInfo, failure::FailureInfo},
|
|
84
|
+
protocol::v1::Message as ProtocolMessage,
|
|
85
|
+
query::v1::WorkflowQuery,
|
|
86
|
+
sdk::v1::{UserMetadata, WorkflowTaskCompletedMetadata},
|
|
87
|
+
taskqueue::v1::StickyExecutionAttributes,
|
|
88
|
+
workflowservice::v1::{PollActivityTaskQueueResponse, get_system_info_response},
|
|
74
89
|
},
|
|
75
90
|
},
|
|
76
|
-
|
|
77
|
-
command::v1::{Command as ProtoCommand, Command, command::Attributes},
|
|
78
|
-
common::v1::{Memo, MeteringMetadata, RetryPolicy, SearchAttributes, WorkflowExecution},
|
|
79
|
-
enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
|
|
80
|
-
failure::v1::{ApplicationFailureInfo, failure::FailureInfo},
|
|
81
|
-
protocol::v1::Message as ProtocolMessage,
|
|
82
|
-
query::v1::WorkflowQuery,
|
|
83
|
-
sdk::v1::{UserMetadata, WorkflowTaskCompletedMetadata},
|
|
84
|
-
taskqueue::v1::StickyExecutionAttributes,
|
|
85
|
-
workflowservice::v1::{PollActivityTaskQueueResponse, get_system_info_response},
|
|
86
|
-
},
|
|
91
|
+
worker::{ActivitySlotKind, WorkerConfig, WorkflowSlotKind},
|
|
87
92
|
};
|
|
88
93
|
use tokio::{
|
|
89
94
|
sync::{
|
|
@@ -93,10 +98,15 @@ use tokio::{
|
|
|
93
98
|
task::{LocalSet, spawn_blocking},
|
|
94
99
|
};
|
|
95
100
|
use tokio_stream::wrappers::UnboundedReceiverStream;
|
|
101
|
+
use tokio_util::either::Either;
|
|
96
102
|
use tokio_util::sync::CancellationToken;
|
|
97
|
-
use tracing::Span;
|
|
103
|
+
use tracing::{Span, Subscriber};
|
|
98
104
|
|
|
99
|
-
|
|
105
|
+
/// Id used by server for "legacy" queries. IE: Queries that come in the `query` rather than
|
|
106
|
+
/// `queries` field of a WFT, and are responded to on the separate `respond_query_task_completed`
|
|
107
|
+
/// rpc.
|
|
108
|
+
#[allow(unreachable_pub)] // re-exported in supermodule
|
|
109
|
+
pub const LEGACY_QUERY_ID: &str = "legacy_query";
|
|
100
110
|
/// What percentage of a WFT timeout we are willing to wait before sending a WFT heartbeat when
|
|
101
111
|
/// necessary.
|
|
102
112
|
const WFT_HEARTBEAT_TIMEOUT_FRACTION: f32 = 0.8;
|
|
@@ -124,9 +134,10 @@ pub(crate) struct Workflows {
|
|
|
124
134
|
activity_tasks_handle: Option<ActivitiesFromWFTsHandle>,
|
|
125
135
|
/// Ensures we stay at or below this worker's maximum concurrent workflow task limit
|
|
126
136
|
wft_semaphore: MeteredPermitDealer<WorkflowSlotKind>,
|
|
127
|
-
local_act_mgr: Arc<LocalActivityManager
|
|
137
|
+
local_act_mgr: Option<Arc<LocalActivityManager>>,
|
|
128
138
|
ever_polled: AtomicBool,
|
|
129
139
|
default_versioning_behavior: Option<VersioningBehavior>,
|
|
140
|
+
metrics: MetricsContext,
|
|
130
141
|
}
|
|
131
142
|
|
|
132
143
|
pub(crate) struct WorkflowBasics {
|
|
@@ -159,16 +170,17 @@ impl Workflows {
|
|
|
159
170
|
client: Arc<dyn WorkerClient>,
|
|
160
171
|
wft_semaphore: MeteredPermitDealer<WorkflowSlotKind>,
|
|
161
172
|
wft_stream: impl Stream<Item = WFTStreamIn> + Send + 'static,
|
|
162
|
-
local_activity_request_sink: impl LocalActivityRequestSink
|
|
163
|
-
local_act_mgr: Arc<LocalActivityManager
|
|
164
|
-
heartbeat_timeout_rx: UnboundedReceiver<HeartbeatTimeoutMsg
|
|
173
|
+
local_activity_request_sink: Option<impl LocalActivityRequestSink>,
|
|
174
|
+
local_act_mgr: Option<Arc<LocalActivityManager>>,
|
|
175
|
+
heartbeat_timeout_rx: Option<UnboundedReceiver<HeartbeatTimeoutMsg>>,
|
|
165
176
|
activity_tasks_handle: Option<ActivitiesFromWFTsHandle>,
|
|
166
|
-
|
|
177
|
+
tracing_sub: Option<Arc<dyn Subscriber + Send + Sync>>,
|
|
167
178
|
) -> Self {
|
|
168
179
|
let (local_tx, local_rx) = unbounded_channel();
|
|
169
180
|
let (fetch_tx, fetch_rx) = unbounded_channel();
|
|
170
181
|
let shutdown_tok = basics.shutdown_token.clone();
|
|
171
182
|
let task_queue = basics.worker_config.task_queue.clone();
|
|
183
|
+
let metrics = basics.metrics.clone();
|
|
172
184
|
let default_versioning_behavior = basics.default_versioning_behavior;
|
|
173
185
|
let extracted_wft_stream = WFTExtractor::build(
|
|
174
186
|
client.clone(),
|
|
@@ -176,15 +188,18 @@ impl Workflows {
|
|
|
176
188
|
wft_stream,
|
|
177
189
|
UnboundedReceiverStream::new(fetch_rx),
|
|
178
190
|
);
|
|
179
|
-
let locals_stream =
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
191
|
+
let locals_stream = if let Some(hb_rx) = heartbeat_timeout_rx {
|
|
192
|
+
Either::Left(stream::select(
|
|
193
|
+
UnboundedReceiverStream::new(local_rx),
|
|
194
|
+
UnboundedReceiverStream::new(hb_rx).map(Into::into),
|
|
195
|
+
))
|
|
196
|
+
} else {
|
|
197
|
+
Either::Right(UnboundedReceiverStream::new(local_rx))
|
|
198
|
+
};
|
|
183
199
|
let (activation_tx, activation_rx) = unbounded_channel();
|
|
184
200
|
let (start_polling_tx, start_polling_rx) = oneshot::channel();
|
|
185
201
|
// We must spawn a task to constantly poll the activation stream, because otherwise
|
|
186
202
|
// activation completions would not cause anything to happen until the next poll.
|
|
187
|
-
let tracing_sub = telem_instance.and_then(|ti| ti.trace_subscriber());
|
|
188
203
|
let processing_task = thread::Builder::new()
|
|
189
204
|
.name("workflow-processing".to_string())
|
|
190
205
|
.spawn(move || {
|
|
@@ -197,13 +212,6 @@ impl Workflows {
|
|
|
197
212
|
.unwrap();
|
|
198
213
|
let local = LocalSet::new();
|
|
199
214
|
local.block_on(&rt, async move {
|
|
200
|
-
let mut stream = WFStream::build(
|
|
201
|
-
basics,
|
|
202
|
-
extracted_wft_stream,
|
|
203
|
-
locals_stream,
|
|
204
|
-
local_activity_request_sink,
|
|
205
|
-
);
|
|
206
|
-
|
|
207
215
|
// However, we want to avoid plowing ahead until we've been asked to poll at
|
|
208
216
|
// least once. This supports activity-only workers.
|
|
209
217
|
let do_poll = tokio::select! {
|
|
@@ -217,6 +225,14 @@ impl Workflows {
|
|
|
217
225
|
if !do_poll {
|
|
218
226
|
return;
|
|
219
227
|
}
|
|
228
|
+
|
|
229
|
+
let mut stream = WFStream::build(
|
|
230
|
+
basics,
|
|
231
|
+
extracted_wft_stream,
|
|
232
|
+
locals_stream,
|
|
233
|
+
local_activity_request_sink,
|
|
234
|
+
);
|
|
235
|
+
|
|
220
236
|
while let Some(output) = stream.next().await {
|
|
221
237
|
match output {
|
|
222
238
|
Ok(o) => {
|
|
@@ -256,6 +272,7 @@ impl Workflows {
|
|
|
256
272
|
local_act_mgr,
|
|
257
273
|
ever_polled: AtomicBool::new(false),
|
|
258
274
|
default_versioning_behavior,
|
|
275
|
+
metrics,
|
|
259
276
|
}
|
|
260
277
|
}
|
|
261
278
|
|
|
@@ -336,18 +353,25 @@ impl Workflows {
|
|
|
336
353
|
force_new_wft,
|
|
337
354
|
sdk_metadata,
|
|
338
355
|
mut versioning_behavior,
|
|
356
|
+
attempt,
|
|
339
357
|
},
|
|
340
358
|
} => {
|
|
341
359
|
let reserved_act_permits =
|
|
342
360
|
self.reserve_activity_slots_for_outgoing_commands(commands.as_mut_slice());
|
|
343
361
|
debug!(commands=%commands.display(), query_responses=%query_responses.display(),
|
|
344
|
-
|
|
345
|
-
|
|
362
|
+
messages=%messages.display(), force_new_wft,
|
|
363
|
+
"Sending responses to server");
|
|
346
364
|
if let Some(default_vb) = self.default_versioning_behavior.as_ref()
|
|
347
365
|
&& versioning_behavior == VersioningBehavior::Unspecified
|
|
348
366
|
{
|
|
349
367
|
versioning_behavior = *default_vb;
|
|
350
368
|
}
|
|
369
|
+
let nonfirst_local_activity_execution_attempts =
|
|
370
|
+
if let Some(ref la_mgr) = self.local_act_mgr {
|
|
371
|
+
la_mgr.get_nonfirst_attempt_count(run_id) as u32
|
|
372
|
+
} else {
|
|
373
|
+
0
|
|
374
|
+
};
|
|
351
375
|
let mut completion = WorkflowTaskCompletion {
|
|
352
376
|
task_token: task_token.clone(),
|
|
353
377
|
commands,
|
|
@@ -358,10 +382,7 @@ impl Workflows {
|
|
|
358
382
|
force_create_new_workflow_task: force_new_wft,
|
|
359
383
|
sdk_metadata,
|
|
360
384
|
metering_metadata: MeteringMetadata {
|
|
361
|
-
nonfirst_local_activity_execution_attempts
|
|
362
|
-
.local_act_mgr
|
|
363
|
-
.get_nonfirst_attempt_count(run_id)
|
|
364
|
-
as u32,
|
|
385
|
+
nonfirst_local_activity_execution_attempts,
|
|
365
386
|
},
|
|
366
387
|
versioning_behavior,
|
|
367
388
|
};
|
|
@@ -388,10 +409,14 @@ impl Workflows {
|
|
|
388
409
|
response.activity_tasks,
|
|
389
410
|
);
|
|
390
411
|
}
|
|
391
|
-
|
|
412
|
+
// Reply with a task failure if we got grpc too large from server, but
|
|
413
|
+
// not if this is a nonfirst attempt to avoid spamming.
|
|
414
|
+
Err(e)
|
|
415
|
+
if e.metadata().contains_key(MESSAGE_TOO_LARGE_KEY) && attempt < 2 =>
|
|
416
|
+
{
|
|
392
417
|
let failure = Failure {
|
|
393
418
|
failure: Some(
|
|
394
|
-
|
|
419
|
+
temporalio_common::protos::temporal::api::failure::v1::Failure {
|
|
395
420
|
message: "GRPC Message too large".to_string(),
|
|
396
421
|
failure_info: Some(FailureInfo::ApplicationFailureInfo(
|
|
397
422
|
ApplicationFailureInfo {
|
|
@@ -412,6 +437,12 @@ impl Workflows {
|
|
|
412
437
|
);
|
|
413
438
|
self.handle_activation_failed(run_id, completion_time, new_outcome)
|
|
414
439
|
.await;
|
|
440
|
+
self.metrics
|
|
441
|
+
.with_new_attrs([metrics::failure_reason(
|
|
442
|
+
FailureReason::GrpcMessageTooLarge,
|
|
443
|
+
)])
|
|
444
|
+
.wf_task_failed();
|
|
445
|
+
return Err(e);
|
|
415
446
|
}
|
|
416
447
|
e => {
|
|
417
448
|
e?;
|
|
@@ -614,6 +645,12 @@ impl Workflows {
|
|
|
614
645
|
rx
|
|
615
646
|
}
|
|
616
647
|
|
|
648
|
+
/// Send a `BumpStream` message to the workflow stream. This ensures that any pending
|
|
649
|
+
/// workflow activation polls will resolve, like during shutdown, even if there are no other inputs.
|
|
650
|
+
pub(super) fn bump_stream(&self) {
|
|
651
|
+
self.send_local(LocalInputs::BumpStream);
|
|
652
|
+
}
|
|
653
|
+
|
|
617
654
|
/// Query the state of workflow management. Can return `None` if workflow state is shut down.
|
|
618
655
|
pub(super) fn get_state_info(&self) -> impl Future<Output = Option<WorkflowStateInfo>> {
|
|
619
656
|
let rx = self.send_get_state_info_msg();
|
|
@@ -636,7 +673,7 @@ impl Workflows {
|
|
|
636
673
|
let mut interval = tokio::time::interval(Duration::from_millis(10));
|
|
637
674
|
loop {
|
|
638
675
|
interval.tick().await;
|
|
639
|
-
|
|
676
|
+
self.bump_stream();
|
|
640
677
|
}
|
|
641
678
|
});
|
|
642
679
|
let (_, jh_res) = tokio::join!(
|
|
@@ -699,7 +736,7 @@ impl Workflows {
|
|
|
699
736
|
fn send_local(&self, msg: impl Into<LocalInputs>) -> bool {
|
|
700
737
|
let msg = msg.into();
|
|
701
738
|
let print_err = match &msg {
|
|
702
|
-
LocalInputs::GetStateInfo(_) => false,
|
|
739
|
+
LocalInputs::GetStateInfo(_) | LocalInputs::BumpStream => false,
|
|
703
740
|
LocalInputs::LocalResolution(lr) if lr.res.is_la_cancel_confirmation() => false,
|
|
704
741
|
_ => true,
|
|
705
742
|
};
|
|
@@ -987,6 +1024,7 @@ pub(crate) enum ActivationAction {
|
|
|
987
1024
|
force_new_wft: bool,
|
|
988
1025
|
sdk_metadata: WorkflowTaskCompletedMetadata,
|
|
989
1026
|
versioning_behavior: VersioningBehavior,
|
|
1027
|
+
attempt: u32,
|
|
990
1028
|
},
|
|
991
1029
|
/// We should respond to a legacy query request
|
|
992
1030
|
RespondLegacyQuery { result: Box<QueryResult> },
|
|
@@ -1414,7 +1452,79 @@ pub(crate) enum WFMachinesError {
|
|
|
1414
1452
|
Fatal(String),
|
|
1415
1453
|
}
|
|
1416
1454
|
|
|
1455
|
+
/// Helper macro to create Nondeterminism errors with automatic assertion
|
|
1456
|
+
///
|
|
1457
|
+
/// Usage: `nondeterminism!("Activity id mismatch: {} vs {}", id1, id2)`
|
|
1458
|
+
macro_rules! nondeterminism {
|
|
1459
|
+
($($arg:tt)*) => {{
|
|
1460
|
+
let msg = format!($($arg)*);
|
|
1461
|
+
#[cfg(feature = "antithesis_assertions")]
|
|
1462
|
+
$crate::antithesis::assert_unreachable!(
|
|
1463
|
+
"Nondeterminism error detected",
|
|
1464
|
+
::serde_json::json!({
|
|
1465
|
+
"error_message": &msg,
|
|
1466
|
+
"error_type": "Nondeterminism",
|
|
1467
|
+
"location": format!("{}:{}", file!(), line!())
|
|
1468
|
+
})
|
|
1469
|
+
);
|
|
1470
|
+
WFMachinesError::Nondeterminism(msg)
|
|
1471
|
+
}};
|
|
1472
|
+
}
|
|
1473
|
+
pub(crate) use nondeterminism;
|
|
1474
|
+
|
|
1475
|
+
/// Helper macro to create Fatal errors with automatic assertion
|
|
1476
|
+
///
|
|
1477
|
+
/// Usage: `fatal!("Invalid state transition: {:?}", state)`
|
|
1478
|
+
macro_rules! fatal {
|
|
1479
|
+
($($arg:tt)*) => {{
|
|
1480
|
+
let msg = format!($($arg)*);
|
|
1481
|
+
#[cfg(feature = "antithesis_assertions")]
|
|
1482
|
+
$crate::antithesis::assert_unreachable!(
|
|
1483
|
+
"Fatal error detected",
|
|
1484
|
+
::serde_json::json!({
|
|
1485
|
+
"error_message": &msg,
|
|
1486
|
+
"error_type": "Fatal",
|
|
1487
|
+
"location": format!("{}:{}", file!(), line!())
|
|
1488
|
+
})
|
|
1489
|
+
);
|
|
1490
|
+
WFMachinesError::Fatal(msg)
|
|
1491
|
+
}};
|
|
1492
|
+
}
|
|
1493
|
+
pub(crate) use fatal;
|
|
1494
|
+
|
|
1417
1495
|
impl WFMachinesError {
|
|
1496
|
+
/// Create a new Nondeterminism error with assertion instrumentation
|
|
1497
|
+
pub(crate) fn nondeterminism(message: impl Into<String>) -> Self {
|
|
1498
|
+
let msg = message.into();
|
|
1499
|
+
|
|
1500
|
+
#[cfg(feature = "antithesis_assertions")]
|
|
1501
|
+
crate::antithesis::assert_unreachable!(
|
|
1502
|
+
"Nondeterminism error detected",
|
|
1503
|
+
::serde_json::json!({
|
|
1504
|
+
"error_message": msg,
|
|
1505
|
+
"error_type": "Nondeterminism"
|
|
1506
|
+
})
|
|
1507
|
+
);
|
|
1508
|
+
|
|
1509
|
+
WFMachinesError::Nondeterminism(msg)
|
|
1510
|
+
}
|
|
1511
|
+
|
|
1512
|
+
/// Create a new Fatal error with assertion instrumentation
|
|
1513
|
+
pub(crate) fn fatal(message: impl Into<String>) -> Self {
|
|
1514
|
+
let msg = message.into();
|
|
1515
|
+
|
|
1516
|
+
#[cfg(feature = "antithesis_assertions")]
|
|
1517
|
+
crate::antithesis::assert_unreachable!(
|
|
1518
|
+
"Fatal error detected",
|
|
1519
|
+
::serde_json::json!({
|
|
1520
|
+
"error_message": msg,
|
|
1521
|
+
"error_type": "Fatal"
|
|
1522
|
+
})
|
|
1523
|
+
);
|
|
1524
|
+
|
|
1525
|
+
WFMachinesError::Fatal(msg)
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1418
1528
|
fn evict_reason(&self) -> EvictionReason {
|
|
1419
1529
|
match self {
|
|
1420
1530
|
WFMachinesError::Nondeterminism(_) => EvictionReason::Nondeterminism,
|
|
@@ -1425,7 +1535,7 @@ impl WFMachinesError {
|
|
|
1425
1535
|
fn as_failure(&self) -> Failure {
|
|
1426
1536
|
Failure {
|
|
1427
1537
|
failure: Some(
|
|
1428
|
-
|
|
1538
|
+
temporalio_common::protos::temporal::api::failure::v1::Failure::application_failure(
|
|
1429
1539
|
self.to_string(),
|
|
1430
1540
|
false,
|
|
1431
1541
|
),
|
|
@@ -1440,7 +1550,7 @@ impl From<MachineError<WFMachinesError>> for WFMachinesError {
|
|
|
1440
1550
|
match v {
|
|
1441
1551
|
MachineError::InvalidTransition => {
|
|
1442
1552
|
// TODO: Get states back
|
|
1443
|
-
WFMachinesError::
|
|
1553
|
+
WFMachinesError::nondeterminism("Invalid transition in state machine")
|
|
1444
1554
|
}
|
|
1445
1555
|
MachineError::Underlying(e) => e,
|
|
1446
1556
|
}
|
|
@@ -1449,13 +1559,13 @@ impl From<MachineError<WFMachinesError>> for WFMachinesError {
|
|
|
1449
1559
|
|
|
1450
1560
|
impl From<TimestampError> for WFMachinesError {
|
|
1451
1561
|
fn from(_: TimestampError) -> Self {
|
|
1452
|
-
Self::
|
|
1562
|
+
Self::fatal("Could not decode timestamp")
|
|
1453
1563
|
}
|
|
1454
1564
|
}
|
|
1455
1565
|
|
|
1456
1566
|
impl From<anyhow::Error> for WFMachinesError {
|
|
1457
1567
|
fn from(value: anyhow::Error) -> Self {
|
|
1458
|
-
WFMachinesError::
|
|
1568
|
+
WFMachinesError::fatal(value.to_string())
|
|
1459
1569
|
}
|
|
1460
1570
|
}
|
|
1461
1571
|
|
|
@@ -1543,7 +1653,7 @@ fn prepare_to_ship_activation(wfa: &mut WorkflowActivation) {
|
|
|
1543
1653
|
mod tests {
|
|
1544
1654
|
use super::*;
|
|
1545
1655
|
use itertools::Itertools;
|
|
1546
|
-
use
|
|
1656
|
+
use temporalio_common::protos::coresdk::workflow_activation::SignalWorkflow;
|
|
1547
1657
|
|
|
1548
1658
|
#[test]
|
|
1549
1659
|
fn jobs_sort() {
|
|
@@ -8,10 +8,12 @@ use crate::{
|
|
|
8
8
|
};
|
|
9
9
|
use lru::LruCache;
|
|
10
10
|
use std::{num::NonZeroUsize, rc::Rc, sync::Arc};
|
|
11
|
-
use
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
use temporalio_common::{
|
|
12
|
+
protos::{
|
|
13
|
+
coresdk::workflow_activation::remove_from_cache::EvictionReason,
|
|
14
|
+
temporal::api::workflowservice::v1::get_system_info_response,
|
|
15
|
+
},
|
|
16
|
+
worker::WorkerConfig,
|
|
15
17
|
};
|
|
16
18
|
|
|
17
19
|
pub(super) struct RunCache {
|
|
@@ -20,7 +22,7 @@ pub(super) struct RunCache {
|
|
|
20
22
|
server_capabilities: get_system_info_response::Capabilities,
|
|
21
23
|
/// Run id -> Data
|
|
22
24
|
runs: LruCache<String, ManagedRun>,
|
|
23
|
-
local_activity_request_sink: Rc<dyn LocalActivityRequestSink
|
|
25
|
+
local_activity_request_sink: Option<Rc<dyn LocalActivityRequestSink>>,
|
|
24
26
|
|
|
25
27
|
metrics: MetricsContext,
|
|
26
28
|
}
|
|
@@ -30,7 +32,7 @@ impl RunCache {
|
|
|
30
32
|
worker_config: Arc<WorkerConfig>,
|
|
31
33
|
sdk_name_and_version: (String, String),
|
|
32
34
|
server_capabilities: get_system_info_response::Capabilities,
|
|
33
|
-
local_activity_request_sink: impl LocalActivityRequestSink
|
|
35
|
+
local_activity_request_sink: Option<impl LocalActivityRequestSink>,
|
|
34
36
|
metrics: MetricsContext,
|
|
35
37
|
) -> Self {
|
|
36
38
|
// The cache needs room for at least one run, otherwise we couldn't do anything. In
|
|
@@ -47,7 +49,8 @@ impl RunCache {
|
|
|
47
49
|
runs: LruCache::new(
|
|
48
50
|
NonZeroUsize::new(lru_size).expect("LRU size is guaranteed positive"),
|
|
49
51
|
),
|
|
50
|
-
local_activity_request_sink:
|
|
52
|
+
local_activity_request_sink: local_activity_request_sink
|
|
53
|
+
.map(|s| Rc::new(s) as Rc<dyn LocalActivityRequestSink>),
|
|
51
54
|
metrics,
|
|
52
55
|
}
|
|
53
56
|
}
|