@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.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 +794 -650
- package/bridge-macros/src/derive_tryintojs.rs +40 -0
- package/lib/native.d.ts +24 -3
- package/package.json +4 -4
- 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 +42 -31
- package/sdk-core/Cargo.toml +4 -1
- package/sdk-core/README.md +19 -13
- 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} +370 -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} +104 -29
- package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
- package/sdk-core/crates/common/Cargo.toml +62 -3
- 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/.github/workflows/create-release.yml +0 -5
- package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
- package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
- 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 +3329 -2647
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
- 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 +111 -17
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -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 +19 -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 +134 -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 +11 -16
- package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
- package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
- 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 +278 -19
- package/sdk-core/crates/common/src/worker.rs +68 -636
- 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 +759 -442
- package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -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 +59 -65
- package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
- 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 +22 -21
- 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 +647 -27
- package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
- package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
- package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
- package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
- package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
- package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
- 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 +183 -198
- package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
- package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
- package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
- 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 +11 -5
- package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
- package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -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 +25 -27
- package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
- package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
- 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 +28 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
- package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
- 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 +281 -236
- package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
- package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
- package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
- package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
- 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 +37 -38
- package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
- 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 +157 -157
- 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 -463
- 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 +389 -265
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
- 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 +437 -327
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
- 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 +110 -46
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
- 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 +155 -140
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
- package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
- package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
- package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
- package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
- 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 +8 -1
- package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
- package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
- package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
- package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
- package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
- package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
- package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
- package/sdk-core/rustfmt.toml +2 -1
- package/src/client.rs +206 -289
- package/src/helpers/try_into_js.rs +88 -2
- package/src/metrics.rs +277 -35
- package/src/runtime.rs +94 -45
- package/src/testing.rs +9 -16
- package/src/worker.rs +86 -68
- package/ts/native.ts +39 -3
- 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/macros/LICENSE.txt +0 -21
- 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
|
@@ -7,7 +7,8 @@ mod fuzzy_workflow;
|
|
|
7
7
|
|
|
8
8
|
use crate::common::get_integ_runtime_options;
|
|
9
9
|
use common::{
|
|
10
|
-
CoreWfStarter, init_integ_telem, prom_metrics, rand_6_chars,
|
|
10
|
+
CoreWfStarter, activity_functions::StdActivities, init_integ_telem, prom_metrics, rand_6_chars,
|
|
11
|
+
workflows::LaProblemWorkflow,
|
|
11
12
|
};
|
|
12
13
|
use futures_util::{
|
|
13
14
|
StreamExt,
|
|
@@ -22,75 +23,84 @@ use std::{
|
|
|
22
23
|
time::{Duration, Instant},
|
|
23
24
|
};
|
|
24
25
|
use temporalio_client::{
|
|
25
|
-
|
|
26
|
+
NamespacedClient, UntypedSignal, UntypedWorkflow, WorkflowExecutionInfo,
|
|
27
|
+
WorkflowGetResultOptions, WorkflowSignalOptions, WorkflowStartOptions,
|
|
26
28
|
};
|
|
29
|
+
use temporalio_common::{
|
|
30
|
+
data_converters::RawValue, protos::temporal::api::enums::v1::WorkflowIdConflictPolicy,
|
|
31
|
+
};
|
|
32
|
+
use temporalio_macros::{activities, workflow, workflow_methods};
|
|
27
33
|
|
|
28
34
|
use temporalio_common::{
|
|
29
35
|
protos::{
|
|
30
|
-
coresdk::
|
|
36
|
+
coresdk::workflow_commands::ActivityCancellationType,
|
|
31
37
|
temporal::api::enums::v1::WorkflowIdReusePolicy,
|
|
32
38
|
},
|
|
33
|
-
worker::
|
|
39
|
+
worker::WorkerTaskTypes,
|
|
40
|
+
};
|
|
41
|
+
use temporalio_sdk::{
|
|
42
|
+
ActivityOptions, SyncWorkflowContext, WorkflowContext, WorkflowResult,
|
|
43
|
+
activities::{ActivityContext, ActivityError},
|
|
44
|
+
};
|
|
45
|
+
use temporalio_sdk_core::{
|
|
46
|
+
CoreRuntime, PollerBehavior, ResourceBasedTuner, ResourceSlotOptions, TunerHolder,
|
|
34
47
|
};
|
|
35
|
-
|
|
36
|
-
|
|
48
|
+
|
|
49
|
+
#[workflow]
|
|
50
|
+
#[derive(Clone, Default)]
|
|
51
|
+
struct ActivityLoadWf;
|
|
52
|
+
|
|
53
|
+
#[workflow_methods]
|
|
54
|
+
impl ActivityLoadWf {
|
|
55
|
+
#[run(name = "activity_load")]
|
|
56
|
+
async fn run(ctx: &mut WorkflowContext<Self>, tq: String) -> WorkflowResult<()> {
|
|
57
|
+
let input_str = "yo".to_string();
|
|
58
|
+
let res = ctx
|
|
59
|
+
.start_activity(
|
|
60
|
+
StdActivities::echo,
|
|
61
|
+
input_str.clone(),
|
|
62
|
+
ActivityOptions {
|
|
63
|
+
activity_id: Some("act-1".to_string()),
|
|
64
|
+
task_queue: Some(tq),
|
|
65
|
+
schedule_to_start_timeout: Some(Duration::from_secs(8)),
|
|
66
|
+
start_to_close_timeout: Some(Duration::from_secs(8)),
|
|
67
|
+
schedule_to_close_timeout: Some(Duration::from_secs(8)),
|
|
68
|
+
heartbeat_timeout: Some(Duration::from_secs(8)),
|
|
69
|
+
cancellation_type: ActivityCancellationType::TryCancel,
|
|
70
|
+
..Default::default()
|
|
71
|
+
},
|
|
72
|
+
)
|
|
73
|
+
.await?;
|
|
74
|
+
assert_eq!(res, input_str);
|
|
75
|
+
Ok(())
|
|
76
|
+
}
|
|
77
|
+
}
|
|
37
78
|
|
|
38
79
|
#[tokio::test]
|
|
39
80
|
async fn activity_load() {
|
|
40
81
|
const CONCURRENCY: usize = 512;
|
|
41
82
|
|
|
42
83
|
let mut starter = CoreWfStarter::new("activity_load");
|
|
43
|
-
starter
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
84
|
+
starter.sdk_config.max_cached_workflows = CONCURRENCY;
|
|
85
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10);
|
|
86
|
+
starter.sdk_config.tuner =
|
|
87
|
+
Arc::new(TunerHolder::fixed_size(CONCURRENCY, CONCURRENCY, 100, 100));
|
|
88
|
+
starter.sdk_config.register_activities(StdActivities);
|
|
89
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
49
90
|
let mut worker = starter.worker().await;
|
|
50
91
|
|
|
51
|
-
let activity_id = "act-1";
|
|
52
|
-
let activity_timeout = Duration::from_secs(8);
|
|
53
|
-
let task_queue = Some(starter.get_task_queue().to_owned());
|
|
54
|
-
|
|
55
|
-
let wf_fn = move |ctx: WfContext| {
|
|
56
|
-
let task_queue = task_queue.clone();
|
|
57
|
-
let payload = "yo".as_json_payload().unwrap();
|
|
58
|
-
async move {
|
|
59
|
-
let activity = ActivityOptions {
|
|
60
|
-
activity_id: Some(activity_id.to_string()),
|
|
61
|
-
activity_type: "test_activity".to_string(),
|
|
62
|
-
input: payload.clone(),
|
|
63
|
-
task_queue,
|
|
64
|
-
schedule_to_start_timeout: Some(activity_timeout),
|
|
65
|
-
start_to_close_timeout: Some(activity_timeout),
|
|
66
|
-
schedule_to_close_timeout: Some(activity_timeout),
|
|
67
|
-
heartbeat_timeout: Some(activity_timeout),
|
|
68
|
-
cancellation_type: ActivityCancellationType::TryCancel,
|
|
69
|
-
..Default::default()
|
|
70
|
-
};
|
|
71
|
-
let res = ctx.activity(activity).await.unwrap_ok_payload();
|
|
72
|
-
assert_eq!(res.data, payload.data);
|
|
73
|
-
Ok(().into())
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
|
|
77
92
|
let starting = Instant::now();
|
|
78
|
-
|
|
79
|
-
worker.register_wf(wf_type.to_owned(), wf_fn);
|
|
80
|
-
worker.register_activity(
|
|
81
|
-
"test_activity",
|
|
82
|
-
|_ctx: ActContext, echo: String| async move { Ok(echo) },
|
|
83
|
-
);
|
|
93
|
+
worker.register_workflow::<ActivityLoadWf>();
|
|
84
94
|
join_all((0..CONCURRENCY).map(|i| {
|
|
85
95
|
let worker = &worker;
|
|
86
96
|
let wf_id = format!("activity_load_{i}");
|
|
97
|
+
let tq = task_queue.clone();
|
|
87
98
|
async move {
|
|
88
99
|
worker
|
|
89
|
-
.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
WorkflowOptions::default(),
|
|
100
|
+
.submit_workflow(
|
|
101
|
+
ActivityLoadWf::run,
|
|
102
|
+
tq.clone(),
|
|
103
|
+
WorkflowStartOptions::new(tq, wf_id).build(),
|
|
94
104
|
)
|
|
95
105
|
.await
|
|
96
106
|
.unwrap();
|
|
@@ -105,16 +115,56 @@ async fn activity_load() {
|
|
|
105
115
|
dbg!(running.elapsed());
|
|
106
116
|
}
|
|
107
117
|
|
|
118
|
+
#[workflow]
|
|
119
|
+
#[derive(Default)]
|
|
120
|
+
struct ChunkyActivityWf;
|
|
121
|
+
|
|
122
|
+
#[workflow_methods]
|
|
123
|
+
impl ChunkyActivityWf {
|
|
124
|
+
#[run(name = "chunky_activity_wf")]
|
|
125
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
126
|
+
let input_str = "yo".to_string();
|
|
127
|
+
let res = ctx
|
|
128
|
+
.start_activity(
|
|
129
|
+
ChunkyActivities::chunky_echo,
|
|
130
|
+
input_str.clone(),
|
|
131
|
+
ActivityOptions {
|
|
132
|
+
activity_id: Some("act-1".to_string()),
|
|
133
|
+
start_to_close_timeout: Some(Duration::from_secs(30)),
|
|
134
|
+
..Default::default()
|
|
135
|
+
},
|
|
136
|
+
)
|
|
137
|
+
.await?;
|
|
138
|
+
assert_eq!(res, input_str);
|
|
139
|
+
Ok(())
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
struct ChunkyActivities;
|
|
144
|
+
#[activities]
|
|
145
|
+
impl ChunkyActivities {
|
|
146
|
+
#[activity]
|
|
147
|
+
async fn chunky_echo(_ctx: ActivityContext, echo: String) -> Result<String, ActivityError> {
|
|
148
|
+
tokio::task::spawn_blocking(move || {
|
|
149
|
+
let mut mem = vec![0_u8; 1000 * 1024 * 1024];
|
|
150
|
+
for _ in 1..10 {
|
|
151
|
+
for i in 0..mem.len() {
|
|
152
|
+
mem[i] &= mem[mem.len() - 1 - i]
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
Ok(echo)
|
|
156
|
+
})
|
|
157
|
+
.await?
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
108
161
|
#[tokio::test]
|
|
109
162
|
async fn chunky_activities_resource_based() {
|
|
110
163
|
const WORKFLOWS: usize = 100;
|
|
111
164
|
|
|
112
165
|
let mut starter = CoreWfStarter::new("chunky_activities_resource_based");
|
|
113
|
-
starter
|
|
114
|
-
|
|
115
|
-
.clear_max_outstanding_opts()
|
|
116
|
-
.workflow_task_poller_behavior(PollerBehavior::SimpleMaximum(10_usize))
|
|
117
|
-
.activity_task_poller_behavior(PollerBehavior::SimpleMaximum(10_usize));
|
|
166
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
|
|
167
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
|
|
118
168
|
let mut tuner = ResourceBasedTuner::new(0.7, 0.7);
|
|
119
169
|
tuner
|
|
120
170
|
.with_workflow_slots_options(ResourceSlotOptions::new(
|
|
@@ -123,60 +173,27 @@ async fn chunky_activities_resource_based() {
|
|
|
123
173
|
Duration::from_millis(0),
|
|
124
174
|
))
|
|
125
175
|
.with_activity_slots_options(ResourceSlotOptions::new(5, 1000, Duration::from_millis(50)));
|
|
126
|
-
starter.
|
|
127
|
-
let mut worker = starter.worker().await;
|
|
176
|
+
starter.sdk_config.tuner = Arc::new(tuner);
|
|
128
177
|
|
|
129
|
-
|
|
130
|
-
let
|
|
131
|
-
|
|
132
|
-
let wf_fn = move |ctx: WfContext| {
|
|
133
|
-
let payload = "yo".as_json_payload().unwrap();
|
|
134
|
-
async move {
|
|
135
|
-
let activity = ActivityOptions {
|
|
136
|
-
activity_id: Some(activity_id.to_string()),
|
|
137
|
-
activity_type: "test_activity".to_string(),
|
|
138
|
-
input: payload.clone(),
|
|
139
|
-
start_to_close_timeout: Some(activity_timeout),
|
|
140
|
-
..Default::default()
|
|
141
|
-
};
|
|
142
|
-
let res = ctx.activity(activity).await.unwrap_ok_payload();
|
|
143
|
-
assert_eq!(res.data, payload.data);
|
|
144
|
-
Ok(().into())
|
|
145
|
-
}
|
|
146
|
-
};
|
|
178
|
+
starter.sdk_config.register_activities(ChunkyActivities);
|
|
179
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
180
|
+
let mut worker = starter.worker().await;
|
|
147
181
|
|
|
148
182
|
let starting = Instant::now();
|
|
149
|
-
|
|
150
|
-
worker.register_wf(wf_type.to_owned(), wf_fn);
|
|
151
|
-
worker.register_activity(
|
|
152
|
-
"test_activity",
|
|
153
|
-
|_ctx: ActContext, echo: String| async move {
|
|
154
|
-
tokio::task::spawn_blocking(move || {
|
|
155
|
-
// Allocate a gig and then do some CPU stuff on it
|
|
156
|
-
let mut mem = vec![0_u8; 1000 * 1024 * 1024];
|
|
157
|
-
for _ in 1..10 {
|
|
158
|
-
for i in 0..mem.len() {
|
|
159
|
-
mem[i] &= mem[mem.len() - 1 - i]
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
Ok(echo)
|
|
163
|
-
})
|
|
164
|
-
.await?
|
|
165
|
-
},
|
|
166
|
-
);
|
|
183
|
+
worker.register_workflow::<ChunkyActivityWf>();
|
|
167
184
|
join_all((0..WORKFLOWS).map(|i| {
|
|
168
185
|
let worker = &worker;
|
|
169
186
|
let wf_id = format!("chunk_activity_{i}");
|
|
187
|
+
let tq = task_queue.clone();
|
|
170
188
|
async move {
|
|
171
189
|
worker
|
|
172
|
-
.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
id_reuse_policy
|
|
178
|
-
|
|
179
|
-
},
|
|
190
|
+
.submit_workflow(
|
|
191
|
+
ChunkyActivityWf::run,
|
|
192
|
+
(),
|
|
193
|
+
WorkflowStartOptions::new(tq, wf_id)
|
|
194
|
+
.id_conflict_policy(WorkflowIdConflictPolicy::TerminateExisting)
|
|
195
|
+
.id_reuse_policy(WorkflowIdReusePolicy::AllowDuplicate)
|
|
196
|
+
.build(),
|
|
180
197
|
)
|
|
181
198
|
.await
|
|
182
199
|
.unwrap();
|
|
@@ -191,9 +208,37 @@ async fn chunky_activities_resource_based() {
|
|
|
191
208
|
dbg!(running.elapsed());
|
|
192
209
|
}
|
|
193
210
|
|
|
211
|
+
#[workflow]
|
|
212
|
+
#[derive(Default)]
|
|
213
|
+
struct WorkflowLoadWf;
|
|
214
|
+
|
|
215
|
+
#[workflow_methods]
|
|
216
|
+
impl WorkflowLoadWf {
|
|
217
|
+
#[run(name = "workflow_load")]
|
|
218
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
219
|
+
for _ in 0..5 {
|
|
220
|
+
let _ = ctx
|
|
221
|
+
.start_activity(
|
|
222
|
+
StdActivities::echo,
|
|
223
|
+
"hi!".to_string(),
|
|
224
|
+
ActivityOptions {
|
|
225
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
226
|
+
..Default::default()
|
|
227
|
+
},
|
|
228
|
+
)
|
|
229
|
+
.await;
|
|
230
|
+
ctx.timer(Duration::from_secs(1)).await;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
Ok(())
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
#[signal]
|
|
237
|
+
fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>) {}
|
|
238
|
+
}
|
|
239
|
+
|
|
194
240
|
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
|
|
195
241
|
async fn workflow_load() {
|
|
196
|
-
const SIGNAME: &str = "signame";
|
|
197
242
|
let num_workflows = 500;
|
|
198
243
|
let wf_name = "workflow_load";
|
|
199
244
|
let (mut telemopts, _, _aborter) = prom_metrics(None);
|
|
@@ -203,68 +248,40 @@ async fn workflow_load() {
|
|
|
203
248
|
init_integ_telem();
|
|
204
249
|
let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
|
|
205
250
|
let mut starter = CoreWfStarter::new_with_runtime("workflow_load", rt);
|
|
206
|
-
starter
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
.max_outstanding_activities(100_usize);
|
|
251
|
+
starter.sdk_config.max_cached_workflows = 200;
|
|
252
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10);
|
|
253
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(5, 100, 100, 100));
|
|
254
|
+
starter.sdk_config.register_activities(StdActivities);
|
|
255
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
212
256
|
let mut worker = starter.worker().await;
|
|
213
|
-
worker.
|
|
214
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
215
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
216
|
-
|
|
217
|
-
let real_stuff = async move {
|
|
218
|
-
for _ in 0..5 {
|
|
219
|
-
ctx.activity(ActivityOptions {
|
|
220
|
-
activity_type: "echo_activity".to_string(),
|
|
221
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
222
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
223
|
-
..Default::default()
|
|
224
|
-
})
|
|
225
|
-
.await;
|
|
226
|
-
ctx.timer(Duration::from_secs(1)).await;
|
|
227
|
-
}
|
|
228
|
-
};
|
|
229
|
-
tokio::select! {
|
|
230
|
-
_ = drained_fut => {}
|
|
231
|
-
_ = real_stuff => {}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
Ok(().into())
|
|
235
|
-
});
|
|
236
|
-
worker.register_activity(
|
|
237
|
-
"echo_activity",
|
|
238
|
-
|_ctx: ActContext, echo_me: String| async move { Ok(echo_me) },
|
|
239
|
-
);
|
|
240
|
-
let client = starter.get_client().await;
|
|
257
|
+
worker.register_workflow::<WorkflowLoadWf>();
|
|
241
258
|
|
|
242
259
|
let mut workflow_handles = vec![];
|
|
243
260
|
for i in 0..num_workflows {
|
|
244
261
|
let wfid = format!("{wf_name}_{i}");
|
|
245
|
-
let
|
|
246
|
-
.
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
WorkflowOptions::default(),
|
|
262
|
+
let handle = worker
|
|
263
|
+
.submit_workflow(
|
|
264
|
+
WorkflowLoadWf::run,
|
|
265
|
+
(),
|
|
266
|
+
WorkflowStartOptions::new(task_queue.clone(), wfid).build(),
|
|
251
267
|
)
|
|
252
268
|
.await
|
|
253
269
|
.unwrap();
|
|
254
|
-
workflow_handles.push(
|
|
270
|
+
workflow_handles.push(handle);
|
|
255
271
|
}
|
|
256
272
|
|
|
257
273
|
let sig_sender = async {
|
|
258
274
|
loop {
|
|
259
|
-
let sends: FuturesUnordered<_> =
|
|
260
|
-
.
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
275
|
+
let sends: FuturesUnordered<_> = workflow_handles
|
|
276
|
+
.iter()
|
|
277
|
+
.map(|handle| async move {
|
|
278
|
+
handle
|
|
279
|
+
.signal(
|
|
280
|
+
WorkflowLoadWf::drain_signal,
|
|
281
|
+
(),
|
|
282
|
+
WorkflowSignalOptions::default(),
|
|
283
|
+
)
|
|
284
|
+
.await
|
|
268
285
|
})
|
|
269
286
|
.collect();
|
|
270
287
|
sends
|
|
@@ -282,51 +299,49 @@ async fn workflow_load() {
|
|
|
282
299
|
async fn evict_while_la_running_no_interference() {
|
|
283
300
|
let wf_name = "evict_while_la_running_no_interference";
|
|
284
301
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
285
|
-
starter
|
|
286
|
-
.worker_config
|
|
287
|
-
.max_outstanding_local_activities(20_usize)
|
|
288
|
-
.max_cached_workflows(20_usize);
|
|
302
|
+
starter.sdk_config.max_cached_workflows = 20;
|
|
289
303
|
// Though it doesn't make sense to set wft higher than cached workflows, leaving this commented
|
|
290
304
|
// introduces more instability that can be useful in the test.
|
|
291
305
|
// starter.max_wft(20);
|
|
306
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(100, 10, 20, 1));
|
|
307
|
+
starter.sdk_config.register_activities(StdActivities);
|
|
308
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
292
309
|
let mut worker = starter.worker().await;
|
|
293
310
|
|
|
294
|
-
worker.
|
|
295
|
-
worker.register_activity("delay", |_: ActContext, _: String| async {
|
|
296
|
-
tokio::time::sleep(Duration::from_secs(15)).await;
|
|
297
|
-
Ok(())
|
|
298
|
-
});
|
|
311
|
+
worker.register_workflow::<LaProblemWorkflow>();
|
|
299
312
|
|
|
300
313
|
let client = starter.get_client().await;
|
|
301
314
|
let subfs = FuturesUnordered::new();
|
|
302
315
|
for i in 1..100 {
|
|
303
316
|
let wf_id = format!("{wf_name}-{i}");
|
|
304
|
-
let
|
|
305
|
-
.
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
WorkflowOptions::default(),
|
|
317
|
+
let handle = worker
|
|
318
|
+
.submit_workflow(
|
|
319
|
+
LaProblemWorkflow::run,
|
|
320
|
+
(),
|
|
321
|
+
WorkflowStartOptions::new(task_queue.clone(), wf_id.clone()).build(),
|
|
310
322
|
)
|
|
311
323
|
.await
|
|
312
324
|
.unwrap();
|
|
313
|
-
let
|
|
325
|
+
let run_id = handle.run_id().unwrap().to_owned();
|
|
326
|
+
let cw = worker.core_worker();
|
|
314
327
|
let client = client.clone();
|
|
315
328
|
subfs.push(async move {
|
|
316
|
-
// Evict the workflow
|
|
317
329
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
318
330
|
cw.request_workflow_eviction(&run_id);
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
)
|
|
328
|
-
|
|
329
|
-
|
|
331
|
+
WorkflowExecutionInfo {
|
|
332
|
+
namespace: client.namespace(),
|
|
333
|
+
workflow_id: wf_id,
|
|
334
|
+
run_id: Some(run_id),
|
|
335
|
+
first_execution_run_id: None,
|
|
336
|
+
}
|
|
337
|
+
.bind_untyped(client)
|
|
338
|
+
.signal(
|
|
339
|
+
UntypedSignal::new("whaatever"),
|
|
340
|
+
RawValue::empty(),
|
|
341
|
+
WorkflowSignalOptions::default(),
|
|
342
|
+
)
|
|
343
|
+
.await
|
|
344
|
+
.unwrap();
|
|
330
345
|
});
|
|
331
346
|
}
|
|
332
347
|
let runf = async {
|
|
@@ -335,49 +350,60 @@ async fn evict_while_la_running_no_interference() {
|
|
|
335
350
|
tokio::join!(subfs.collect::<Vec<_>>(), runf);
|
|
336
351
|
}
|
|
337
352
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
353
|
+
#[workflow]
|
|
354
|
+
#[derive(Default)]
|
|
355
|
+
struct ManyParallelTimersLonghistWf;
|
|
356
|
+
|
|
357
|
+
#[workflow_methods]
|
|
358
|
+
impl ManyParallelTimersLonghistWf {
|
|
359
|
+
#[run(name = "can_paginate_long_history")]
|
|
360
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
361
|
+
for _ in 0..120 {
|
|
362
|
+
let mut futs = vec![];
|
|
363
|
+
for _ in 0..100 {
|
|
364
|
+
futs.push(ctx.timer(Duration::from_millis(100)));
|
|
365
|
+
}
|
|
366
|
+
join_all(futs).await;
|
|
343
367
|
}
|
|
344
|
-
|
|
368
|
+
Ok(())
|
|
345
369
|
}
|
|
346
|
-
Ok(().into())
|
|
347
370
|
}
|
|
348
371
|
|
|
349
372
|
#[tokio::test]
|
|
350
373
|
async fn can_paginate_long_history() {
|
|
351
374
|
let wf_name = "can_paginate_long_history";
|
|
352
375
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
353
|
-
starter
|
|
354
|
-
|
|
355
|
-
.task_types(WorkerTaskTypes::workflow_only())
|
|
356
|
-
// Do not use sticky queues so we are forced to paginate once history gets long
|
|
357
|
-
.max_cached_workflows(0_usize);
|
|
376
|
+
starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
|
|
377
|
+
starter.sdk_config.max_cached_workflows = 0;
|
|
358
378
|
|
|
359
379
|
let mut worker = starter.worker().await;
|
|
360
|
-
worker.
|
|
361
|
-
let
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
380
|
+
worker.register_workflow::<ManyParallelTimersLonghistWf>();
|
|
381
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
382
|
+
let handle = worker
|
|
383
|
+
.submit_workflow(
|
|
384
|
+
ManyParallelTimersLonghistWf::run,
|
|
385
|
+
(),
|
|
386
|
+
WorkflowStartOptions::new(task_queue, wf_name.to_owned()).build(),
|
|
367
387
|
)
|
|
368
388
|
.await
|
|
369
389
|
.unwrap();
|
|
390
|
+
let run_id = handle.run_id().unwrap().to_owned();
|
|
370
391
|
let client = starter.get_client().await;
|
|
371
392
|
tokio::spawn(async move {
|
|
393
|
+
let handle = WorkflowExecutionInfo {
|
|
394
|
+
namespace: client.namespace(),
|
|
395
|
+
workflow_id: wf_name.into(),
|
|
396
|
+
run_id: Some(run_id),
|
|
397
|
+
first_execution_run_id: None,
|
|
398
|
+
}
|
|
399
|
+
.bind_untyped(client);
|
|
372
400
|
loop {
|
|
373
401
|
for _ in 0..10 {
|
|
374
|
-
|
|
375
|
-
.
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
None,
|
|
380
|
-
None,
|
|
402
|
+
handle
|
|
403
|
+
.signal(
|
|
404
|
+
UntypedSignal::new("sig"),
|
|
405
|
+
RawValue::empty(),
|
|
406
|
+
WorkflowSignalOptions::default(),
|
|
381
407
|
)
|
|
382
408
|
.await
|
|
383
409
|
.unwrap();
|
|
@@ -388,84 +414,92 @@ async fn can_paginate_long_history() {
|
|
|
388
414
|
worker.run_until_done().await.unwrap();
|
|
389
415
|
}
|
|
390
416
|
|
|
417
|
+
struct JitteryActivities;
|
|
418
|
+
#[activities]
|
|
419
|
+
impl JitteryActivities {
|
|
420
|
+
#[activity]
|
|
421
|
+
async fn jittery_echo(_ctx: ActivityContext, echo: String) -> Result<String, ActivityError> {
|
|
422
|
+
let rand_millis = rand::rng().random_range(0..500);
|
|
423
|
+
tokio::time::sleep(Duration::from_millis(rand_millis)).await;
|
|
424
|
+
Ok(echo)
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
#[workflow]
|
|
429
|
+
#[derive(Default)]
|
|
430
|
+
struct PollerLoadWf;
|
|
431
|
+
|
|
432
|
+
#[workflow_methods]
|
|
433
|
+
impl PollerLoadWf {
|
|
434
|
+
#[run(name = "poller_load")]
|
|
435
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
436
|
+
for _ in 0..5 {
|
|
437
|
+
let _ = ctx
|
|
438
|
+
.start_activity(
|
|
439
|
+
JitteryActivities::jittery_echo,
|
|
440
|
+
"hi!".to_string(),
|
|
441
|
+
ActivityOptions {
|
|
442
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
443
|
+
..Default::default()
|
|
444
|
+
},
|
|
445
|
+
)
|
|
446
|
+
.await;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
Ok(())
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
#[signal(name = "signame")]
|
|
453
|
+
fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {}
|
|
454
|
+
}
|
|
455
|
+
|
|
391
456
|
#[tokio::test]
|
|
392
457
|
async fn poller_autoscaling_basic_loadtest() {
|
|
393
458
|
const SIGNAME: &str = "signame";
|
|
394
459
|
let num_workflows = 100;
|
|
395
460
|
let wf_name = "poller_load";
|
|
396
461
|
let mut starter = CoreWfStarter::new("poller_load");
|
|
397
|
-
starter
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
});
|
|
462
|
+
starter.sdk_config.max_cached_workflows = 5000;
|
|
463
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1000, 1000, 100, 1));
|
|
464
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
465
|
+
minimum: 1,
|
|
466
|
+
maximum: 200,
|
|
467
|
+
initial: 5,
|
|
468
|
+
};
|
|
469
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
470
|
+
minimum: 1,
|
|
471
|
+
maximum: 200,
|
|
472
|
+
initial: 5,
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
starter.sdk_config.register_activities(JitteryActivities);
|
|
412
476
|
let mut worker = starter.worker().await;
|
|
413
477
|
let shutdown_handle = worker.inner_mut().shutdown_handle();
|
|
414
|
-
worker.
|
|
415
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
416
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
417
|
-
|
|
418
|
-
let real_stuff = async move {
|
|
419
|
-
for _ in 0..5 {
|
|
420
|
-
ctx.activity(ActivityOptions {
|
|
421
|
-
activity_type: "echo".to_string(),
|
|
422
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
423
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
424
|
-
..Default::default()
|
|
425
|
-
})
|
|
426
|
-
.await;
|
|
427
|
-
}
|
|
428
|
-
};
|
|
429
|
-
tokio::select! {
|
|
430
|
-
_ = drained_fut => {}
|
|
431
|
-
_ = real_stuff => {}
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
Ok(().into())
|
|
435
|
-
});
|
|
436
|
-
worker.register_activity("echo", |_: ActContext, echo: String| async move {
|
|
437
|
-
// Add some jitter to completions
|
|
438
|
-
let rand_millis = rand::rng().random_range(0..500);
|
|
439
|
-
tokio::time::sleep(Duration::from_millis(rand_millis)).await;
|
|
440
|
-
Ok(echo)
|
|
441
|
-
});
|
|
478
|
+
worker.register_workflow::<PollerLoadWf>();
|
|
442
479
|
let client = starter.get_client().await;
|
|
443
480
|
|
|
481
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
444
482
|
let mut workflow_handles = vec![];
|
|
445
483
|
for i in 0..num_workflows {
|
|
446
484
|
let wfid = format!("{wf_name}_{i}-{}", rand_6_chars());
|
|
447
|
-
let
|
|
448
|
-
.
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
..Default::default()
|
|
455
|
-
},
|
|
485
|
+
let handle = worker
|
|
486
|
+
.submit_workflow(
|
|
487
|
+
PollerLoadWf::run,
|
|
488
|
+
(),
|
|
489
|
+
WorkflowStartOptions::new(task_queue.clone(), wfid)
|
|
490
|
+
.execution_timeout(Duration::from_secs(120))
|
|
491
|
+
.build(),
|
|
456
492
|
)
|
|
457
493
|
.await
|
|
458
494
|
.unwrap();
|
|
459
|
-
workflow_handles.push(
|
|
495
|
+
workflow_handles.push(handle);
|
|
460
496
|
}
|
|
461
497
|
|
|
462
498
|
let (ah, abort_reg) = AbortHandle::new_pair();
|
|
463
499
|
let all_workflows_are_done = async {
|
|
464
500
|
stream::iter(mem::take(&mut workflow_handles))
|
|
465
501
|
.for_each_concurrent(25, |handle| async move {
|
|
466
|
-
let _ = handle
|
|
467
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
468
|
-
.await;
|
|
502
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
469
503
|
})
|
|
470
504
|
.await;
|
|
471
505
|
ah.abort();
|
|
@@ -477,13 +511,17 @@ async fn poller_autoscaling_basic_loadtest() {
|
|
|
477
511
|
loop {
|
|
478
512
|
let sends: FuturesUnordered<_> = (0..num_workflows)
|
|
479
513
|
.map(|i| {
|
|
480
|
-
|
|
481
|
-
format!("{wf_name}_{i}")
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
514
|
+
let handle =
|
|
515
|
+
client.get_workflow_handle::<UntypedWorkflow>(format!("{wf_name}_{i}"));
|
|
516
|
+
async move {
|
|
517
|
+
handle
|
|
518
|
+
.signal(
|
|
519
|
+
UntypedSignal::new(SIGNAME),
|
|
520
|
+
RawValue::empty(),
|
|
521
|
+
WorkflowSignalOptions::default(),
|
|
522
|
+
)
|
|
523
|
+
.await
|
|
524
|
+
}
|
|
487
525
|
})
|
|
488
526
|
.collect();
|
|
489
527
|
sends
|