@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
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
use crate::common::*;
|
|
2
|
-
use futures_util::StreamExt;
|
|
3
2
|
use std::sync::{
|
|
4
3
|
Arc,
|
|
5
4
|
atomic::{AtomicUsize, Ordering},
|
|
6
5
|
};
|
|
7
|
-
use temporalio_client::WorkflowOptions;
|
|
8
6
|
use temporalio_common::protos::{
|
|
9
7
|
DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder,
|
|
10
8
|
temporal::api::{
|
|
@@ -14,9 +12,31 @@ use temporalio_common::protos::{
|
|
|
14
12
|
workflowservice::v1::GetWorkflowExecutionHistoryResponse,
|
|
15
13
|
},
|
|
16
14
|
};
|
|
17
|
-
use
|
|
15
|
+
use temporalio_macros::{workflow, workflow_methods};
|
|
16
|
+
use temporalio_sdk::{SyncWorkflowContext, WorkflowContext, WorkflowResult};
|
|
18
17
|
use temporalio_sdk_core::test_help::{MockPollCfg, ResponseType, mock_worker_client};
|
|
19
18
|
|
|
19
|
+
#[workflow]
|
|
20
|
+
struct WeirdPaginationWf {
|
|
21
|
+
sig_ctr: Arc<AtomicUsize>,
|
|
22
|
+
signal_count: usize,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#[workflow_methods(factory_only)]
|
|
26
|
+
impl WeirdPaginationWf {
|
|
27
|
+
#[run(name = DEFAULT_WORKFLOW_TYPE)]
|
|
28
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
29
|
+
ctx.wait_condition(|s| s.signal_count >= 2).await;
|
|
30
|
+
Ok(())
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
#[signal(name = "hi")]
|
|
34
|
+
fn hi(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {
|
|
35
|
+
self.signal_count += 1;
|
|
36
|
+
self.sig_ctr.fetch_add(1, Ordering::AcqRel);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
20
40
|
#[tokio::test]
|
|
21
41
|
async fn weird_pagination_doesnt_drop_wft_events() {
|
|
22
42
|
let wf_id = "fakeid";
|
|
@@ -97,7 +117,6 @@ async fn weird_pagination_doesnt_drop_wft_events() {
|
|
|
97
117
|
})
|
|
98
118
|
.times(1);
|
|
99
119
|
|
|
100
|
-
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
101
120
|
let mh = MockPollCfg::from_resp_batches(wf_id, t, [ResponseType::Raw(wft_resp)], mock_client);
|
|
102
121
|
let mut worker = mock_sdk_cfg(mh, |cfg| {
|
|
103
122
|
cfg.max_cached_workflows = 2;
|
|
@@ -106,32 +125,36 @@ async fn weird_pagination_doesnt_drop_wft_events() {
|
|
|
106
125
|
|
|
107
126
|
let sig_ctr = Arc::new(AtomicUsize::new(0));
|
|
108
127
|
let sig_ctr_clone = sig_ctr.clone();
|
|
109
|
-
worker.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
let mut sigchan = ctx.make_signal_channel("hi");
|
|
113
|
-
while sigchan.next().await.is_some() {
|
|
114
|
-
if sig_ctr_clone.fetch_add(1, Ordering::AcqRel) == 1 {
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
Ok(().into())
|
|
119
|
-
}
|
|
128
|
+
worker.register_workflow_with_factory(move || WeirdPaginationWf {
|
|
129
|
+
sig_ctr: sig_ctr_clone.clone(),
|
|
130
|
+
signal_count: 0,
|
|
120
131
|
});
|
|
121
132
|
|
|
122
|
-
worker
|
|
123
|
-
.submit_wf(
|
|
124
|
-
wf_id.to_owned(),
|
|
125
|
-
wf_type.to_owned(),
|
|
126
|
-
vec![],
|
|
127
|
-
WorkflowOptions::default(),
|
|
128
|
-
)
|
|
129
|
-
.await
|
|
130
|
-
.unwrap();
|
|
131
133
|
worker.run_until_done().await.unwrap();
|
|
132
134
|
assert_eq!(sig_ctr.load(Ordering::Acquire), 2);
|
|
133
135
|
}
|
|
134
136
|
|
|
137
|
+
#[workflow]
|
|
138
|
+
struct ExtremePaginationWf {
|
|
139
|
+
sig_ctr: Arc<AtomicUsize>,
|
|
140
|
+
signal_count: usize,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
#[workflow_methods(factory_only)]
|
|
144
|
+
impl ExtremePaginationWf {
|
|
145
|
+
#[run(name = DEFAULT_WORKFLOW_TYPE)]
|
|
146
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
147
|
+
ctx.wait_condition(|s| s.signal_count >= 6).await;
|
|
148
|
+
Ok(())
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
#[signal(name = "hi")]
|
|
152
|
+
fn hi(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {
|
|
153
|
+
self.signal_count += 1;
|
|
154
|
+
self.sig_ctr.fetch_add(1, Ordering::AcqRel);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
135
158
|
#[tokio::test]
|
|
136
159
|
async fn extreme_pagination_doesnt_drop_wft_events_worker() {
|
|
137
160
|
let wf_id = "fakeid";
|
|
@@ -237,7 +260,6 @@ async fn extreme_pagination_doesnt_drop_wft_events_worker() {
|
|
|
237
260
|
wft_resp.previous_started_event_id = 3;
|
|
238
261
|
wft_resp.started_event_id = 15;
|
|
239
262
|
|
|
240
|
-
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
241
263
|
let mh = MockPollCfg::from_resp_batches(wf_id, t, [ResponseType::Raw(wft_resp)], mock_client);
|
|
242
264
|
let mut worker = mock_sdk_cfg(mh, |cfg| {
|
|
243
265
|
cfg.max_cached_workflows = 2;
|
|
@@ -246,28 +268,11 @@ async fn extreme_pagination_doesnt_drop_wft_events_worker() {
|
|
|
246
268
|
|
|
247
269
|
let sig_ctr = Arc::new(AtomicUsize::new(0));
|
|
248
270
|
let sig_ctr_clone = sig_ctr.clone();
|
|
249
|
-
worker.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
let mut sigchan = ctx.make_signal_channel("hi");
|
|
253
|
-
while sigchan.next().await.is_some() {
|
|
254
|
-
if sig_ctr_clone.fetch_add(1, Ordering::AcqRel) == 5 {
|
|
255
|
-
break;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
Ok(().into())
|
|
259
|
-
}
|
|
271
|
+
worker.register_workflow_with_factory(move || ExtremePaginationWf {
|
|
272
|
+
sig_ctr: sig_ctr_clone.clone(),
|
|
273
|
+
signal_count: 0,
|
|
260
274
|
});
|
|
261
275
|
|
|
262
|
-
worker
|
|
263
|
-
.submit_wf(
|
|
264
|
-
wf_id.to_owned(),
|
|
265
|
-
wf_type.to_owned(),
|
|
266
|
-
vec![],
|
|
267
|
-
WorkflowOptions::default(),
|
|
268
|
-
)
|
|
269
|
-
.await
|
|
270
|
-
.unwrap();
|
|
271
276
|
worker.run_until_done().await.unwrap();
|
|
272
277
|
assert_eq!(sig_ctr.load(Ordering::Acquire), 6);
|
|
273
278
|
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
use crate::{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
},
|
|
6
|
-
integ_tests::activity_functions::echo,
|
|
1
|
+
use crate::common::{
|
|
2
|
+
CoreWfStarter, INTEG_CLIENT_NAME, INTEG_CLIENT_VERSION, activity_functions::StdActivities,
|
|
3
|
+
get_integ_client, init_core_and_create_wf, init_integ_telem, integ_dev_server_config,
|
|
4
|
+
integ_worker_config,
|
|
7
5
|
};
|
|
8
6
|
use assert_matches::assert_matches;
|
|
9
7
|
use futures_util::{FutureExt, StreamExt, future::join_all};
|
|
@@ -15,12 +13,16 @@ use std::{
|
|
|
15
13
|
},
|
|
16
14
|
time::Duration,
|
|
17
15
|
};
|
|
18
|
-
use temporalio_client::{
|
|
16
|
+
use temporalio_client::{
|
|
17
|
+
Client, Connection, ConnectionOptions, NamespacedClient, UntypedWorkflow,
|
|
18
|
+
WorkflowExecutionInfo, WorkflowStartOptions,
|
|
19
|
+
};
|
|
19
20
|
use temporalio_common::{
|
|
20
|
-
|
|
21
|
+
data_converters::RawValue,
|
|
22
|
+
prost_dur,
|
|
21
23
|
protos::{
|
|
22
24
|
coresdk::{
|
|
23
|
-
|
|
25
|
+
IntoCompletion,
|
|
24
26
|
activity_task::activity_task as act_task,
|
|
25
27
|
workflow_activation::{FireTimer, WorkflowActivationJob, workflow_activation_job},
|
|
26
28
|
workflow_commands::{ActivityCancellationType, RequestCancelActivity, StartTimer},
|
|
@@ -29,15 +31,14 @@ use temporalio_common::{
|
|
|
29
31
|
temporal::api::enums::v1::EventType,
|
|
30
32
|
test_utils::schedule_activity_cmd,
|
|
31
33
|
},
|
|
32
|
-
telemetry::{Logger,
|
|
33
|
-
worker::PollerBehavior,
|
|
34
|
+
telemetry::{CoreLogStreamConsumer, Logger, TelemetryOptions},
|
|
34
35
|
};
|
|
35
|
-
use
|
|
36
|
+
use temporalio_macros::{workflow, workflow_methods};
|
|
37
|
+
use temporalio_sdk::{ActivityOptions, WorkflowContext, WorkflowResult};
|
|
36
38
|
use temporalio_sdk_core::{
|
|
37
|
-
|
|
38
|
-
ephemeral_server::{
|
|
39
|
+
CoreRuntime, PollerBehavior, RuntimeOptions, TunerHolder,
|
|
40
|
+
ephemeral_server::{TemporalDevServerConfig, default_cached_download},
|
|
39
41
|
init_worker,
|
|
40
|
-
telemetry::CoreLogStreamConsumer,
|
|
41
42
|
test_help::{NAMESPACE, WorkerTestHelpers, drain_pollers_and_shutdown},
|
|
42
43
|
};
|
|
43
44
|
use tokio::{sync::Notify, time::timeout};
|
|
@@ -125,15 +126,14 @@ async fn out_of_order_completion_doesnt_hang() {
|
|
|
125
126
|
async fn switching_worker_client_changes_poll() {
|
|
126
127
|
// Start two servers
|
|
127
128
|
info!("Starting servers");
|
|
128
|
-
let server_config =
|
|
129
|
+
let server_config = TemporalDevServerConfig::builder()
|
|
129
130
|
.exe(default_cached_download())
|
|
130
131
|
// We need to lower the poll timeout so the poll call rolls over
|
|
131
132
|
.extra_args(vec![
|
|
132
133
|
"--dynamic-config-value".to_string(),
|
|
133
134
|
"matching.longPollExpirationInterval=\"1s\"".to_string(),
|
|
134
135
|
])
|
|
135
|
-
.build()
|
|
136
|
-
.unwrap();
|
|
136
|
+
.build();
|
|
137
137
|
let mut server1 = server_config
|
|
138
138
|
.start_server_with_output(Stdio::null(), Stdio::null())
|
|
139
139
|
.await
|
|
@@ -146,93 +146,99 @@ async fn switching_worker_client_changes_poll() {
|
|
|
146
146
|
let result = std::panic::AssertUnwindSafe(async {
|
|
147
147
|
// Connect clients to both servers
|
|
148
148
|
info!("Connecting clients");
|
|
149
|
-
let
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
149
|
+
let opts1 =
|
|
150
|
+
ConnectionOptions::new(Url::parse(&format!("http://{}", server1.target)).unwrap())
|
|
151
|
+
.identity("integ_tester".to_owned())
|
|
152
|
+
.client_name("temporal-core".to_owned())
|
|
153
|
+
.client_version("0.1.0".to_owned())
|
|
154
|
+
.build();
|
|
155
|
+
let connection1 = Connection::connect(opts1).await.unwrap();
|
|
156
|
+
let client_opts1 = temporalio_client::ClientOptions::new("default").build();
|
|
157
|
+
let client1 = Client::new(connection1, client_opts1).unwrap();
|
|
158
|
+
|
|
159
|
+
let opts2 =
|
|
160
|
+
ConnectionOptions::new(Url::parse(&format!("http://{}", server2.target)).unwrap())
|
|
161
|
+
.identity("integ_tester".to_owned())
|
|
162
|
+
.client_name("temporal-core".to_owned())
|
|
163
|
+
.client_version("0.1.0".to_owned())
|
|
164
|
+
.build();
|
|
165
|
+
let connection2 = Connection::connect(opts2).await.unwrap();
|
|
166
|
+
let client_opts2 = temporalio_client::ClientOptions::new("default").build();
|
|
167
|
+
let client2 = Client::new(connection2, client_opts2).unwrap();
|
|
167
168
|
|
|
168
169
|
// Start a workflow on both servers
|
|
169
170
|
info!("Starting workflows");
|
|
170
171
|
let wf1 = client1
|
|
171
172
|
.start_workflow(
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
"my-workflow-1".to_owned()
|
|
175
|
-
|
|
176
|
-
None,
|
|
177
|
-
WorkflowOptions::default(),
|
|
173
|
+
UntypedWorkflow::new("my-workflow-type"),
|
|
174
|
+
RawValue::default(),
|
|
175
|
+
WorkflowStartOptions::new("my-task-queue".to_owned(), "my-workflow-1".to_owned())
|
|
176
|
+
.build(),
|
|
178
177
|
)
|
|
179
178
|
.await
|
|
180
179
|
.unwrap();
|
|
180
|
+
let wf1_run_id = wf1.run_id().unwrap().to_string();
|
|
181
181
|
let wf2 = client2
|
|
182
182
|
.start_workflow(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
"my-workflow-2".to_owned()
|
|
186
|
-
|
|
187
|
-
None,
|
|
188
|
-
WorkflowOptions::default(),
|
|
183
|
+
UntypedWorkflow::new("my-workflow-type"),
|
|
184
|
+
RawValue::default(),
|
|
185
|
+
WorkflowStartOptions::new("my-task-queue".to_owned(), "my-workflow-2".to_owned())
|
|
186
|
+
.build(),
|
|
189
187
|
)
|
|
190
188
|
.await
|
|
191
189
|
.unwrap();
|
|
190
|
+
let wf2_run_id = wf2.run_id().unwrap().to_string();
|
|
192
191
|
|
|
193
192
|
// Create a worker only on the first server
|
|
193
|
+
let mut config = integ_worker_config("my-task-queue");
|
|
194
|
+
// We want a cache so we don't get extra remove-job activations
|
|
195
|
+
config.max_cached_workflows = 100_usize;
|
|
194
196
|
let worker = init_worker(
|
|
195
197
|
init_integ_telem().unwrap(),
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
.max_cached_workflows(100_usize)
|
|
199
|
-
.build()
|
|
200
|
-
.unwrap(),
|
|
201
|
-
client1.clone(),
|
|
198
|
+
config,
|
|
199
|
+
client1.connection().clone(),
|
|
202
200
|
)
|
|
203
201
|
.unwrap();
|
|
204
202
|
|
|
205
203
|
// Poll for first task, confirm it's first wf, complete, and wait for complete
|
|
206
204
|
info!("Doing initial poll");
|
|
207
205
|
let act1 = worker.poll_workflow_activation().await.unwrap();
|
|
208
|
-
assert_eq!(
|
|
206
|
+
assert_eq!(wf1_run_id, act1.run_id);
|
|
209
207
|
worker.complete_execution(&act1.run_id).await;
|
|
210
208
|
worker.handle_eviction().await;
|
|
211
209
|
info!("Waiting on first workflow complete");
|
|
212
|
-
|
|
213
|
-
.
|
|
214
|
-
.
|
|
215
|
-
.
|
|
216
|
-
|
|
210
|
+
WorkflowExecutionInfo {
|
|
211
|
+
namespace: client1.namespace(),
|
|
212
|
+
workflow_id: "my-workflow-1".into(),
|
|
213
|
+
run_id: Some(wf1_run_id.clone()),
|
|
214
|
+
first_execution_run_id: None,
|
|
215
|
+
}
|
|
216
|
+
.bind_untyped(client1.clone())
|
|
217
|
+
.get_result(Default::default())
|
|
218
|
+
.await
|
|
219
|
+
.unwrap();
|
|
217
220
|
|
|
218
221
|
// Swap client, poll for next task, confirm it's second wf, and respond w/ empty
|
|
219
222
|
info!("Replacing client and polling again");
|
|
220
|
-
worker
|
|
221
|
-
.replace_client(client2.get_client().inner().clone())
|
|
222
|
-
.unwrap();
|
|
223
|
+
worker.replace_client(client2.connection().clone()).unwrap();
|
|
223
224
|
let act2 = worker.poll_workflow_activation().await.unwrap();
|
|
224
|
-
assert_eq!(
|
|
225
|
+
assert_eq!(wf2_run_id, act2.run_id);
|
|
225
226
|
worker.complete_execution(&act2.run_id).await;
|
|
226
227
|
worker.handle_eviction().await;
|
|
227
228
|
info!("Waiting on second workflow complete");
|
|
228
|
-
|
|
229
|
-
.
|
|
230
|
-
.
|
|
231
|
-
|
|
232
|
-
|
|
229
|
+
WorkflowExecutionInfo {
|
|
230
|
+
namespace: client2.namespace(),
|
|
231
|
+
workflow_id: "my-workflow-2".into(),
|
|
232
|
+
run_id: Some(wf2_run_id),
|
|
233
|
+
first_execution_run_id: None,
|
|
234
|
+
}
|
|
235
|
+
.bind_untyped(client2.clone())
|
|
236
|
+
.get_result(Default::default())
|
|
237
|
+
.await
|
|
238
|
+
.unwrap();
|
|
233
239
|
|
|
234
240
|
// Shutdown workers and servers
|
|
235
|
-
drain_pollers_and_shutdown(&
|
|
241
|
+
drain_pollers_and_shutdown(&worker).await;
|
|
236
242
|
})
|
|
237
243
|
.catch_unwind()
|
|
238
244
|
.await;
|
|
@@ -246,60 +252,65 @@ async fn switching_worker_client_changes_poll() {
|
|
|
246
252
|
}
|
|
247
253
|
}
|
|
248
254
|
|
|
255
|
+
#[workflow]
|
|
256
|
+
#[derive(Default)]
|
|
257
|
+
struct OnlyOneWorkflowSlotAndTwoPollers;
|
|
258
|
+
|
|
259
|
+
#[workflow_methods]
|
|
260
|
+
impl OnlyOneWorkflowSlotAndTwoPollers {
|
|
261
|
+
#[run(name = "only_one_workflow_slot_and_two_pollers")]
|
|
262
|
+
async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
|
|
263
|
+
for _ in 0..3 {
|
|
264
|
+
let _ = ctx
|
|
265
|
+
.start_activity(
|
|
266
|
+
StdActivities::echo,
|
|
267
|
+
"hi!".to_string(),
|
|
268
|
+
ActivityOptions {
|
|
269
|
+
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
270
|
+
..Default::default()
|
|
271
|
+
},
|
|
272
|
+
)
|
|
273
|
+
.await;
|
|
274
|
+
}
|
|
275
|
+
Ok(())
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
249
279
|
#[rstest::rstest]
|
|
250
280
|
#[tokio::test]
|
|
251
281
|
async fn small_workflow_slots_and_pollers(#[values(false, true)] use_autoscaling: bool) {
|
|
252
282
|
let wf_name = "only_one_workflow_slot_and_two_pollers";
|
|
253
283
|
let mut starter = CoreWfStarter::new(wf_name);
|
|
254
284
|
if use_autoscaling {
|
|
255
|
-
starter
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
initial: 1,
|
|
261
|
-
});
|
|
285
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
|
|
286
|
+
minimum: 1,
|
|
287
|
+
maximum: 5,
|
|
288
|
+
initial: 1,
|
|
289
|
+
};
|
|
262
290
|
} else {
|
|
263
|
-
starter
|
|
264
|
-
.worker_config
|
|
265
|
-
.workflow_task_poller_behavior(PollerBehavior::SimpleMaximum(2));
|
|
291
|
+
starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(2);
|
|
266
292
|
}
|
|
267
|
-
starter
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
.max_outstanding_local_activities(1_usize)
|
|
271
|
-
.activity_task_poller_behavior(PollerBehavior::SimpleMaximum(1))
|
|
272
|
-
.max_outstanding_activities(1_usize);
|
|
293
|
+
starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(1);
|
|
294
|
+
starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(2, 1, 1, 1));
|
|
295
|
+
starter.sdk_config.register_activities(StdActivities);
|
|
273
296
|
let mut worker = starter.worker().await;
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
activity_type: "echo_activity".to_string(),
|
|
278
|
-
start_to_close_timeout: Some(Duration::from_secs(5)),
|
|
279
|
-
input: "hi!".as_json_payload().expect("serializes fine"),
|
|
280
|
-
..Default::default()
|
|
281
|
-
})
|
|
282
|
-
.await;
|
|
283
|
-
}
|
|
284
|
-
Ok(().into())
|
|
285
|
-
});
|
|
286
|
-
worker.register_activity("echo_activity", echo);
|
|
297
|
+
|
|
298
|
+
worker.register_workflow::<OnlyOneWorkflowSlotAndTwoPollers>();
|
|
299
|
+
let task_queue = starter.get_task_queue().to_owned();
|
|
287
300
|
worker
|
|
288
|
-
.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
WorkflowOptions::default(),
|
|
301
|
+
.submit_workflow(
|
|
302
|
+
OnlyOneWorkflowSlotAndTwoPollers::run,
|
|
303
|
+
(),
|
|
304
|
+
WorkflowStartOptions::new(task_queue.clone(), task_queue.clone()).build(),
|
|
293
305
|
)
|
|
294
306
|
.await
|
|
295
307
|
.unwrap();
|
|
296
308
|
let wf2id = format!("{}-2", starter.get_task_queue());
|
|
297
309
|
worker
|
|
298
|
-
.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
WorkflowOptions::default(),
|
|
310
|
+
.submit_workflow(
|
|
311
|
+
OnlyOneWorkflowSlotAndTwoPollers::run,
|
|
312
|
+
(),
|
|
313
|
+
WorkflowStartOptions::new(task_queue.clone(), wf2id.clone()).build(),
|
|
303
314
|
)
|
|
304
315
|
.await
|
|
305
316
|
.unwrap();
|
|
@@ -312,16 +323,15 @@ async fn small_workflow_slots_and_pollers(#[values(false, true)] use_autoscaling
|
|
|
312
323
|
.iter()
|
|
313
324
|
.any(|e| e.event_type() == EventType::WorkflowTaskTimedOut);
|
|
314
325
|
assert!(!any_task_timeouts);
|
|
315
|
-
let
|
|
326
|
+
let events = starter
|
|
316
327
|
.get_client()
|
|
317
328
|
.await
|
|
318
|
-
.
|
|
329
|
+
.get_workflow_handle::<UntypedWorkflow>(&wf2id)
|
|
330
|
+
.fetch_history(Default::default())
|
|
319
331
|
.await
|
|
320
332
|
.unwrap()
|
|
321
|
-
.
|
|
322
|
-
|
|
323
|
-
let any_task_timeouts = history
|
|
324
|
-
.events
|
|
333
|
+
.into_events();
|
|
334
|
+
let any_task_timeouts = events
|
|
325
335
|
.iter()
|
|
326
336
|
.any(|e| e.event_type() == EventType::WorkflowTaskTimedOut);
|
|
327
337
|
assert!(!any_task_timeouts);
|
|
@@ -330,14 +340,13 @@ async fn small_workflow_slots_and_pollers(#[values(false, true)] use_autoscaling
|
|
|
330
340
|
#[tokio::test]
|
|
331
341
|
async fn replace_client_works_after_polling_failure() {
|
|
332
342
|
let (log_consumer, mut log_rx) = CoreLogStreamConsumer::new(100);
|
|
333
|
-
let telem_opts =
|
|
343
|
+
let telem_opts = TelemetryOptions::builder()
|
|
334
344
|
.logging(Logger::Push {
|
|
335
345
|
filter: "OFF,temporalio_client=DEBUG".into(),
|
|
336
346
|
consumer: Arc::new(log_consumer),
|
|
337
347
|
})
|
|
338
|
-
.build()
|
|
339
|
-
|
|
340
|
-
let runtime_opts = RuntimeOptionsBuilder::default()
|
|
348
|
+
.build();
|
|
349
|
+
let runtime_opts = RuntimeOptions::builder()
|
|
341
350
|
.telemetry_options(telem_opts)
|
|
342
351
|
.build()
|
|
343
352
|
.unwrap();
|
|
@@ -376,7 +385,7 @@ async fn replace_client_works_after_polling_failure() {
|
|
|
376
385
|
|
|
377
386
|
// Starting a second dev server for the worker to connect to initially. Later this server will be shut down
|
|
378
387
|
// and the worker client replaced with a client connected to the main integration test server.
|
|
379
|
-
let initial_server_config = integ_dev_server_config(vec![])
|
|
388
|
+
let initial_server_config = integ_dev_server_config(vec![], false);
|
|
380
389
|
let initial_server = Arc::new(Mutex::new(Some(
|
|
381
390
|
initial_server_config
|
|
382
391
|
.start_server_with_output(Stdio::null(), Stdio::null())
|
|
@@ -392,49 +401,40 @@ async fn replace_client_works_after_polling_failure() {
|
|
|
392
401
|
"http://{}",
|
|
393
402
|
initial_server.lock().unwrap().as_ref().unwrap().target
|
|
394
403
|
);
|
|
395
|
-
let
|
|
404
|
+
let opts = ConnectionOptions::new(Url::parse(&initial_server_target).unwrap())
|
|
396
405
|
.identity("client_for_initial_server".to_string())
|
|
397
|
-
.target_url(Url::parse(&initial_server_target).unwrap())
|
|
398
406
|
.client_name(INTEG_CLIENT_NAME.to_string())
|
|
399
407
|
.client_version(INTEG_CLIENT_VERSION.to_string())
|
|
400
|
-
.build()
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
408
|
+
.build();
|
|
409
|
+
let connection = Connection::connect(opts).await.unwrap();
|
|
410
|
+
let client_opts = temporalio_client::ClientOptions::new(NAMESPACE).build();
|
|
411
|
+
let client_for_initial_server = Client::new(connection, client_opts).unwrap();
|
|
404
412
|
|
|
405
413
|
let wf_name = "replace_client_works_after_polling_failure";
|
|
406
414
|
let task_queue = format!("{wf_name}_tq");
|
|
407
415
|
|
|
416
|
+
let mut config = integ_worker_config(&task_queue);
|
|
417
|
+
config.max_cached_workflows = 100_usize;
|
|
408
418
|
let worker = Arc::new(
|
|
409
|
-
init_worker(
|
|
410
|
-
&rt,
|
|
411
|
-
integ_worker_config(&task_queue)
|
|
412
|
-
.max_cached_workflows(100_usize)
|
|
413
|
-
.build()
|
|
414
|
-
.unwrap(),
|
|
415
|
-
client_for_initial_server.clone(),
|
|
416
|
-
)
|
|
417
|
-
.unwrap(),
|
|
419
|
+
init_worker(&rt, config, client_for_initial_server.connection().clone()).unwrap(),
|
|
418
420
|
);
|
|
419
421
|
|
|
420
422
|
// Polling the initial server the first time is successful.
|
|
421
423
|
let wf_1 = client_for_initial_server
|
|
422
424
|
.start_workflow(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
wf_name.
|
|
426
|
-
wf_name.into(),
|
|
427
|
-
None,
|
|
428
|
-
WorkflowOptions::default(),
|
|
425
|
+
UntypedWorkflow::new(wf_name),
|
|
426
|
+
RawValue::default(),
|
|
427
|
+
WorkflowStartOptions::new(task_queue.clone(), wf_name.to_string()).build(),
|
|
429
428
|
)
|
|
430
429
|
.await
|
|
431
430
|
.unwrap();
|
|
431
|
+
let wf_1_run_id = wf_1.run_id().unwrap().to_string();
|
|
432
432
|
let act_1 =
|
|
433
433
|
tokio::time::timeout(Duration::from_secs(60), worker.poll_workflow_activation())
|
|
434
434
|
.await
|
|
435
435
|
.unwrap()
|
|
436
436
|
.unwrap();
|
|
437
|
-
assert_eq!(act_1.run_id,
|
|
437
|
+
assert_eq!(act_1.run_id, wf_1_run_id);
|
|
438
438
|
|
|
439
439
|
// Initial server is shut down.
|
|
440
440
|
let mut server = initial_server.lock().unwrap().take().unwrap();
|
|
@@ -457,34 +457,34 @@ async fn replace_client_works_after_polling_failure() {
|
|
|
457
457
|
.unwrap();
|
|
458
458
|
|
|
459
459
|
// Start a new WF on main integration server.
|
|
460
|
-
let client_for_integ_server =
|
|
461
|
-
|
|
462
|
-
.
|
|
463
|
-
|
|
460
|
+
let client_for_integ_server = get_integ_client(
|
|
461
|
+
NAMESPACE.to_string(),
|
|
462
|
+
rt.telemetry().get_temporal_metric_meter(),
|
|
463
|
+
)
|
|
464
|
+
.await;
|
|
464
465
|
let wf_2 = client_for_integ_server
|
|
465
466
|
.start_workflow(
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
wf_name
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
WorkflowOptions {
|
|
472
|
-
execution_timeout: Some(Duration::from_secs(60)),
|
|
473
|
-
..Default::default()
|
|
474
|
-
},
|
|
467
|
+
UntypedWorkflow::new(wf_name),
|
|
468
|
+
RawValue::default(),
|
|
469
|
+
WorkflowStartOptions::new(task_queue, wf_name)
|
|
470
|
+
.execution_timeout(Duration::from_secs(60))
|
|
471
|
+
.build(),
|
|
475
472
|
)
|
|
476
473
|
.await
|
|
477
474
|
.unwrap();
|
|
475
|
+
let wf_2_run_id = wf_2.run_id().unwrap().to_string();
|
|
478
476
|
|
|
479
477
|
// Switch worker over to the main integration server.
|
|
480
478
|
// The polling started on the initial server should complete with a task from the new server.
|
|
481
|
-
worker
|
|
479
|
+
worker
|
|
480
|
+
.replace_client(client_for_integ_server.connection().clone())
|
|
481
|
+
.unwrap();
|
|
482
482
|
let act_2 = tokio::time::timeout(Duration::from_secs(60), poll_join_handle)
|
|
483
483
|
.await
|
|
484
484
|
.unwrap()
|
|
485
485
|
.unwrap()
|
|
486
486
|
.unwrap();
|
|
487
|
-
assert_eq!(act_2.run_id,
|
|
487
|
+
assert_eq!(act_2.run_id, wf_2_run_id);
|
|
488
488
|
})
|
|
489
489
|
}
|
|
490
490
|
.catch_unwind()
|