@temporalio/core-bridge 1.15.0 → 1.16.1
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 +172 -70
- package/lib/native.d.ts +1 -1
- package/package.json +2 -2
- 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/.github/workflows/per-pr.yml +6 -6
- package/sdk-core/AGENTS.md +41 -30
- package/sdk-core/Cargo.toml +3 -0
- package/sdk-core/README.md +15 -9
- package/sdk-core/crates/client/Cargo.toml +4 -0
- package/sdk-core/crates/client/README.md +139 -0
- package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
- package/sdk-core/crates/client/src/callback_based.rs +7 -0
- package/sdk-core/crates/client/src/errors.rs +294 -0
- package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +280 -159
- package/sdk-core/crates/client/src/lib.rs +920 -1326
- package/sdk-core/crates/client/src/metrics.rs +24 -33
- package/sdk-core/crates/client/src/options_structs.rs +457 -0
- package/sdk-core/crates/client/src/replaceable.rs +5 -4
- package/sdk-core/crates/client/src/request_extensions.rs +8 -9
- package/sdk-core/crates/client/src/retry.rs +99 -54
- package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +1 -1
- package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
- package/sdk-core/crates/common/Cargo.toml +61 -2
- package/sdk-core/crates/common/build.rs +742 -12
- package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
- package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
- package/sdk-core/crates/common/protos/api_upstream/buf.yaml +0 -3
- package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +1166 -770
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +1243 -750
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +2 -2
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -3
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +16 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +64 -6
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +88 -33
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +4 -2
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +5 -5
- package/sdk-core/crates/common/src/activity_definition.rs +20 -0
- package/sdk-core/crates/common/src/data_converters.rs +770 -0
- package/sdk-core/crates/common/src/envconfig.rs +5 -0
- package/sdk-core/crates/common/src/lib.rs +15 -211
- package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
- package/sdk-core/crates/common/src/priority.rs +110 -0
- package/sdk-core/crates/common/src/protos/canned_histories.rs +3 -0
- package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
- package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
- package/sdk-core/crates/common/src/protos/mod.rs +122 -27
- package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
- package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +5 -7
- package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
- package/sdk-core/crates/common/src/telemetry/metrics.rs +268 -223
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
- package/sdk-core/crates/common/src/telemetry.rs +264 -4
- package/sdk-core/crates/common/src/worker.rs +68 -603
- package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
- package/sdk-core/crates/macros/Cargo.toml +5 -1
- package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
- package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
- package/sdk-core/crates/macros/src/lib.rs +138 -512
- package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
- package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
- package/sdk-core/crates/sdk/Cargo.toml +19 -6
- package/sdk-core/crates/sdk/README.md +415 -0
- package/sdk-core/crates/sdk/src/activities.rs +417 -0
- package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
- package/sdk-core/crates/sdk/src/lib.rs +757 -442
- package/sdk-core/crates/sdk/src/workflow_context/options.rs +45 -35
- package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
- package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
- package/sdk-core/crates/sdk/src/workflows.rs +711 -0
- package/sdk-core/crates/sdk-core/Cargo.toml +57 -64
- package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +41 -35
- package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
- package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
- package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
- package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +13 -15
- package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
- package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
- package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
- package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +493 -26
- package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +4 -8
- package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +7 -7
- package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
- package/sdk-core/crates/sdk-core/src/lib.rs +41 -111
- package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
- package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +118 -19
- package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
- package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
- package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +179 -196
- package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -280
- package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +6 -9
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
- package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
- package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
- package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +9 -5
- package/sdk-core/crates/sdk-core/src/worker/client.rs +103 -81
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +7 -11
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1124 -229
- package/sdk-core/crates/sdk-core/src/worker/nexus.rs +145 -23
- package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
- package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
- package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +13 -13
- package/sdk-core/crates/sdk-core/src/worker/tuner.rs +28 -8
- package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +19 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +14 -18
- package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +4 -6
- package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
- package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
- package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
- package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
- package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
- package/sdk-core/crates/sdk-core/tests/common/mod.rs +241 -196
- package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
- package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +3 -5
- package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -64
- package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +298 -252
- package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
- package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +16 -12
- package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +48 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +327 -255
- package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
- package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +147 -126
- package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
- package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -453
- package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +360 -231
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +248 -185
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -43
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +428 -315
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -56
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -28
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -243
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +101 -42
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -147
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -28
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1036
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -41
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +397 -238
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +414 -189
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +154 -137
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -105
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -38
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -54
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +363 -226
- package/sdk-core/crates/sdk-core/tests/main.rs +17 -15
- package/sdk-core/crates/sdk-core/tests/manual_tests.rs +207 -152
- package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +65 -34
- package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
- package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +7 -1
- package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +14 -14
- package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +83 -74
- package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +9 -14
- package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +1 -2
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +13 -13
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +6 -6
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +3 -4
- package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +62 -75
- package/sdk-core/rustfmt.toml +2 -1
- package/src/client.rs +205 -318
- package/src/metrics.rs +22 -30
- package/src/runtime.rs +4 -5
- package/src/worker.rs +16 -19
- package/ts/native.ts +1 -1
- package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
- package/sdk-core/crates/common/src/errors.rs +0 -85
- package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
- package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
- package/sdk-core/crates/sdk/src/app_data.rs +0 -37
- package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
mod activities;
|
|
2
|
-
mod appdata_propagation;
|
|
3
2
|
mod cancel_external;
|
|
4
3
|
mod cancel_wf;
|
|
5
4
|
mod child_workflows;
|
|
5
|
+
mod client_interactions;
|
|
6
6
|
mod continue_as_new;
|
|
7
7
|
mod determinism;
|
|
8
8
|
mod eager;
|
|
@@ -11,6 +11,7 @@ mod modify_wf_properties;
|
|
|
11
11
|
mod nexus;
|
|
12
12
|
mod patches;
|
|
13
13
|
mod priority;
|
|
14
|
+
mod queries;
|
|
14
15
|
mod replay;
|
|
15
16
|
mod resets;
|
|
16
17
|
mod signals;
|
|
@@ -20,26 +21,30 @@ mod upsert_search_attrs;
|
|
|
20
21
|
|
|
21
22
|
use crate::{
|
|
22
23
|
common::{
|
|
23
|
-
CoreWfStarter,
|
|
24
|
-
init_core_and_create_wf, init_core_replay_preloaded,
|
|
24
|
+
CoreWfStarter, activity_functions::StdActivities, get_integ_runtime_options,
|
|
25
|
+
history_from_proto_binary, init_core_and_create_wf, init_core_replay_preloaded,
|
|
26
|
+
mock_sdk_cfg, prom_metrics,
|
|
25
27
|
},
|
|
26
|
-
integ_tests::
|
|
28
|
+
integ_tests::metrics_tests,
|
|
27
29
|
};
|
|
28
30
|
use assert_matches::assert_matches;
|
|
29
31
|
use std::{
|
|
30
32
|
collections::{HashMap, HashSet},
|
|
33
|
+
sync::Arc,
|
|
31
34
|
time::Duration,
|
|
32
35
|
};
|
|
33
36
|
use temporalio_client::{
|
|
34
|
-
|
|
37
|
+
NamespacedClient, UntypedQuery, UntypedSignal, UntypedWorkflow, WorkflowExecutionInfo,
|
|
38
|
+
WorkflowQueryOptions, WorkflowSignalOptions, WorkflowStartOptions,
|
|
39
|
+
errors::WorkflowGetResultError, grpc::WorkflowService,
|
|
35
40
|
};
|
|
36
41
|
use temporalio_common::{
|
|
37
|
-
|
|
42
|
+
data_converters::RawValue,
|
|
38
43
|
prost_dur,
|
|
39
44
|
protos::{
|
|
40
45
|
DEFAULT_WORKFLOW_TYPE, canned_histories,
|
|
41
46
|
coresdk::{
|
|
42
|
-
ActivityTaskCompletion,
|
|
47
|
+
ActivityTaskCompletion, IntoCompletion,
|
|
43
48
|
activity_result::ActivityExecutionResult,
|
|
44
49
|
workflow_activation::{WorkflowActivationJob, workflow_activation_job},
|
|
45
50
|
workflow_commands::{
|
|
@@ -49,48 +54,59 @@ use temporalio_common::{
|
|
|
49
54
|
workflow_completion::WorkflowActivationCompletion,
|
|
50
55
|
},
|
|
51
56
|
temporal::api::{
|
|
57
|
+
common::v1::WorkflowExecution,
|
|
52
58
|
enums::v1::{CommandType, EventType},
|
|
53
59
|
failure::v1::Failure,
|
|
54
60
|
history::v1::history_event,
|
|
55
|
-
query::v1::WorkflowQuery,
|
|
56
61
|
sdk::v1::UserMetadata,
|
|
62
|
+
workflowservice::v1::ResetStickyTaskQueueRequest,
|
|
57
63
|
},
|
|
58
64
|
test_utils::schedule_activity_cmd,
|
|
59
65
|
},
|
|
60
|
-
worker::{
|
|
61
|
-
PollerBehavior, WorkerDeploymentOptions, WorkerDeploymentVersion, WorkerTaskTypes,
|
|
62
|
-
WorkerVersioningStrategy,
|
|
63
|
-
},
|
|
66
|
+
worker::{WorkerDeploymentOptions, WorkerDeploymentVersion, WorkerTaskTypes},
|
|
64
67
|
};
|
|
68
|
+
use temporalio_macros::{workflow, workflow_methods};
|
|
65
69
|
use temporalio_sdk::{
|
|
66
|
-
ActivityOptions, LocalActivityOptions, TimerOptions,
|
|
70
|
+
ActivityOptions, LocalActivityOptions, TimerOptions, WorkflowContext, WorkflowResult,
|
|
71
|
+
interceptors::WorkerInterceptor,
|
|
67
72
|
};
|
|
68
73
|
use temporalio_sdk_core::{
|
|
69
|
-
CoreRuntime,
|
|
74
|
+
CoreRuntime, PollError, PollerBehavior, TunerHolder, WorkflowErrorType,
|
|
70
75
|
replay::HistoryForReplay,
|
|
71
76
|
test_help::{MockPollCfg, WorkerTestHelpers, drain_pollers_and_shutdown},
|
|
72
77
|
};
|
|
73
78
|
use tokio::{join, sync::Notify, time::sleep};
|
|
79
|
+
use tonic::IntoRequest;
|
|
74
80
|
// TODO: We should get expected histories for these tests and confirm that the history at the end
|
|
75
81
|
// matches.
|
|
76
82
|
|
|
83
|
+
#[workflow]
|
|
84
|
+
#[derive(Default)]
|
|
85
|
+
struct ParallelWorkflowsWf;
|
|
86
|
+
|
|
87
|
+
#[workflow_methods]
|
|
88
|
+
impl ParallelWorkflowsWf {
|
|
89
|
+
#[run]
|
|
90
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
91
|
+
ctx.timer(Duration::from_secs(1)).await;
|
|
92
|
+
Ok(())
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
77
96
|
#[tokio::test]
|
|
78
97
|
async fn parallel_workflows_same_queue() {
|
|
79
98
|
let wf_name = "parallel_workflows_same_queue";
|
|
80
99
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
81
|
-
starter.
|
|
100
|
+
starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
|
|
82
101
|
let mut core = starter.worker().await;
|
|
83
102
|
|
|
84
|
-
core.
|
|
85
|
-
|
|
86
|
-
Ok(().into())
|
|
87
|
-
});
|
|
103
|
+
core.register_workflow::<ParallelWorkflowsWf>();
|
|
104
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
88
105
|
for i in 0..25 {
|
|
89
|
-
core.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
starter.workflow_options.clone(),
|
|
106
|
+
core.submit_workflow(
|
|
107
|
+
ParallelWorkflowsWf::run,
|
|
108
|
+
(),
|
|
109
|
+
WorkflowStartOptions::new(task_queue.clone(), format!("{wf_name}-{i}")).build(),
|
|
94
110
|
)
|
|
95
111
|
.await
|
|
96
112
|
.unwrap();
|
|
@@ -139,7 +155,7 @@ async fn fail_wf_task(#[values(true, false)] replay: bool) {
|
|
|
139
155
|
attrs.first_execution_run_id = "run2".to_string();
|
|
140
156
|
}
|
|
141
157
|
let hist2 = HistoryForReplay::new(hist_proto, "fake".to_string());
|
|
142
|
-
init_core_replay_preloaded("fail_wf_task", [hist, hist2])
|
|
158
|
+
Arc::new(init_core_replay_preloaded("fail_wf_task", [hist, hist2]))
|
|
143
159
|
} else {
|
|
144
160
|
let mut starter = init_core_and_create_wf("fail_wf_task").await;
|
|
145
161
|
starter.get_worker().await
|
|
@@ -223,23 +239,26 @@ async fn signal_workflow() {
|
|
|
223
239
|
.unwrap();
|
|
224
240
|
|
|
225
241
|
// Send the signals to the server
|
|
226
|
-
|
|
227
|
-
.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
242
|
+
let handle = WorkflowExecutionInfo {
|
|
243
|
+
namespace: client.namespace(),
|
|
244
|
+
workflow_id: workflow_id.clone(),
|
|
245
|
+
run_id: Some(res.run_id.clone()),
|
|
246
|
+
first_execution_run_id: None,
|
|
247
|
+
}
|
|
248
|
+
.bind_untyped(client.clone());
|
|
249
|
+
handle
|
|
250
|
+
.signal(
|
|
251
|
+
UntypedSignal::new(signal_id_1),
|
|
252
|
+
RawValue::empty(),
|
|
253
|
+
WorkflowSignalOptions::default(),
|
|
233
254
|
)
|
|
234
255
|
.await
|
|
235
256
|
.unwrap();
|
|
236
|
-
|
|
237
|
-
.
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
None,
|
|
242
|
-
None,
|
|
257
|
+
handle
|
|
258
|
+
.signal(
|
|
259
|
+
UntypedSignal::new(signal_id_2),
|
|
260
|
+
RawValue::empty(),
|
|
261
|
+
WorkflowSignalOptions::default(),
|
|
243
262
|
)
|
|
244
263
|
.await
|
|
245
264
|
.unwrap();
|
|
@@ -320,18 +339,21 @@ async fn signal_workflow_signal_not_handled_on_workflow_completion() {
|
|
|
320
339
|
let run_id = res.run_id.clone();
|
|
321
340
|
|
|
322
341
|
// Send the signal to the server
|
|
323
|
-
starter
|
|
324
|
-
|
|
325
|
-
.
|
|
326
|
-
.
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
)
|
|
333
|
-
|
|
334
|
-
|
|
342
|
+
let sig_client = starter.get_client().await;
|
|
343
|
+
WorkflowExecutionInfo {
|
|
344
|
+
namespace: sig_client.namespace(),
|
|
345
|
+
workflow_id: workflow_id.clone(),
|
|
346
|
+
run_id: Some(res.run_id.clone()),
|
|
347
|
+
first_execution_run_id: None,
|
|
348
|
+
}
|
|
349
|
+
.bind_untyped(sig_client.clone())
|
|
350
|
+
.signal(
|
|
351
|
+
UntypedSignal::new(signal_id_1),
|
|
352
|
+
RawValue::empty(),
|
|
353
|
+
WorkflowSignalOptions::default(),
|
|
354
|
+
)
|
|
355
|
+
.await
|
|
356
|
+
.unwrap();
|
|
335
357
|
|
|
336
358
|
// Send completion - not having seen a poll response with a signal in it yet (unhandled
|
|
337
359
|
// command error will be logged as a warning and an eviction will be issued)
|
|
@@ -365,9 +387,9 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
|
|
|
365
387
|
let signal_at_complete = "at-complete";
|
|
366
388
|
let mut wf_starter = CoreWfStarter::new("wft_timeout_doesnt_create_unsolvable_autocomplete");
|
|
367
389
|
// Test needs eviction on and a short timeout
|
|
368
|
-
wf_starter.
|
|
369
|
-
wf_starter.
|
|
370
|
-
wf_starter.
|
|
390
|
+
wf_starter.sdk_config.max_cached_workflows = 0_usize;
|
|
391
|
+
wf_starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1, 1, 1, 1));
|
|
392
|
+
wf_starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(1_usize);
|
|
371
393
|
wf_starter.workflow_options.task_timeout = Some(Duration::from_secs(1));
|
|
372
394
|
let core = wf_starter.get_worker().await;
|
|
373
395
|
let client = wf_starter.get_client().await;
|
|
@@ -399,16 +421,20 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
|
|
|
399
421
|
// Before polling for a task again, we start and complete the activity and send the
|
|
400
422
|
// corresponding signals.
|
|
401
423
|
let ac_task = core.poll_activity_task().await.unwrap();
|
|
402
|
-
let
|
|
424
|
+
let handle = WorkflowExecutionInfo {
|
|
425
|
+
namespace: client.namespace(),
|
|
426
|
+
workflow_id: wf_id.to_string(),
|
|
427
|
+
run_id: Some(wf_task.run_id.clone()),
|
|
428
|
+
first_execution_run_id: None,
|
|
429
|
+
}
|
|
430
|
+
.bind_untyped(client.clone());
|
|
403
431
|
// Send the signals to the server & resolve activity -- sometimes this happens too fast
|
|
404
432
|
sleep(Duration::from_millis(200)).await;
|
|
405
|
-
|
|
406
|
-
.
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
None,
|
|
411
|
-
None,
|
|
433
|
+
handle
|
|
434
|
+
.signal(
|
|
435
|
+
UntypedSignal::new(signal_at_start),
|
|
436
|
+
RawValue::empty(),
|
|
437
|
+
WorkflowSignalOptions::default(),
|
|
412
438
|
)
|
|
413
439
|
.await
|
|
414
440
|
.unwrap();
|
|
@@ -419,14 +445,11 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
|
|
|
419
445
|
})
|
|
420
446
|
.await
|
|
421
447
|
.unwrap();
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
signal_at_complete.to_string(),
|
|
428
|
-
None,
|
|
429
|
-
None,
|
|
448
|
+
handle
|
|
449
|
+
.signal(
|
|
450
|
+
UntypedSignal::new(signal_at_complete),
|
|
451
|
+
RawValue::empty(),
|
|
452
|
+
WorkflowSignalOptions::default(),
|
|
430
453
|
)
|
|
431
454
|
.await
|
|
432
455
|
.unwrap();
|
|
@@ -469,34 +492,49 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
|
|
|
469
492
|
/// overflow. This test intentionally makes completes slower than polls to evaluate that.
|
|
470
493
|
///
|
|
471
494
|
/// It's expected that this test may generate some task timeouts.
|
|
495
|
+
#[workflow]
|
|
496
|
+
#[derive(Default)]
|
|
497
|
+
struct SlowCompletesWf;
|
|
498
|
+
|
|
499
|
+
#[workflow_methods]
|
|
500
|
+
impl SlowCompletesWf {
|
|
501
|
+
#[run]
|
|
502
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
503
|
+
for _ in 0..3 {
|
|
504
|
+
ctx.start_activity(
|
|
505
|
+
StdActivities::echo,
|
|
506
|
+
"hi!".to_string(),
|
|
507
|
+
ActivityOptions {
|
|
508
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
509
|
+
..Default::default()
|
|
510
|
+
},
|
|
511
|
+
)
|
|
512
|
+
.await
|
|
513
|
+
.map_err(|e| anyhow::anyhow!("{e}"))?;
|
|
514
|
+
ctx.timer(Duration::from_secs(1)).await;
|
|
515
|
+
}
|
|
516
|
+
Ok(())
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
472
520
|
#[tokio::test]
|
|
473
521
|
async fn slow_completes_with_small_cache() {
|
|
474
522
|
let wf_name = "slow_completes_with_small_cache";
|
|
475
523
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
476
|
-
starter.
|
|
477
|
-
starter.
|
|
524
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(5, 10, 1, 1));
|
|
525
|
+
starter.sdk_config.max_cached_workflows = 5_usize;
|
|
478
526
|
let mut worker = starter.worker().await;
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
485
|
-
..Default::default()
|
|
486
|
-
})
|
|
487
|
-
.await;
|
|
488
|
-
ctx.timer(Duration::from_secs(1)).await;
|
|
489
|
-
}
|
|
490
|
-
Ok(().into())
|
|
491
|
-
});
|
|
492
|
-
worker.register_activity("echo_activity", echo);
|
|
527
|
+
|
|
528
|
+
worker.register_activities(StdActivities);
|
|
529
|
+
|
|
530
|
+
worker.register_workflow::<SlowCompletesWf>();
|
|
531
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
493
532
|
for i in 0..20 {
|
|
494
533
|
worker
|
|
495
|
-
.
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
WorkflowOptions::default(),
|
|
534
|
+
.submit_workflow(
|
|
535
|
+
SlowCompletesWf::run,
|
|
536
|
+
(),
|
|
537
|
+
WorkflowStartOptions::new(task_queue.clone(), format!("{wf_name}_{i}")).build(),
|
|
500
538
|
)
|
|
501
539
|
.await
|
|
502
540
|
.unwrap();
|
|
@@ -522,22 +560,26 @@ async fn slow_completes_with_small_cache() {
|
|
|
522
560
|
async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_build_id: bool) {
|
|
523
561
|
let wf_type = "deployment_version_correct_in_wf_info";
|
|
524
562
|
let mut starter = CoreWfStarter::new(wf_type);
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
563
|
+
starter.sdk_config.deployment_options = if use_only_build_id {
|
|
564
|
+
WorkerDeploymentOptions {
|
|
565
|
+
version: WorkerDeploymentVersion {
|
|
566
|
+
deployment_name: "".to_string(),
|
|
567
|
+
build_id: "1.0".to_string(),
|
|
568
|
+
},
|
|
569
|
+
use_worker_versioning: false,
|
|
570
|
+
default_versioning_behavior: None,
|
|
528
571
|
}
|
|
529
572
|
} else {
|
|
530
|
-
|
|
573
|
+
WorkerDeploymentOptions {
|
|
531
574
|
version: WorkerDeploymentVersion {
|
|
532
575
|
deployment_name: "deployment-1".to_string(),
|
|
533
576
|
build_id: "1.0".to_string(),
|
|
534
577
|
},
|
|
535
578
|
use_worker_versioning: false,
|
|
536
579
|
default_versioning_behavior: None,
|
|
537
|
-
}
|
|
580
|
+
}
|
|
538
581
|
};
|
|
539
|
-
starter.
|
|
540
|
-
starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
|
|
582
|
+
starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
|
|
541
583
|
let core = starter.get_worker().await;
|
|
542
584
|
starter.start_wf().await;
|
|
543
585
|
let client = starter.get_client().await;
|
|
@@ -567,15 +609,19 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
|
|
|
567
609
|
.unwrap();
|
|
568
610
|
|
|
569
611
|
// Ensure a query on first wft also sees the correct id
|
|
612
|
+
let query_handle = WorkflowExecutionInfo {
|
|
613
|
+
namespace: client.namespace(),
|
|
614
|
+
workflow_id: workflow_id.clone(),
|
|
615
|
+
run_id: Some(res.run_id.clone()),
|
|
616
|
+
first_execution_run_id: None,
|
|
617
|
+
}
|
|
618
|
+
.bind_untyped(client.clone());
|
|
570
619
|
let query_fut = async {
|
|
571
|
-
|
|
572
|
-
.
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
query_type: "q1".to_string(),
|
|
577
|
-
..Default::default()
|
|
578
|
-
},
|
|
620
|
+
query_handle
|
|
621
|
+
.query(
|
|
622
|
+
UntypedQuery::new("q1"),
|
|
623
|
+
RawValue::empty(),
|
|
624
|
+
WorkflowQueryOptions::default(),
|
|
579
625
|
)
|
|
580
626
|
.await
|
|
581
627
|
.unwrap()
|
|
@@ -621,39 +667,49 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
|
|
|
621
667
|
};
|
|
622
668
|
join!(query_fut, complete_fut);
|
|
623
669
|
starter.shutdown().await;
|
|
624
|
-
|
|
625
|
-
.
|
|
626
|
-
|
|
627
|
-
|
|
670
|
+
WorkflowService::reset_sticky_task_queue(
|
|
671
|
+
&mut client.clone(),
|
|
672
|
+
ResetStickyTaskQueueRequest {
|
|
673
|
+
namespace: client.namespace(),
|
|
674
|
+
execution: Some(WorkflowExecution {
|
|
675
|
+
workflow_id: workflow_id.clone(),
|
|
676
|
+
run_id: "".to_string(),
|
|
677
|
+
}),
|
|
678
|
+
}
|
|
679
|
+
.into_request(),
|
|
680
|
+
)
|
|
681
|
+
.await
|
|
682
|
+
.unwrap();
|
|
628
683
|
|
|
629
684
|
let mut starter = starter.clone_no_worker();
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
685
|
+
starter.sdk_config.deployment_options = if use_only_build_id {
|
|
686
|
+
WorkerDeploymentOptions {
|
|
687
|
+
version: WorkerDeploymentVersion {
|
|
688
|
+
deployment_name: "".to_string(),
|
|
689
|
+
build_id: "2.0".to_string(),
|
|
690
|
+
},
|
|
691
|
+
use_worker_versioning: false,
|
|
692
|
+
default_versioning_behavior: None,
|
|
633
693
|
}
|
|
634
694
|
} else {
|
|
635
|
-
|
|
695
|
+
WorkerDeploymentOptions {
|
|
636
696
|
version: WorkerDeploymentVersion {
|
|
637
697
|
deployment_name: "deployment-1".to_string(),
|
|
638
698
|
build_id: "2.0".to_string(),
|
|
639
699
|
},
|
|
640
700
|
use_worker_versioning: false,
|
|
641
701
|
default_versioning_behavior: None,
|
|
642
|
-
}
|
|
702
|
+
}
|
|
643
703
|
};
|
|
644
|
-
starter.worker_config.versioning_strategy = version_strat;
|
|
645
704
|
|
|
646
705
|
let core = starter.get_worker().await;
|
|
647
706
|
|
|
648
707
|
let query_fut = async {
|
|
649
|
-
|
|
650
|
-
.
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
query_type: "q2".to_string(),
|
|
655
|
-
..Default::default()
|
|
656
|
-
},
|
|
708
|
+
query_handle
|
|
709
|
+
.query(
|
|
710
|
+
UntypedQuery::new("q2"),
|
|
711
|
+
RawValue::empty(),
|
|
712
|
+
WorkflowQueryOptions::default(),
|
|
657
713
|
)
|
|
658
714
|
.await
|
|
659
715
|
.unwrap()
|
|
@@ -722,12 +778,11 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
|
|
|
722
778
|
join!(query_fut, complete_fut);
|
|
723
779
|
|
|
724
780
|
client
|
|
725
|
-
.
|
|
726
|
-
|
|
727
|
-
""
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
None,
|
|
781
|
+
.get_workflow_handle::<UntypedWorkflow>(&workflow_id)
|
|
782
|
+
.signal(
|
|
783
|
+
UntypedSignal::new("whatever"),
|
|
784
|
+
RawValue::empty(),
|
|
785
|
+
WorkflowSignalOptions::default(),
|
|
731
786
|
)
|
|
732
787
|
.await
|
|
733
788
|
.unwrap();
|
|
@@ -751,6 +806,8 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
|
|
|
751
806
|
core.complete_execution(&res.run_id).await;
|
|
752
807
|
}
|
|
753
808
|
|
|
809
|
+
const NONDETERMINISM_WF_NAME: &str = "nondeterminism_errors_fail_workflow_when_configured_to";
|
|
810
|
+
|
|
754
811
|
#[rstest::rstest]
|
|
755
812
|
#[tokio::test]
|
|
756
813
|
async fn nondeterminism_errors_fail_workflow_when_configured_to(
|
|
@@ -758,26 +815,36 @@ async fn nondeterminism_errors_fail_workflow_when_configured_to(
|
|
|
758
815
|
) {
|
|
759
816
|
let (telemopts, addr, _aborter) = prom_metrics(None);
|
|
760
817
|
let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
|
|
761
|
-
let wf_name =
|
|
818
|
+
let wf_name = NONDETERMINISM_WF_NAME;
|
|
762
819
|
let mut starter = CoreWfStarter::new_with_runtime(wf_name, rt);
|
|
763
|
-
starter.
|
|
820
|
+
starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
|
|
764
821
|
let typeset = HashSet::from([WorkflowErrorType::Nondeterminism]);
|
|
765
822
|
if whole_worker {
|
|
766
|
-
starter.
|
|
823
|
+
starter.sdk_config.workflow_failure_errors = typeset;
|
|
767
824
|
} else {
|
|
768
|
-
starter.
|
|
825
|
+
starter.sdk_config.workflow_types_to_failure_errors =
|
|
769
826
|
HashMap::from([(wf_name.to_owned(), typeset)]);
|
|
770
827
|
}
|
|
771
828
|
let wf_id = starter.get_task_queue().to_owned();
|
|
772
829
|
let mut worker = starter.worker().await;
|
|
773
830
|
worker.fetch_results = false;
|
|
774
831
|
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
832
|
+
#[workflow]
|
|
833
|
+
#[derive(Default)]
|
|
834
|
+
struct NondeterminismTimerWf;
|
|
835
|
+
|
|
836
|
+
#[workflow_methods]
|
|
837
|
+
impl NondeterminismTimerWf {
|
|
838
|
+
#[run(name = NONDETERMINISM_WF_NAME)]
|
|
839
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
840
|
+
ctx.timer(Duration::from_secs(1000)).await;
|
|
841
|
+
Ok(())
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
worker.register_workflow::<NondeterminismTimerWf>();
|
|
779
846
|
let client = starter.get_client().await;
|
|
780
|
-
let core_worker = worker.core_worker
|
|
847
|
+
let core_worker = worker.core_worker();
|
|
781
848
|
starter.start_with_worker(wf_name, &mut worker).await;
|
|
782
849
|
|
|
783
850
|
let stopper = async {
|
|
@@ -802,23 +869,53 @@ async fn nondeterminism_errors_fail_workflow_when_configured_to(
|
|
|
802
869
|
|
|
803
870
|
// Restart the worker with a new, incompatible wf definition which will cause nondeterminism
|
|
804
871
|
let mut starter = starter.clone_no_worker();
|
|
872
|
+
starter.sdk_config.register_activities(StdActivities);
|
|
805
873
|
let mut worker = starter.worker().await;
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
874
|
+
|
|
875
|
+
#[workflow]
|
|
876
|
+
#[derive(Default)]
|
|
877
|
+
struct NondeterminismActivityWf;
|
|
878
|
+
|
|
879
|
+
#[workflow_methods]
|
|
880
|
+
impl NondeterminismActivityWf {
|
|
881
|
+
#[run(name = NONDETERMINISM_WF_NAME)]
|
|
882
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
883
|
+
ctx.start_activity(
|
|
884
|
+
StdActivities::echo,
|
|
885
|
+
"hi".to_owned(),
|
|
886
|
+
ActivityOptions {
|
|
887
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
888
|
+
..Default::default()
|
|
889
|
+
},
|
|
890
|
+
)
|
|
891
|
+
.await
|
|
892
|
+
.map_err(|e| anyhow::anyhow!("{e}"))?;
|
|
893
|
+
Ok(())
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
worker.register_workflow::<NondeterminismActivityWf>();
|
|
815
898
|
// We need to generate a task so that we'll encounter the error (first avoid WFT timeout)
|
|
899
|
+
WorkflowService::reset_sticky_task_queue(
|
|
900
|
+
&mut client.clone(),
|
|
901
|
+
ResetStickyTaskQueueRequest {
|
|
902
|
+
namespace: client.namespace(),
|
|
903
|
+
execution: Some(WorkflowExecution {
|
|
904
|
+
workflow_id: wf_id.clone(),
|
|
905
|
+
run_id: "".to_string(),
|
|
906
|
+
}),
|
|
907
|
+
}
|
|
908
|
+
.into_request(),
|
|
909
|
+
)
|
|
910
|
+
.await
|
|
911
|
+
.unwrap();
|
|
816
912
|
client
|
|
817
|
-
.
|
|
818
|
-
.
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
913
|
+
.get_workflow_handle::<UntypedWorkflow>(&wf_id)
|
|
914
|
+
.signal(
|
|
915
|
+
UntypedSignal::new("hi"),
|
|
916
|
+
RawValue::empty(),
|
|
917
|
+
WorkflowSignalOptions::default(),
|
|
918
|
+
)
|
|
822
919
|
.await
|
|
823
920
|
.unwrap();
|
|
824
921
|
worker.expect_workflow_completion(&wf_id, None);
|
|
@@ -834,70 +931,105 @@ async fn nondeterminism_errors_fail_workflow_when_configured_to(
|
|
|
834
931
|
assert!(body.contains(&match_this));
|
|
835
932
|
}
|
|
836
933
|
|
|
934
|
+
const HISTORY_OUT_OF_ORDER_WF_NAME: &str = "history_out_of_order_on_restart";
|
|
935
|
+
|
|
837
936
|
#[tokio::test]
|
|
838
937
|
async fn history_out_of_order_on_restart() {
|
|
839
|
-
let wf_name =
|
|
938
|
+
let wf_name = HISTORY_OUT_OF_ORDER_WF_NAME;
|
|
840
939
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
841
|
-
starter.
|
|
842
|
-
HashSet::from([WorkflowErrorType::Nondeterminism]);
|
|
940
|
+
starter.sdk_config.workflow_failure_errors = HashSet::from([WorkflowErrorType::Nondeterminism]);
|
|
843
941
|
let mut worker = starter.worker().await;
|
|
844
942
|
let mut starter2 = starter.clone_no_worker();
|
|
845
943
|
let mut worker2 = starter2.worker().await;
|
|
846
944
|
|
|
847
|
-
|
|
945
|
+
let hit_sleep = Arc::new(Notify::new());
|
|
946
|
+
let hit_sleep_clone1 = hit_sleep.clone();
|
|
947
|
+
let hit_sleep_clone2 = hit_sleep.clone();
|
|
848
948
|
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
ctx
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
949
|
+
#[workflow]
|
|
950
|
+
struct HistoryOutOfOrderWf1 {
|
|
951
|
+
hit_sleep: Arc<Notify>,
|
|
952
|
+
}
|
|
953
|
+
|
|
954
|
+
#[workflow_methods(factory_only)]
|
|
955
|
+
impl HistoryOutOfOrderWf1 {
|
|
956
|
+
#[run(name = HISTORY_OUT_OF_ORDER_WF_NAME)]
|
|
957
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
958
|
+
ctx.start_local_activity(
|
|
959
|
+
StdActivities::echo,
|
|
960
|
+
"hi".to_string(),
|
|
961
|
+
LocalActivityOptions {
|
|
962
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
963
|
+
..Default::default()
|
|
964
|
+
},
|
|
965
|
+
)
|
|
966
|
+
.await
|
|
967
|
+
.map_err(|e| anyhow::anyhow!("{e}"))?;
|
|
968
|
+
ctx.start_activity(
|
|
969
|
+
StdActivities::echo,
|
|
970
|
+
"hi".to_string(),
|
|
971
|
+
ActivityOptions {
|
|
972
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
973
|
+
..Default::default()
|
|
974
|
+
},
|
|
975
|
+
)
|
|
976
|
+
.await
|
|
977
|
+
.map_err(|e| anyhow::anyhow!("{e}"))?;
|
|
978
|
+
ctx.state(|wf| wf.hit_sleep.notify_one());
|
|
979
|
+
ctx.timer(Duration::from_secs(5)).await;
|
|
980
|
+
Ok(())
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
#[workflow]
|
|
985
|
+
#[derive(Default)]
|
|
986
|
+
struct HistoryOutOfOrderWf2;
|
|
987
|
+
|
|
988
|
+
#[workflow_methods]
|
|
989
|
+
impl HistoryOutOfOrderWf2 {
|
|
990
|
+
#[run(name = HISTORY_OUT_OF_ORDER_WF_NAME)]
|
|
991
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
992
|
+
ctx.start_local_activity(
|
|
993
|
+
StdActivities::echo,
|
|
994
|
+
"hi".to_string(),
|
|
995
|
+
LocalActivityOptions {
|
|
996
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
997
|
+
..Default::default()
|
|
998
|
+
},
|
|
999
|
+
)
|
|
1000
|
+
.await
|
|
1001
|
+
.map_err(|e| anyhow::anyhow!("{e}"))?;
|
|
1002
|
+
// Timer is added after restarting workflow
|
|
1003
|
+
ctx.timer(Duration::from_secs(1)).await;
|
|
1004
|
+
ctx.start_activity(
|
|
1005
|
+
StdActivities::echo,
|
|
1006
|
+
"hi".to_string(),
|
|
1007
|
+
ActivityOptions {
|
|
1008
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
1009
|
+
..Default::default()
|
|
1010
|
+
},
|
|
1011
|
+
)
|
|
1012
|
+
.await
|
|
1013
|
+
.map_err(|e| anyhow::anyhow!("{e}"))?;
|
|
1014
|
+
ctx.timer(Duration::from_secs(2)).await;
|
|
1015
|
+
Ok(())
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
worker.register_activities(StdActivities);
|
|
1020
|
+
worker2.register_activities(StdActivities);
|
|
1021
|
+
worker.register_workflow_with_factory(move || HistoryOutOfOrderWf1 {
|
|
1022
|
+
hit_sleep: hit_sleep_clone1.clone(),
|
|
890
1023
|
});
|
|
891
|
-
worker2.
|
|
1024
|
+
worker2.register_workflow::<HistoryOutOfOrderWf2>();
|
|
1025
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
892
1026
|
worker
|
|
893
|
-
.
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
..Default::default()
|
|
900
|
-
},
|
|
1027
|
+
.submit_workflow(
|
|
1028
|
+
HistoryOutOfOrderWf1::run,
|
|
1029
|
+
(),
|
|
1030
|
+
WorkflowStartOptions::new(task_queue, wf_name.to_owned())
|
|
1031
|
+
.execution_timeout(Duration::from_secs(20))
|
|
1032
|
+
.build(),
|
|
901
1033
|
)
|
|
902
1034
|
.await
|
|
903
1035
|
.unwrap();
|
|
@@ -907,7 +1039,7 @@ async fn history_out_of_order_on_restart() {
|
|
|
907
1039
|
};
|
|
908
1040
|
let w2 = async {
|
|
909
1041
|
// wait to hit sleep
|
|
910
|
-
|
|
1042
|
+
hit_sleep_clone2.notified().await;
|
|
911
1043
|
starter.shutdown().await;
|
|
912
1044
|
// start new worker
|
|
913
1045
|
worker2.expect_workflow_completion(wf_name, None);
|
|
@@ -918,12 +1050,9 @@ async fn history_out_of_order_on_restart() {
|
|
|
918
1050
|
let handle = starter
|
|
919
1051
|
.get_client()
|
|
920
1052
|
.await
|
|
921
|
-
.
|
|
922
|
-
let res = handle
|
|
923
|
-
|
|
924
|
-
.await
|
|
925
|
-
.unwrap();
|
|
926
|
-
assert_matches!(res, WorkflowExecutionResult::Failed(_));
|
|
1053
|
+
.get_workflow_handle::<UntypedWorkflow>(wf_name);
|
|
1054
|
+
let res = handle.get_result(Default::default()).await;
|
|
1055
|
+
assert_matches!(res, Err(WorkflowGetResultError::Failed(_)));
|
|
927
1056
|
}
|
|
928
1057
|
|
|
929
1058
|
#[tokio::test]
|
|
@@ -931,7 +1060,6 @@ async fn pass_timer_summary_to_metadata() {
|
|
|
931
1060
|
let t = canned_histories::single_timer("1");
|
|
932
1061
|
let mut mock_cfg = MockPollCfg::from_hist_builder(t);
|
|
933
1062
|
let wf_id = mock_cfg.hists[0].wf_id.clone();
|
|
934
|
-
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
935
1063
|
let expected_user_metadata = Some(UserMetadata {
|
|
936
1064
|
summary: Some(b"timer summary".into()),
|
|
937
1065
|
details: None,
|
|
@@ -952,21 +1080,30 @@ async fn pass_timer_summary_to_metadata() {
|
|
|
952
1080
|
});
|
|
953
1081
|
});
|
|
954
1082
|
|
|
1083
|
+
#[workflow]
|
|
1084
|
+
#[derive(Default)]
|
|
1085
|
+
struct PassTimerSummaryWf;
|
|
1086
|
+
|
|
1087
|
+
#[workflow_methods]
|
|
1088
|
+
impl PassTimerSummaryWf {
|
|
1089
|
+
#[run(name = DEFAULT_WORKFLOW_TYPE)]
|
|
1090
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
1091
|
+
ctx.timer(TimerOptions {
|
|
1092
|
+
duration: Duration::from_secs(1),
|
|
1093
|
+
summary: Some("timer summary".to_string()),
|
|
1094
|
+
})
|
|
1095
|
+
.await;
|
|
1096
|
+
Ok(())
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
|
|
955
1100
|
let mut worker = mock_sdk_cfg(mock_cfg, |_| {});
|
|
956
|
-
worker.
|
|
957
|
-
ctx.timer(TimerOptions {
|
|
958
|
-
duration: Duration::from_secs(1),
|
|
959
|
-
summary: Some("timer summary".to_string()),
|
|
960
|
-
})
|
|
961
|
-
.await;
|
|
962
|
-
Ok(().into())
|
|
963
|
-
});
|
|
1101
|
+
worker.register_workflow::<PassTimerSummaryWf>();
|
|
964
1102
|
worker
|
|
965
1103
|
.submit_wf(
|
|
966
|
-
|
|
967
|
-
wf_type.to_owned(),
|
|
1104
|
+
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
968
1105
|
vec![],
|
|
969
|
-
|
|
1106
|
+
WorkflowStartOptions::new("fake_tq".to_owned(), wf_id.to_owned()).build(),
|
|
970
1107
|
)
|
|
971
1108
|
.await
|
|
972
1109
|
.unwrap();
|