@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
|
@@ -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,73 +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
|
-
starter.
|
|
45
|
-
starter.
|
|
46
|
-
|
|
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();
|
|
47
90
|
let mut worker = starter.worker().await;
|
|
48
91
|
|
|
49
|
-
let activity_id = "act-1";
|
|
50
|
-
let activity_timeout = Duration::from_secs(8);
|
|
51
|
-
let task_queue = Some(starter.get_task_queue().to_owned());
|
|
52
|
-
|
|
53
|
-
let wf_fn = move |ctx: WfContext| {
|
|
54
|
-
let task_queue = task_queue.clone();
|
|
55
|
-
let payload = "yo".as_json_payload().unwrap();
|
|
56
|
-
async move {
|
|
57
|
-
let activity = ActivityOptions {
|
|
58
|
-
activity_id: Some(activity_id.to_string()),
|
|
59
|
-
activity_type: "test_activity".to_string(),
|
|
60
|
-
input: payload.clone(),
|
|
61
|
-
task_queue,
|
|
62
|
-
schedule_to_start_timeout: Some(activity_timeout),
|
|
63
|
-
start_to_close_timeout: Some(activity_timeout),
|
|
64
|
-
schedule_to_close_timeout: Some(activity_timeout),
|
|
65
|
-
heartbeat_timeout: Some(activity_timeout),
|
|
66
|
-
cancellation_type: ActivityCancellationType::TryCancel,
|
|
67
|
-
..Default::default()
|
|
68
|
-
};
|
|
69
|
-
let res = ctx.activity(activity).await.unwrap_ok_payload();
|
|
70
|
-
assert_eq!(res.data, payload.data);
|
|
71
|
-
Ok(().into())
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
92
|
let starting = Instant::now();
|
|
76
|
-
|
|
77
|
-
worker.register_wf(wf_type.to_owned(), wf_fn);
|
|
78
|
-
worker.register_activity(
|
|
79
|
-
"test_activity",
|
|
80
|
-
|_ctx: ActContext, echo: String| async move { Ok(echo) },
|
|
81
|
-
);
|
|
93
|
+
worker.register_workflow::<ActivityLoadWf>();
|
|
82
94
|
join_all((0..CONCURRENCY).map(|i| {
|
|
83
95
|
let worker = &worker;
|
|
84
96
|
let wf_id = format!("activity_load_{i}");
|
|
97
|
+
let tq = task_queue.clone();
|
|
85
98
|
async move {
|
|
86
99
|
worker
|
|
87
|
-
.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
WorkflowOptions::default(),
|
|
100
|
+
.submit_workflow(
|
|
101
|
+
ActivityLoadWf::run,
|
|
102
|
+
tq.clone(),
|
|
103
|
+
WorkflowStartOptions::new(tq, wf_id).build(),
|
|
92
104
|
)
|
|
93
105
|
.await
|
|
94
106
|
.unwrap();
|
|
@@ -103,17 +115,56 @@ async fn activity_load() {
|
|
|
103
115
|
dbg!(running.elapsed());
|
|
104
116
|
}
|
|
105
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
|
+
|
|
106
161
|
#[tokio::test]
|
|
107
162
|
async fn chunky_activities_resource_based() {
|
|
108
163
|
const WORKFLOWS: usize = 100;
|
|
109
164
|
|
|
110
165
|
let mut starter = CoreWfStarter::new("chunky_activities_resource_based");
|
|
111
|
-
starter.
|
|
112
|
-
starter.
|
|
113
|
-
starter.worker_config.max_outstanding_activities = None;
|
|
114
|
-
starter.worker_config.max_outstanding_nexus_tasks = None;
|
|
115
|
-
starter.worker_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
|
|
116
|
-
starter.worker_config.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);
|
|
117
168
|
let mut tuner = ResourceBasedTuner::new(0.7, 0.7);
|
|
118
169
|
tuner
|
|
119
170
|
.with_workflow_slots_options(ResourceSlotOptions::new(
|
|
@@ -122,61 +173,27 @@ async fn chunky_activities_resource_based() {
|
|
|
122
173
|
Duration::from_millis(0),
|
|
123
174
|
))
|
|
124
175
|
.with_activity_slots_options(ResourceSlotOptions::new(5, 1000, Duration::from_millis(50)));
|
|
125
|
-
starter.
|
|
126
|
-
let mut worker = starter.worker().await;
|
|
127
|
-
|
|
128
|
-
let activity_id = "act-1";
|
|
129
|
-
let activity_timeout = Duration::from_secs(30);
|
|
176
|
+
starter.sdk_config.tuner = Arc::new(tuner);
|
|
130
177
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
let activity = ActivityOptions {
|
|
135
|
-
activity_id: Some(activity_id.to_string()),
|
|
136
|
-
activity_type: "test_activity".to_string(),
|
|
137
|
-
input: payload.clone(),
|
|
138
|
-
start_to_close_timeout: Some(activity_timeout),
|
|
139
|
-
..Default::default()
|
|
140
|
-
};
|
|
141
|
-
let res = ctx.activity(activity).await.unwrap_ok_payload();
|
|
142
|
-
assert_eq!(res.data, payload.data);
|
|
143
|
-
Ok(().into())
|
|
144
|
-
}
|
|
145
|
-
};
|
|
178
|
+
starter.sdk_config.register_activities(ChunkyActivities);
|
|
179
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
180
|
+
let mut worker = starter.worker().await;
|
|
146
181
|
|
|
147
182
|
let starting = Instant::now();
|
|
148
|
-
|
|
149
|
-
worker.register_wf(wf_type.to_owned(), wf_fn);
|
|
150
|
-
worker.register_activity(
|
|
151
|
-
"test_activity",
|
|
152
|
-
|_ctx: ActContext, echo: String| async move {
|
|
153
|
-
tokio::task::spawn_blocking(move || {
|
|
154
|
-
// Allocate a gig and then do some CPU stuff on it
|
|
155
|
-
let mut mem = vec![0_u8; 1000 * 1024 * 1024];
|
|
156
|
-
for _ in 1..10 {
|
|
157
|
-
for i in 0..mem.len() {
|
|
158
|
-
mem[i] &= mem[mem.len() - 1 - i]
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
Ok(echo)
|
|
162
|
-
})
|
|
163
|
-
.await?
|
|
164
|
-
},
|
|
165
|
-
);
|
|
183
|
+
worker.register_workflow::<ChunkyActivityWf>();
|
|
166
184
|
join_all((0..WORKFLOWS).map(|i| {
|
|
167
185
|
let worker = &worker;
|
|
168
186
|
let wf_id = format!("chunk_activity_{i}");
|
|
187
|
+
let tq = task_queue.clone();
|
|
169
188
|
async move {
|
|
170
189
|
worker
|
|
171
|
-
.
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
..Default::default()
|
|
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,66 +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
|
-
starter.
|
|
208
|
-
starter.
|
|
209
|
-
starter.
|
|
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();
|
|
210
256
|
let mut worker = starter.worker().await;
|
|
211
|
-
worker.
|
|
212
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
213
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
214
|
-
|
|
215
|
-
let real_stuff = async move {
|
|
216
|
-
for _ in 0..5 {
|
|
217
|
-
ctx.activity(ActivityOptions {
|
|
218
|
-
activity_type: "echo_activity".to_string(),
|
|
219
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
220
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
221
|
-
..Default::default()
|
|
222
|
-
})
|
|
223
|
-
.await;
|
|
224
|
-
ctx.timer(Duration::from_secs(1)).await;
|
|
225
|
-
}
|
|
226
|
-
};
|
|
227
|
-
tokio::select! {
|
|
228
|
-
_ = drained_fut => {}
|
|
229
|
-
_ = real_stuff => {}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
Ok(().into())
|
|
233
|
-
});
|
|
234
|
-
worker.register_activity(
|
|
235
|
-
"echo_activity",
|
|
236
|
-
|_ctx: ActContext, echo_me: String| async move { Ok(echo_me) },
|
|
237
|
-
);
|
|
238
|
-
let client = starter.get_client().await;
|
|
257
|
+
worker.register_workflow::<WorkflowLoadWf>();
|
|
239
258
|
|
|
240
259
|
let mut workflow_handles = vec![];
|
|
241
260
|
for i in 0..num_workflows {
|
|
242
261
|
let wfid = format!("{wf_name}_{i}");
|
|
243
|
-
let
|
|
244
|
-
.
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
WorkflowOptions::default(),
|
|
262
|
+
let handle = worker
|
|
263
|
+
.submit_workflow(
|
|
264
|
+
WorkflowLoadWf::run,
|
|
265
|
+
(),
|
|
266
|
+
WorkflowStartOptions::new(task_queue.clone(), wfid).build(),
|
|
249
267
|
)
|
|
250
268
|
.await
|
|
251
269
|
.unwrap();
|
|
252
|
-
workflow_handles.push(
|
|
270
|
+
workflow_handles.push(handle);
|
|
253
271
|
}
|
|
254
272
|
|
|
255
273
|
let sig_sender = async {
|
|
256
274
|
loop {
|
|
257
|
-
let sends: FuturesUnordered<_> =
|
|
258
|
-
.
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
|
266
285
|
})
|
|
267
286
|
.collect();
|
|
268
287
|
sends
|
|
@@ -280,49 +299,49 @@ async fn workflow_load() {
|
|
|
280
299
|
async fn evict_while_la_running_no_interference() {
|
|
281
300
|
let wf_name = "evict_while_la_running_no_interference";
|
|
282
301
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
283
|
-
starter.
|
|
284
|
-
starter.worker_config.max_cached_workflows = 20;
|
|
302
|
+
starter.sdk_config.max_cached_workflows = 20;
|
|
285
303
|
// Though it doesn't make sense to set wft higher than cached workflows, leaving this commented
|
|
286
304
|
// introduces more instability that can be useful in the test.
|
|
287
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();
|
|
288
309
|
let mut worker = starter.worker().await;
|
|
289
310
|
|
|
290
|
-
worker.
|
|
291
|
-
worker.register_activity("delay", |_: ActContext, _: String| async {
|
|
292
|
-
tokio::time::sleep(Duration::from_secs(15)).await;
|
|
293
|
-
Ok(())
|
|
294
|
-
});
|
|
311
|
+
worker.register_workflow::<LaProblemWorkflow>();
|
|
295
312
|
|
|
296
313
|
let client = starter.get_client().await;
|
|
297
314
|
let subfs = FuturesUnordered::new();
|
|
298
315
|
for i in 1..100 {
|
|
299
316
|
let wf_id = format!("{wf_name}-{i}");
|
|
300
|
-
let
|
|
301
|
-
.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
WorkflowOptions::default(),
|
|
317
|
+
let handle = worker
|
|
318
|
+
.submit_workflow(
|
|
319
|
+
LaProblemWorkflow::run,
|
|
320
|
+
(),
|
|
321
|
+
WorkflowStartOptions::new(task_queue.clone(), wf_id.clone()).build(),
|
|
306
322
|
)
|
|
307
323
|
.await
|
|
308
324
|
.unwrap();
|
|
309
|
-
let
|
|
325
|
+
let run_id = handle.run_id().unwrap().to_owned();
|
|
326
|
+
let cw = worker.core_worker();
|
|
310
327
|
let client = client.clone();
|
|
311
328
|
subfs.push(async move {
|
|
312
|
-
// Evict the workflow
|
|
313
329
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
314
330
|
cw.request_workflow_eviction(&run_id);
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
|
|
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();
|
|
326
345
|
});
|
|
327
346
|
}
|
|
328
347
|
let runf = async {
|
|
@@ -331,47 +350,60 @@ async fn evict_while_la_running_no_interference() {
|
|
|
331
350
|
tokio::join!(subfs.collect::<Vec<_>>(), runf);
|
|
332
351
|
}
|
|
333
352
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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;
|
|
339
367
|
}
|
|
340
|
-
|
|
368
|
+
Ok(())
|
|
341
369
|
}
|
|
342
|
-
Ok(().into())
|
|
343
370
|
}
|
|
344
371
|
|
|
345
372
|
#[tokio::test]
|
|
346
373
|
async fn can_paginate_long_history() {
|
|
347
374
|
let wf_name = "can_paginate_long_history";
|
|
348
375
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
349
|
-
starter.
|
|
350
|
-
|
|
351
|
-
starter.worker_config.max_cached_workflows = 0;
|
|
376
|
+
starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
|
|
377
|
+
starter.sdk_config.max_cached_workflows = 0;
|
|
352
378
|
|
|
353
379
|
let mut worker = starter.worker().await;
|
|
354
|
-
worker.
|
|
355
|
-
let
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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(),
|
|
361
387
|
)
|
|
362
388
|
.await
|
|
363
389
|
.unwrap();
|
|
390
|
+
let run_id = handle.run_id().unwrap().to_owned();
|
|
364
391
|
let client = starter.get_client().await;
|
|
365
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);
|
|
366
400
|
loop {
|
|
367
401
|
for _ in 0..10 {
|
|
368
|
-
|
|
369
|
-
.
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
None,
|
|
374
|
-
None,
|
|
402
|
+
handle
|
|
403
|
+
.signal(
|
|
404
|
+
UntypedSignal::new("sig"),
|
|
405
|
+
RawValue::empty(),
|
|
406
|
+
WorkflowSignalOptions::default(),
|
|
375
407
|
)
|
|
376
408
|
.await
|
|
377
409
|
.unwrap();
|
|
@@ -382,82 +414,92 @@ async fn can_paginate_long_history() {
|
|
|
382
414
|
worker.run_until_done().await.unwrap();
|
|
383
415
|
}
|
|
384
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
|
+
|
|
385
456
|
#[tokio::test]
|
|
386
457
|
async fn poller_autoscaling_basic_loadtest() {
|
|
387
458
|
const SIGNAME: &str = "signame";
|
|
388
459
|
let num_workflows = 100;
|
|
389
460
|
let wf_name = "poller_load";
|
|
390
461
|
let mut starter = CoreWfStarter::new("poller_load");
|
|
391
|
-
starter.
|
|
392
|
-
starter.
|
|
393
|
-
starter.
|
|
394
|
-
starter.worker_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
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 {
|
|
395
465
|
minimum: 1,
|
|
396
466
|
maximum: 200,
|
|
397
467
|
initial: 5,
|
|
398
468
|
};
|
|
399
|
-
starter.
|
|
469
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
400
470
|
minimum: 1,
|
|
401
471
|
maximum: 200,
|
|
402
472
|
initial: 5,
|
|
403
473
|
};
|
|
474
|
+
|
|
475
|
+
starter.sdk_config.register_activities(JitteryActivities);
|
|
404
476
|
let mut worker = starter.worker().await;
|
|
405
477
|
let shutdown_handle = worker.inner_mut().shutdown_handle();
|
|
406
|
-
worker.
|
|
407
|
-
let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
|
|
408
|
-
let drained_fut = sigchan.forward(sink::drain());
|
|
409
|
-
|
|
410
|
-
let real_stuff = async move {
|
|
411
|
-
for _ in 0..5 {
|
|
412
|
-
ctx.activity(ActivityOptions {
|
|
413
|
-
activity_type: "echo".to_string(),
|
|
414
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
415
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
416
|
-
..Default::default()
|
|
417
|
-
})
|
|
418
|
-
.await;
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
tokio::select! {
|
|
422
|
-
_ = drained_fut => {}
|
|
423
|
-
_ = real_stuff => {}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
Ok(().into())
|
|
427
|
-
});
|
|
428
|
-
worker.register_activity("echo", |_: ActContext, echo: String| async move {
|
|
429
|
-
// Add some jitter to completions
|
|
430
|
-
let rand_millis = rand::rng().random_range(0..500);
|
|
431
|
-
tokio::time::sleep(Duration::from_millis(rand_millis)).await;
|
|
432
|
-
Ok(echo)
|
|
433
|
-
});
|
|
478
|
+
worker.register_workflow::<PollerLoadWf>();
|
|
434
479
|
let client = starter.get_client().await;
|
|
435
480
|
|
|
481
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
436
482
|
let mut workflow_handles = vec![];
|
|
437
483
|
for i in 0..num_workflows {
|
|
438
484
|
let wfid = format!("{wf_name}_{i}-{}", rand_6_chars());
|
|
439
|
-
let
|
|
440
|
-
.
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
..Default::default()
|
|
447
|
-
},
|
|
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(),
|
|
448
492
|
)
|
|
449
493
|
.await
|
|
450
494
|
.unwrap();
|
|
451
|
-
workflow_handles.push(
|
|
495
|
+
workflow_handles.push(handle);
|
|
452
496
|
}
|
|
453
497
|
|
|
454
498
|
let (ah, abort_reg) = AbortHandle::new_pair();
|
|
455
499
|
let all_workflows_are_done = async {
|
|
456
500
|
stream::iter(mem::take(&mut workflow_handles))
|
|
457
501
|
.for_each_concurrent(25, |handle| async move {
|
|
458
|
-
let _ = handle
|
|
459
|
-
.get_workflow_result(GetWorkflowResultOptions::default())
|
|
460
|
-
.await;
|
|
502
|
+
let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
|
|
461
503
|
})
|
|
462
504
|
.await;
|
|
463
505
|
ah.abort();
|
|
@@ -469,13 +511,17 @@ async fn poller_autoscaling_basic_loadtest() {
|
|
|
469
511
|
loop {
|
|
470
512
|
let sends: FuturesUnordered<_> = (0..num_workflows)
|
|
471
513
|
.map(|i| {
|
|
472
|
-
|
|
473
|
-
format!("{wf_name}_{i}")
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
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
|
+
}
|
|
479
525
|
})
|
|
480
526
|
.collect();
|
|
481
527
|
sends
|