@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
|
@@ -12,8 +12,9 @@ mod shared_tests;
|
|
|
12
12
|
|
|
13
13
|
#[cfg(test)]
|
|
14
14
|
mod integ_tests {
|
|
15
|
-
mod
|
|
15
|
+
mod async_activity_client_tests;
|
|
16
16
|
mod client_tests;
|
|
17
|
+
mod data_converter_tests;
|
|
17
18
|
mod ephemeral_server_tests;
|
|
18
19
|
mod heartbeat_tests;
|
|
19
20
|
mod metrics_tests;
|
|
@@ -25,6 +26,7 @@ mod integ_tests {
|
|
|
25
26
|
mod worker_heartbeat_tests;
|
|
26
27
|
mod worker_tests;
|
|
27
28
|
mod worker_versioning_tests;
|
|
29
|
+
mod workflow_client_tests;
|
|
28
30
|
mod workflow_tests;
|
|
29
31
|
|
|
30
32
|
use crate::common::{
|
|
@@ -32,16 +34,19 @@ mod integ_tests {
|
|
|
32
34
|
get_integ_telem_options, rand_6_chars,
|
|
33
35
|
};
|
|
34
36
|
use std::time::Duration;
|
|
35
|
-
use temporalio_client::{
|
|
37
|
+
use temporalio_client::{
|
|
38
|
+
Connection, NamespacedClient,
|
|
39
|
+
grpc::{OperatorService, WorkflowService},
|
|
40
|
+
};
|
|
36
41
|
use temporalio_common::{
|
|
37
42
|
protos::temporal::api::{
|
|
38
43
|
nexus::v1::{EndpointSpec, EndpointTarget, endpoint_target},
|
|
39
44
|
operatorservice::v1::CreateNexusEndpointRequest,
|
|
40
45
|
workflowservice::v1::ListNamespacesRequest,
|
|
41
46
|
},
|
|
42
|
-
worker::
|
|
47
|
+
worker::WorkerTaskTypes,
|
|
43
48
|
};
|
|
44
|
-
use temporalio_sdk_core::{CoreRuntime, init_worker};
|
|
49
|
+
use temporalio_sdk_core::{CoreRuntime, WorkerConfig, WorkerVersioningStrategy, init_worker};
|
|
45
50
|
use tonic::IntoRequest;
|
|
46
51
|
|
|
47
52
|
// Create a worker like a bridge would (unwraps aside)
|
|
@@ -52,25 +57,25 @@ mod integ_tests {
|
|
|
52
57
|
let runtime =
|
|
53
58
|
CoreRuntime::new_assume_tokio(get_integ_runtime_options(get_integ_telem_options()))
|
|
54
59
|
.unwrap();
|
|
55
|
-
let mut
|
|
56
|
-
.connect_no_namespace(runtime.telemetry().get_temporal_metric_meter())
|
|
57
|
-
.await
|
|
58
|
-
.unwrap();
|
|
60
|
+
let mut connection = Connection::connect(opts).await.unwrap();
|
|
59
61
|
|
|
60
62
|
let _worker = init_worker(
|
|
61
63
|
&runtime,
|
|
62
|
-
|
|
64
|
+
WorkerConfig::builder()
|
|
63
65
|
.namespace("default")
|
|
64
66
|
.task_queue("Wheee!")
|
|
67
|
+
.task_types(WorkerTaskTypes::all())
|
|
68
|
+
.versioning_strategy(WorkerVersioningStrategy::None {
|
|
69
|
+
build_id: "test".to_owned(),
|
|
70
|
+
})
|
|
65
71
|
.build()
|
|
66
72
|
.unwrap(),
|
|
67
|
-
// clone the
|
|
68
|
-
|
|
69
|
-
retrying_client.clone(),
|
|
73
|
+
// clone the connection if you intend to use it later
|
|
74
|
+
connection.clone(),
|
|
70
75
|
);
|
|
71
76
|
|
|
72
|
-
// Do things with worker or
|
|
73
|
-
let _ =
|
|
77
|
+
// Do things with worker or connection
|
|
78
|
+
let _ = connection
|
|
74
79
|
.list_namespaces(ListNamespacesRequest::default().into_request())
|
|
75
80
|
.await;
|
|
76
81
|
}
|
|
@@ -78,8 +83,9 @@ mod integ_tests {
|
|
|
78
83
|
pub(crate) async fn mk_nexus_endpoint(starter: &mut CoreWfStarter) -> String {
|
|
79
84
|
let client = starter.get_client().await;
|
|
80
85
|
let endpoint = format!("mycoolendpoint-{}", rand_6_chars());
|
|
81
|
-
|
|
82
|
-
|
|
86
|
+
client
|
|
87
|
+
.connection()
|
|
88
|
+
.clone()
|
|
83
89
|
.create_nexus_endpoint(
|
|
84
90
|
CreateNexusEndpointRequest {
|
|
85
91
|
spec: Some(EndpointSpec {
|
|
@@ -17,20 +17,114 @@ use rand::{Rng, SeedableRng};
|
|
|
17
17
|
use std::{
|
|
18
18
|
mem,
|
|
19
19
|
net::SocketAddr,
|
|
20
|
+
sync::Arc,
|
|
20
21
|
time::{Duration, Instant},
|
|
21
22
|
};
|
|
22
23
|
use temporalio_client::{
|
|
23
|
-
|
|
24
|
+
NamespacedClient, UntypedSignal, UntypedWorkflow, WorkflowExecutionInfo,
|
|
25
|
+
WorkflowGetResultOptions, WorkflowSignalOptions, WorkflowStartOptions,
|
|
24
26
|
};
|
|
25
27
|
use temporalio_common::{
|
|
26
|
-
|
|
27
|
-
telemetry::PrometheusExporterOptionsBuilder,
|
|
28
|
-
worker::{PollerBehavior, WorkerTaskTypes},
|
|
28
|
+
data_converters::RawValue, telemetry::PrometheusExporterOptions, worker::WorkerTaskTypes,
|
|
29
29
|
};
|
|
30
|
-
use
|
|
31
|
-
use
|
|
30
|
+
use temporalio_macros::{activities, workflow, workflow_methods};
|
|
31
|
+
use temporalio_sdk::{
|
|
32
|
+
ActivityOptions, SyncWorkflowContext, WorkflowContext, WorkflowResult,
|
|
33
|
+
activities::{ActivityContext, ActivityError},
|
|
34
|
+
};
|
|
35
|
+
use temporalio_sdk_core::{CoreRuntime, PollerBehavior, TunerHolder};
|
|
32
36
|
use tracing::info;
|
|
33
37
|
|
|
38
|
+
struct JitteryEchoActivities;
|
|
39
|
+
#[activities]
|
|
40
|
+
impl JitteryEchoActivities {
|
|
41
|
+
#[activity]
|
|
42
|
+
async fn echo(_ctx: ActivityContext, echo: String) -> Result<String, ActivityError> {
|
|
43
|
+
// Add some jitter to completions
|
|
44
|
+
let rand_millis = rand::rng().random_range(0..500);
|
|
45
|
+
tokio::time::sleep(Duration::from_millis(rand_millis)).await;
|
|
46
|
+
Ok(echo)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[workflow]
|
|
51
|
+
#[derive(Default)]
|
|
52
|
+
struct PollerLoadSpikyWf;
|
|
53
|
+
|
|
54
|
+
#[workflow_methods]
|
|
55
|
+
impl PollerLoadSpikyWf {
|
|
56
|
+
#[run(name = "poller_load")]
|
|
57
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
58
|
+
for _ in 0..5 {
|
|
59
|
+
let _ = ctx
|
|
60
|
+
.start_activity(
|
|
61
|
+
JitteryEchoActivities::echo,
|
|
62
|
+
"hi!".to_string(),
|
|
63
|
+
ActivityOptions {
|
|
64
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
65
|
+
..Default::default()
|
|
66
|
+
},
|
|
67
|
+
)
|
|
68
|
+
.await;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
Ok(())
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
#[signal(name = "signame")]
|
|
75
|
+
fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#[workflow]
|
|
79
|
+
#[derive(Default)]
|
|
80
|
+
struct PollerLoadSustainedWf;
|
|
81
|
+
|
|
82
|
+
#[workflow_methods]
|
|
83
|
+
impl PollerLoadSustainedWf {
|
|
84
|
+
#[run(name = "poller_load")]
|
|
85
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
86
|
+
let rs = ctx.random_seed();
|
|
87
|
+
let mut rand = rand::rngs::SmallRng::seed_from_u64(rs);
|
|
88
|
+
for _ in 0..100 {
|
|
89
|
+
let jitterms = rand.random_range(1000..3000);
|
|
90
|
+
ctx.timer(Duration::from_millis(jitterms)).await;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
Ok(())
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#[signal(name = "signame")]
|
|
97
|
+
fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
#[workflow]
|
|
101
|
+
#[derive(Default)]
|
|
102
|
+
struct PollerLoadSpikeThenSustainedWf;
|
|
103
|
+
|
|
104
|
+
#[workflow_methods]
|
|
105
|
+
impl PollerLoadSpikeThenSustainedWf {
|
|
106
|
+
#[run(name = "poller_load")]
|
|
107
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
108
|
+
for _ in 0..5 {
|
|
109
|
+
let _ = ctx
|
|
110
|
+
.start_activity(
|
|
111
|
+
JitteryEchoActivities::echo,
|
|
112
|
+
"hi!".to_string(),
|
|
113
|
+
ActivityOptions {
|
|
114
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
115
|
+
..Default::default()
|
|
116
|
+
},
|
|
117
|
+
)
|
|
118
|
+
.await;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
Ok(())
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
#[signal(name = "signame")]
|
|
125
|
+
fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {}
|
|
126
|
+
}
|
|
127
|
+
|
|
34
128
|
#[tokio::test]
|
|
35
129
|
async fn poller_load_spiky() {
|
|
36
130
|
const SIGNAME: &str = "signame";
|
|
@@ -39,62 +133,34 @@ async fn poller_load_spiky() {
|
|
|
39
133
|
let (telemopts, addr, _aborter) =
|
|
40
134
|
if std::env::var("PAR_JOBNUM").unwrap_or("1".to_string()) == "1" {
|
|
41
135
|
prom_metrics(Some(
|
|
42
|
-
|
|
136
|
+
PrometheusExporterOptions::builder()
|
|
43
137
|
.socket_addr(SocketAddr::V4("0.0.0.0:9999".parse().unwrap()))
|
|
44
|
-
.build()
|
|
45
|
-
.unwrap(),
|
|
138
|
+
.build(),
|
|
46
139
|
))
|
|
47
140
|
} else {
|
|
48
141
|
prom_metrics(None)
|
|
49
142
|
};
|
|
50
143
|
let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
|
|
51
144
|
let mut starter = CoreWfStarter::new_with_runtime("poller_load", rt);
|
|
52
|
-
starter
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
maximum: 200,
|
|
65
|
-
initial: 5,
|
|
66
|
-
});
|
|
145
|
+
starter.sdk_config.max_cached_workflows = 5000;
|
|
146
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1000, 1000, 100, 100));
|
|
147
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
148
|
+
minimum: 1,
|
|
149
|
+
maximum: 200,
|
|
150
|
+
initial: 5,
|
|
151
|
+
};
|
|
152
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
153
|
+
minimum: 1,
|
|
154
|
+
maximum: 200,
|
|
155
|
+
initial: 5,
|
|
156
|
+
};
|
|
67
157
|
let mut worker = starter.worker().await;
|
|
68
158
|
let submitter = worker.get_submitter_handle();
|
|
69
|
-
worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
|
|
70
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
71
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
72
|
-
|
|
73
|
-
let real_stuff = async move {
|
|
74
|
-
for _ in 0..5 {
|
|
75
|
-
ctx.activity(ActivityOptions {
|
|
76
|
-
activity_type: "echo".to_string(),
|
|
77
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
78
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
79
|
-
..Default::default()
|
|
80
|
-
})
|
|
81
|
-
.await;
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
tokio::select! {
|
|
85
|
-
_ = drained_fut => {}
|
|
86
|
-
_ = real_stuff => {}
|
|
87
|
-
}
|
|
88
159
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
worker.register_activity("echo", |_: ActContext, echo: String| async move {
|
|
92
|
-
// Add some jitter to completions
|
|
93
|
-
let rand_millis = rand::rng().random_range(0..500);
|
|
94
|
-
tokio::time::sleep(Duration::from_millis(rand_millis)).await;
|
|
95
|
-
Ok(echo)
|
|
96
|
-
});
|
|
160
|
+
worker.register_activities(JitteryEchoActivities);
|
|
161
|
+
worker.register_workflow::<PollerLoadSpikyWf>();
|
|
97
162
|
let client = starter.get_client().await;
|
|
163
|
+
let tq = starter.get_task_queue().to_owned();
|
|
98
164
|
|
|
99
165
|
info!("Prom bound to {:?}", addr);
|
|
100
166
|
|
|
@@ -104,17 +170,23 @@ async fn poller_load_spiky() {
|
|
|
104
170
|
let wfid = format!("{wf_name}_{i}-{}", rand_6_chars());
|
|
105
171
|
let rid = worker
|
|
106
172
|
.submit_wf(
|
|
107
|
-
wfid.clone(),
|
|
108
173
|
wf_name.to_owned(),
|
|
109
174
|
vec![],
|
|
110
|
-
|
|
111
|
-
execution_timeout
|
|
112
|
-
|
|
113
|
-
},
|
|
175
|
+
WorkflowStartOptions::new(tq.clone(), wfid.clone())
|
|
176
|
+
.execution_timeout(Duration::from_secs(120))
|
|
177
|
+
.build(),
|
|
114
178
|
)
|
|
115
179
|
.await
|
|
116
180
|
.unwrap();
|
|
117
|
-
workflow_handles.push(
|
|
181
|
+
workflow_handles.push(
|
|
182
|
+
WorkflowExecutionInfo {
|
|
183
|
+
namespace: client.namespace(),
|
|
184
|
+
workflow_id: wfid,
|
|
185
|
+
run_id: Some(rid),
|
|
186
|
+
first_execution_run_id: None,
|
|
187
|
+
}
|
|
188
|
+
.bind_untyped(client.clone()),
|
|
189
|
+
);
|
|
118
190
|
}
|
|
119
191
|
info!("Done starting workflows");
|
|
120
192
|
let start_processing = Instant::now();
|
|
@@ -123,9 +195,7 @@ async fn poller_load_spiky() {
|
|
|
123
195
|
let all_workflows_are_done = async {
|
|
124
196
|
stream::iter(mem::take(&mut workflow_handles))
|
|
125
197
|
.for_each_concurrent(25, |handle| async move {
|
|
126
|
-
let _ = handle
|
|
127
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
128
|
-
.await;
|
|
198
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
129
199
|
})
|
|
130
200
|
.await;
|
|
131
201
|
info!("Initial load ran for {:?}", start_processing.elapsed());
|
|
@@ -138,23 +208,27 @@ async fn poller_load_spiky() {
|
|
|
138
208
|
let wfid = format!("{wf_name}_2_{i}-{}", rand_6_chars());
|
|
139
209
|
let rid = submitter
|
|
140
210
|
.submit_wf(
|
|
141
|
-
wfid.clone(),
|
|
142
211
|
wf_name.to_owned(),
|
|
143
212
|
vec![],
|
|
144
|
-
|
|
145
|
-
execution_timeout
|
|
146
|
-
|
|
147
|
-
},
|
|
213
|
+
WorkflowStartOptions::new(tq.clone(), wfid.clone())
|
|
214
|
+
.execution_timeout(Duration::from_secs(120))
|
|
215
|
+
.build(),
|
|
148
216
|
)
|
|
149
217
|
.await
|
|
150
218
|
.unwrap();
|
|
151
|
-
workflow_handles.push(
|
|
219
|
+
workflow_handles.push(
|
|
220
|
+
WorkflowExecutionInfo {
|
|
221
|
+
namespace: client.namespace(),
|
|
222
|
+
workflow_id: wfid,
|
|
223
|
+
run_id: Some(rid),
|
|
224
|
+
first_execution_run_id: None,
|
|
225
|
+
}
|
|
226
|
+
.bind_untyped(client.clone()),
|
|
227
|
+
);
|
|
152
228
|
}
|
|
153
229
|
stream::iter(workflow_handles)
|
|
154
230
|
.for_each_concurrent(25, |handle| async move {
|
|
155
|
-
let _ = handle
|
|
156
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
157
|
-
.await;
|
|
231
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
158
232
|
})
|
|
159
233
|
.await;
|
|
160
234
|
info!("Second load ran for {:?}", start_processing.elapsed());
|
|
@@ -167,13 +241,17 @@ async fn poller_load_spiky() {
|
|
|
167
241
|
loop {
|
|
168
242
|
let sends: FuturesUnordered<_> = (0..num_workflows)
|
|
169
243
|
.map(|i| {
|
|
170
|
-
|
|
171
|
-
format!("{wf_name}_{i}")
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
244
|
+
let handle =
|
|
245
|
+
client.get_workflow_handle::<UntypedWorkflow>(format!("{wf_name}_{i}"));
|
|
246
|
+
async move {
|
|
247
|
+
handle
|
|
248
|
+
.signal(
|
|
249
|
+
UntypedSignal::new(SIGNAME),
|
|
250
|
+
RawValue::empty(),
|
|
251
|
+
WorkflowSignalOptions::default(),
|
|
252
|
+
)
|
|
253
|
+
.await
|
|
254
|
+
}
|
|
177
255
|
})
|
|
178
256
|
.collect();
|
|
179
257
|
sends
|
|
@@ -192,53 +270,32 @@ async fn poller_load_spiky() {
|
|
|
192
270
|
|
|
193
271
|
#[tokio::test]
|
|
194
272
|
async fn poller_load_sustained() {
|
|
195
|
-
const SIGNAME: &str = "signame";
|
|
196
273
|
let num_workflows = 150;
|
|
197
274
|
let wf_name = "poller_load";
|
|
198
275
|
let (telemopts, addr, _aborter) =
|
|
199
276
|
if std::env::var("PAR_JOBNUM").unwrap_or("1".to_string()) == "1" {
|
|
200
277
|
prom_metrics(Some(
|
|
201
|
-
|
|
278
|
+
PrometheusExporterOptions::builder()
|
|
202
279
|
.socket_addr(SocketAddr::V4("0.0.0.0:9999".parse().unwrap()))
|
|
203
|
-
.build()
|
|
204
|
-
.unwrap(),
|
|
280
|
+
.build(),
|
|
205
281
|
))
|
|
206
282
|
} else {
|
|
207
283
|
prom_metrics(None)
|
|
208
284
|
};
|
|
209
285
|
let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
|
|
210
286
|
let mut starter = CoreWfStarter::new_with_runtime("poller_load", rt);
|
|
211
|
-
starter
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
})
|
|
220
|
-
.task_types(WorkerTaskTypes::workflow_only());
|
|
287
|
+
starter.sdk_config.max_cached_workflows = 5000;
|
|
288
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1000, 100, 100, 100));
|
|
289
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
290
|
+
minimum: 1,
|
|
291
|
+
maximum: 200,
|
|
292
|
+
initial: 5,
|
|
293
|
+
};
|
|
294
|
+
starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
|
|
221
295
|
let mut worker = starter.worker().await;
|
|
222
|
-
worker.
|
|
223
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
224
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
225
|
-
|
|
226
|
-
let real_stuff = async move {
|
|
227
|
-
let rs = ctx.random_seed();
|
|
228
|
-
let mut rand = rand::rngs::SmallRng::seed_from_u64(rs);
|
|
229
|
-
for _ in 0..100 {
|
|
230
|
-
let jitterms = rand.random_range(1000..3000);
|
|
231
|
-
ctx.timer(Duration::from_millis(jitterms)).await;
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
tokio::select! {
|
|
235
|
-
_ = drained_fut => {}
|
|
236
|
-
_ = real_stuff => {}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
Ok(().into())
|
|
240
|
-
});
|
|
296
|
+
worker.register_workflow::<PollerLoadSustainedWf>();
|
|
241
297
|
let client = starter.get_client().await;
|
|
298
|
+
let tq = starter.get_task_queue().to_owned();
|
|
242
299
|
|
|
243
300
|
info!("Prom bound to {:?}", addr);
|
|
244
301
|
|
|
@@ -248,17 +305,23 @@ async fn poller_load_sustained() {
|
|
|
248
305
|
let wfid = format!("{wf_name}_{i}-{}", rand_6_chars());
|
|
249
306
|
let rid = worker
|
|
250
307
|
.submit_wf(
|
|
251
|
-
wfid.clone(),
|
|
252
308
|
wf_name.to_owned(),
|
|
253
309
|
vec![],
|
|
254
|
-
|
|
255
|
-
execution_timeout
|
|
256
|
-
|
|
257
|
-
},
|
|
310
|
+
WorkflowStartOptions::new(tq.clone(), wfid.clone())
|
|
311
|
+
.execution_timeout(Duration::from_secs(800))
|
|
312
|
+
.build(),
|
|
258
313
|
)
|
|
259
314
|
.await
|
|
260
315
|
.unwrap();
|
|
261
|
-
workflow_handles.push(
|
|
316
|
+
workflow_handles.push(
|
|
317
|
+
WorkflowExecutionInfo {
|
|
318
|
+
namespace: client.namespace(),
|
|
319
|
+
workflow_id: wfid,
|
|
320
|
+
run_id: Some(rid),
|
|
321
|
+
first_execution_run_id: None,
|
|
322
|
+
}
|
|
323
|
+
.bind_untyped(client.clone()),
|
|
324
|
+
);
|
|
262
325
|
}
|
|
263
326
|
info!("Done starting workflows");
|
|
264
327
|
let start_processing = Instant::now();
|
|
@@ -266,9 +329,7 @@ async fn poller_load_sustained() {
|
|
|
266
329
|
let all_workflows_are_done = async {
|
|
267
330
|
stream::iter(mem::take(&mut workflow_handles))
|
|
268
331
|
.for_each_concurrent(25, |handle| async move {
|
|
269
|
-
let _ = handle
|
|
270
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
271
|
-
.await;
|
|
332
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
272
333
|
})
|
|
273
334
|
.await;
|
|
274
335
|
info!("Initial load ran for {:?}", start_processing.elapsed());
|
|
@@ -289,61 +350,34 @@ async fn poller_load_spike_then_sustained() {
|
|
|
289
350
|
let (telemopts, addr, _aborter) =
|
|
290
351
|
if std::env::var("PAR_JOBNUM").unwrap_or("1".to_string()) == "1" {
|
|
291
352
|
prom_metrics(Some(
|
|
292
|
-
|
|
353
|
+
PrometheusExporterOptions::builder()
|
|
293
354
|
.socket_addr(SocketAddr::V4("0.0.0.0:9999".parse().unwrap()))
|
|
294
|
-
.build()
|
|
295
|
-
.unwrap(),
|
|
355
|
+
.build(),
|
|
296
356
|
))
|
|
297
357
|
} else {
|
|
298
358
|
prom_metrics(None)
|
|
299
359
|
};
|
|
300
360
|
let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
|
|
301
361
|
let mut starter = CoreWfStarter::new_with_runtime("poller_load", rt);
|
|
302
|
-
starter
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
initial: 5,
|
|
315
|
-
});
|
|
362
|
+
starter.sdk_config.max_cached_workflows = 5000;
|
|
363
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1000, 100, 100, 100));
|
|
364
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
365
|
+
minimum: 1,
|
|
366
|
+
maximum: 200,
|
|
367
|
+
initial: 5,
|
|
368
|
+
};
|
|
369
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
370
|
+
minimum: 1,
|
|
371
|
+
maximum: 200,
|
|
372
|
+
initial: 5,
|
|
373
|
+
};
|
|
316
374
|
let mut worker = starter.worker().await;
|
|
317
375
|
let submitter = worker.get_submitter_handle();
|
|
318
|
-
worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
|
|
319
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
320
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
321
|
-
|
|
322
|
-
let real_stuff = async move {
|
|
323
|
-
for _ in 0..5 {
|
|
324
|
-
ctx.activity(ActivityOptions {
|
|
325
|
-
activity_type: "echo".to_string(),
|
|
326
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
327
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
328
|
-
..Default::default()
|
|
329
|
-
})
|
|
330
|
-
.await;
|
|
331
|
-
}
|
|
332
|
-
};
|
|
333
|
-
tokio::select! {
|
|
334
|
-
_ = drained_fut => {}
|
|
335
|
-
_ = real_stuff => {}
|
|
336
|
-
}
|
|
337
376
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
worker.register_activity("echo", |_: ActContext, echo: String| async move {
|
|
341
|
-
// Add some jitter to completions
|
|
342
|
-
let rand_millis = rand::rng().random_range(0..500);
|
|
343
|
-
tokio::time::sleep(Duration::from_millis(rand_millis)).await;
|
|
344
|
-
Ok(echo)
|
|
345
|
-
});
|
|
377
|
+
worker.register_activities(JitteryEchoActivities);
|
|
378
|
+
worker.register_workflow::<PollerLoadSpikeThenSustainedWf>();
|
|
346
379
|
let client = starter.get_client().await;
|
|
380
|
+
let tq = starter.get_task_queue().to_owned();
|
|
347
381
|
|
|
348
382
|
info!("Prom bound to {:?}", addr);
|
|
349
383
|
|
|
@@ -353,17 +387,23 @@ async fn poller_load_spike_then_sustained() {
|
|
|
353
387
|
let wfid = format!("{wf_name}_{i}-{}", rand_6_chars());
|
|
354
388
|
let rid = worker
|
|
355
389
|
.submit_wf(
|
|
356
|
-
wfid.clone(),
|
|
357
390
|
wf_name.to_owned(),
|
|
358
391
|
vec![],
|
|
359
|
-
|
|
360
|
-
execution_timeout
|
|
361
|
-
|
|
362
|
-
},
|
|
392
|
+
WorkflowStartOptions::new(tq.clone(), wfid.clone())
|
|
393
|
+
.execution_timeout(Duration::from_secs(100))
|
|
394
|
+
.build(),
|
|
363
395
|
)
|
|
364
396
|
.await
|
|
365
397
|
.unwrap();
|
|
366
|
-
workflow_handles.push(
|
|
398
|
+
workflow_handles.push(
|
|
399
|
+
WorkflowExecutionInfo {
|
|
400
|
+
namespace: client.namespace(),
|
|
401
|
+
workflow_id: wfid,
|
|
402
|
+
run_id: Some(rid),
|
|
403
|
+
first_execution_run_id: None,
|
|
404
|
+
}
|
|
405
|
+
.bind_untyped(client.clone()),
|
|
406
|
+
);
|
|
367
407
|
}
|
|
368
408
|
info!("Done starting workflows");
|
|
369
409
|
let start_processing = Instant::now();
|
|
@@ -372,9 +412,7 @@ async fn poller_load_spike_then_sustained() {
|
|
|
372
412
|
let all_workflows_are_done = async {
|
|
373
413
|
stream::iter(mem::take(&mut workflow_handles))
|
|
374
414
|
.for_each_concurrent(25, |handle| async move {
|
|
375
|
-
let _ = handle
|
|
376
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
377
|
-
.await;
|
|
415
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
378
416
|
})
|
|
379
417
|
.await;
|
|
380
418
|
info!("Initial load ran for {:?}", start_processing.elapsed());
|
|
@@ -386,24 +424,28 @@ async fn poller_load_spike_then_sustained() {
|
|
|
386
424
|
let wfid = format!("{wf_name}_2_{i}-{}", rand_6_chars());
|
|
387
425
|
let rid = submitter
|
|
388
426
|
.submit_wf(
|
|
389
|
-
wfid.clone(),
|
|
390
427
|
wf_name.to_owned(),
|
|
391
428
|
vec![],
|
|
392
|
-
|
|
393
|
-
execution_timeout
|
|
394
|
-
|
|
395
|
-
},
|
|
429
|
+
WorkflowStartOptions::new(tq.clone(), wfid.clone())
|
|
430
|
+
.execution_timeout(Duration::from_secs(100))
|
|
431
|
+
.build(),
|
|
396
432
|
)
|
|
397
433
|
.await
|
|
398
434
|
.unwrap();
|
|
399
|
-
workflow_handles.push(
|
|
435
|
+
workflow_handles.push(
|
|
436
|
+
WorkflowExecutionInfo {
|
|
437
|
+
namespace: client.namespace(),
|
|
438
|
+
workflow_id: wfid,
|
|
439
|
+
run_id: Some(rid),
|
|
440
|
+
first_execution_run_id: None,
|
|
441
|
+
}
|
|
442
|
+
.bind_untyped(client.clone()),
|
|
443
|
+
);
|
|
400
444
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
401
445
|
}
|
|
402
446
|
stream::iter(workflow_handles)
|
|
403
447
|
.for_each_concurrent(25, |handle| async move {
|
|
404
|
-
let _ = handle
|
|
405
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
406
|
-
.await;
|
|
448
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
407
449
|
})
|
|
408
450
|
.await;
|
|
409
451
|
info!("Second load ran for {:?}", start_processing.elapsed());
|
|
@@ -416,13 +458,17 @@ async fn poller_load_spike_then_sustained() {
|
|
|
416
458
|
loop {
|
|
417
459
|
let sends: FuturesUnordered<_> = (0..num_workflows)
|
|
418
460
|
.map(|i| {
|
|
419
|
-
|
|
420
|
-
format!("{wf_name}_{i}")
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
461
|
+
let handle =
|
|
462
|
+
client.get_workflow_handle::<UntypedWorkflow>(format!("{wf_name}_{i}"));
|
|
463
|
+
async move {
|
|
464
|
+
handle
|
|
465
|
+
.signal(
|
|
466
|
+
UntypedSignal::new(SIGNAME),
|
|
467
|
+
RawValue::empty(),
|
|
468
|
+
WorkflowSignalOptions::default(),
|
|
469
|
+
)
|
|
470
|
+
.await
|
|
471
|
+
}
|
|
426
472
|
})
|
|
427
473
|
.collect();
|
|
428
474
|
sends
|