@temporalio/core-bridge 0.19.2 → 0.20.2
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 +90 -157
- package/Cargo.toml +1 -0
- package/index.d.ts +11 -27
- package/package.json +3 -3
- 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/.buildkite/docker/Dockerfile +1 -1
- package/sdk-core/.buildkite/docker/docker-compose.yaml +1 -1
- package/sdk-core/.cargo/config.toml +1 -0
- package/sdk-core/CODEOWNERS +1 -1
- package/sdk-core/bridge-ffi/include/sdk-core-bridge.h +119 -86
- package/sdk-core/bridge-ffi/src/lib.rs +311 -315
- package/sdk-core/bridge-ffi/src/wrappers.rs +108 -113
- package/sdk-core/client/Cargo.toml +13 -9
- package/sdk-core/client/LICENSE.txt +23 -0
- package/sdk-core/client/src/lib.rs +286 -174
- package/sdk-core/client/src/metrics.rs +86 -12
- package/sdk-core/client/src/raw.rs +566 -0
- package/sdk-core/client/src/retry.rs +137 -99
- package/sdk-core/core/Cargo.toml +15 -10
- package/sdk-core/core/LICENSE.txt +23 -0
- package/sdk-core/core/benches/workflow_replay.rs +79 -0
- package/sdk-core/core/src/abstractions.rs +38 -0
- package/sdk-core/core/src/core_tests/activity_tasks.rs +108 -182
- package/sdk-core/core/src/core_tests/child_workflows.rs +16 -11
- package/sdk-core/core/src/core_tests/determinism.rs +24 -12
- package/sdk-core/core/src/core_tests/local_activities.rs +53 -27
- package/sdk-core/core/src/core_tests/mod.rs +30 -43
- package/sdk-core/core/src/core_tests/queries.rs +82 -81
- package/sdk-core/core/src/core_tests/workers.rs +111 -296
- package/sdk-core/core/src/core_tests/workflow_cancels.rs +4 -4
- package/sdk-core/core/src/core_tests/workflow_tasks.rs +257 -242
- package/sdk-core/core/src/lib.rs +73 -318
- package/sdk-core/core/src/pollers/mod.rs +4 -6
- package/sdk-core/core/src/pollers/poll_buffer.rs +20 -14
- package/sdk-core/core/src/protosext/mod.rs +7 -10
- package/sdk-core/core/src/replay/mod.rs +11 -150
- package/sdk-core/core/src/telemetry/metrics.rs +35 -2
- package/sdk-core/core/src/telemetry/mod.rs +49 -16
- package/sdk-core/core/src/telemetry/prometheus_server.rs +14 -35
- package/sdk-core/core/src/test_help/mod.rs +104 -170
- package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +57 -34
- package/sdk-core/core/src/worker/activities/local_activities.rs +95 -23
- package/sdk-core/core/src/worker/activities.rs +23 -16
- package/sdk-core/core/src/worker/client/mocks.rs +86 -0
- package/sdk-core/core/src/worker/client.rs +209 -0
- package/sdk-core/core/src/worker/mod.rs +207 -108
- package/sdk-core/core/src/workflow/driven_workflow.rs +21 -6
- package/sdk-core/core/src/workflow/history_update.rs +107 -24
- package/sdk-core/core/src/workflow/machines/activity_state_machine.rs +2 -3
- package/sdk-core/core/src/workflow/machines/child_workflow_state_machine.rs +2 -3
- package/sdk-core/core/src/workflow/machines/mod.rs +20 -17
- package/sdk-core/core/src/workflow/machines/signal_external_state_machine.rs +56 -19
- package/sdk-core/core/src/workflow/machines/transition_coverage.rs +5 -0
- package/sdk-core/core/src/workflow/machines/upsert_search_attributes_state_machine.rs +230 -22
- package/sdk-core/core/src/workflow/machines/workflow_machines.rs +81 -115
- package/sdk-core/core/src/workflow/machines/workflow_task_state_machine.rs +4 -4
- package/sdk-core/core/src/workflow/mod.rs +13 -1
- package/sdk-core/core/src/workflow/workflow_tasks/concurrency_manager.rs +70 -11
- package/sdk-core/core/src/workflow/workflow_tasks/mod.rs +65 -41
- package/sdk-core/core-api/Cargo.toml +9 -1
- package/sdk-core/core-api/LICENSE.txt +23 -0
- package/sdk-core/core-api/src/errors.rs +7 -38
- package/sdk-core/core-api/src/lib.rs +44 -52
- package/sdk-core/core-api/src/worker.rs +10 -2
- package/sdk-core/etc/deps.svg +127 -96
- package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +11 -7
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +10 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +6 -1
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +6 -0
- package/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +6 -0
- package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +2 -1
- package/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +3 -0
- package/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +12 -0
- package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +25 -0
- package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +4 -0
- package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +19 -35
- package/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +2 -6
- package/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +53 -11
- package/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +14 -7
- package/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +3 -5
- package/sdk-core/sdk/Cargo.toml +16 -2
- package/sdk-core/sdk/LICENSE.txt +23 -0
- package/sdk-core/sdk/src/interceptors.rs +11 -0
- package/sdk-core/sdk/src/lib.rs +139 -151
- package/sdk-core/sdk/src/workflow_context/options.rs +86 -1
- package/sdk-core/sdk/src/workflow_context.rs +36 -17
- package/sdk-core/sdk/src/workflow_future.rs +19 -25
- package/sdk-core/sdk-core-protos/Cargo.toml +1 -1
- package/sdk-core/sdk-core-protos/build.rs +1 -0
- package/sdk-core/sdk-core-protos/src/history_info.rs +17 -4
- package/sdk-core/sdk-core-protos/src/lib.rs +251 -47
- package/sdk-core/test-utils/Cargo.toml +3 -1
- package/sdk-core/test-utils/src/canned_histories.rs +27 -0
- package/sdk-core/test-utils/src/histfetch.rs +3 -3
- package/sdk-core/test-utils/src/lib.rs +223 -68
- package/sdk-core/tests/integ_tests/client_tests.rs +27 -4
- package/sdk-core/tests/integ_tests/heartbeat_tests.rs +93 -14
- package/sdk-core/tests/integ_tests/polling_tests.rs +18 -12
- package/sdk-core/tests/integ_tests/queries_tests.rs +50 -53
- package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +117 -103
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +8 -1
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +10 -5
- package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +7 -1
- package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +32 -9
- package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +7 -1
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +76 -15
- package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +19 -3
- package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +39 -42
- package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +84 -0
- package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +30 -8
- package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +21 -6
- package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +26 -16
- package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +66 -0
- package/sdk-core/tests/integ_tests/workflow_tests.rs +78 -74
- package/sdk-core/tests/load_tests.rs +9 -6
- package/sdk-core/tests/main.rs +43 -10
- package/src/conversions.rs +7 -12
- package/src/lib.rs +322 -357
- package/sdk-core/client/src/mocks.rs +0 -167
- package/sdk-core/core/src/worker/dispatcher.rs +0 -171
- package/sdk-core/protos/local/temporal/sdk/core/bridge/service.proto +0 -61
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
replay::DEFAULT_WORKFLOW_TYPE,
|
|
3
3
|
test_help::{
|
|
4
|
-
build_mock_pollers, canned_histories,
|
|
4
|
+
build_mock_pollers, canned_histories, mock_worker, MockPollCfg, ResponseType, TEST_Q,
|
|
5
5
|
},
|
|
6
|
+
worker::client::mocks::mock_workflow_client,
|
|
6
7
|
workflow::managed_wf::ManagedWFFunc,
|
|
7
8
|
};
|
|
8
9
|
use std::sync::Arc;
|
|
9
|
-
use temporal_client::
|
|
10
|
-
use temporal_sdk::{
|
|
11
|
-
ChildWorkflowOptions, TestRustWorker, WfContext, WorkflowFunction, WorkflowResult,
|
|
12
|
-
};
|
|
10
|
+
use temporal_client::WorkflowOptions;
|
|
11
|
+
use temporal_sdk::{ChildWorkflowOptions, Signal, WfContext, WorkflowFunction, WorkflowResult};
|
|
13
12
|
use temporal_sdk_core_protos::coresdk::child_workflow::{
|
|
14
13
|
child_workflow_result, ChildWorkflowCancellationType,
|
|
15
14
|
};
|
|
15
|
+
use temporal_sdk_core_test_utils::TestWorker;
|
|
16
16
|
use tokio::join;
|
|
17
17
|
|
|
18
18
|
const SIGNAME: &str = "SIGNAME";
|
|
@@ -25,11 +25,11 @@ async fn signal_child_workflow(#[case] serial: bool) {
|
|
|
25
25
|
let wf_id = "fakeid";
|
|
26
26
|
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
27
27
|
let t = canned_histories::single_child_workflow_signaled("child-id-1", SIGNAME);
|
|
28
|
-
let mock =
|
|
28
|
+
let mock = mock_workflow_client();
|
|
29
29
|
let mh = MockPollCfg::from_resp_batches(wf_id, t, [ResponseType::AllHistory], mock);
|
|
30
30
|
let mock = build_mock_pollers(mh);
|
|
31
|
-
let core =
|
|
32
|
-
let mut worker =
|
|
31
|
+
let core = mock_worker(mock);
|
|
32
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
33
33
|
|
|
34
34
|
let wf = move |ctx: WfContext| async move {
|
|
35
35
|
let child = ctx.child_workflow(ChildWorkflowOptions {
|
|
@@ -44,11 +44,11 @@ async fn signal_child_workflow(#[case] serial: bool) {
|
|
|
44
44
|
.into_started()
|
|
45
45
|
.expect("Child should get started");
|
|
46
46
|
let (sigres, res) = if serial {
|
|
47
|
-
let sigres = start_res.signal(&ctx, SIGNAME, b"Hi!").await;
|
|
47
|
+
let sigres = start_res.signal(&ctx, Signal::new(SIGNAME, [b"Hi!"])).await;
|
|
48
48
|
let res = start_res.result().await;
|
|
49
49
|
(sigres, res)
|
|
50
50
|
} else {
|
|
51
|
-
let sigfut = start_res.signal(&ctx, SIGNAME, b"Hi!");
|
|
51
|
+
let sigfut = start_res.signal(&ctx, Signal::new(SIGNAME, [b"Hi!"]));
|
|
52
52
|
let resfut = start_res.result();
|
|
53
53
|
join!(sigfut, resfut)
|
|
54
54
|
};
|
|
@@ -59,7 +59,12 @@ async fn signal_child_workflow(#[case] serial: bool) {
|
|
|
59
59
|
|
|
60
60
|
worker.register_wf(wf_type.to_owned(), wf);
|
|
61
61
|
worker
|
|
62
|
-
.submit_wf(
|
|
62
|
+
.submit_wf(
|
|
63
|
+
wf_id.to_owned(),
|
|
64
|
+
wf_type.to_owned(),
|
|
65
|
+
vec![],
|
|
66
|
+
WorkflowOptions::default(),
|
|
67
|
+
)
|
|
63
68
|
.await
|
|
64
69
|
.unwrap();
|
|
65
70
|
worker.run_until_done().await.unwrap();
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
replay::DEFAULT_WORKFLOW_TYPE,
|
|
3
3
|
test_help::{
|
|
4
|
-
build_mock_pollers, canned_histories,
|
|
4
|
+
build_mock_pollers, canned_histories, mock_worker, MockPollCfg, ResponseType, TEST_Q,
|
|
5
5
|
},
|
|
6
|
+
worker::client::mocks::mock_workflow_client,
|
|
6
7
|
};
|
|
7
8
|
use std::{
|
|
8
9
|
sync::{
|
|
@@ -11,9 +12,10 @@ use std::{
|
|
|
11
12
|
},
|
|
12
13
|
time::Duration,
|
|
13
14
|
};
|
|
14
|
-
use temporal_client::
|
|
15
|
-
use temporal_sdk::{
|
|
15
|
+
use temporal_client::WorkflowOptions;
|
|
16
|
+
use temporal_sdk::{WfContext, WorkflowResult};
|
|
16
17
|
use temporal_sdk_core_protos::temporal::api::enums::v1::WorkflowTaskFailedCause;
|
|
18
|
+
use temporal_sdk_core_test_utils::TestWorker;
|
|
17
19
|
|
|
18
20
|
static DID_FAIL: AtomicBool = AtomicBool::new(false);
|
|
19
21
|
pub async fn timer_wf_fails_once(ctx: WfContext) -> WorkflowResult<()> {
|
|
@@ -34,7 +36,7 @@ async fn test_wf_task_rejected_properly() {
|
|
|
34
36
|
let wf_id = "fakeid";
|
|
35
37
|
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
36
38
|
let t = canned_histories::workflow_fails_with_failure_after_timer("1");
|
|
37
|
-
let mock =
|
|
39
|
+
let mock = mock_workflow_client();
|
|
38
40
|
let mut mh = MockPollCfg::from_resp_batches(wf_id, t, [1, 2, 2], mock);
|
|
39
41
|
// We should see one wft failure which has unspecified cause, since panics don't have a defined
|
|
40
42
|
// type.
|
|
@@ -42,12 +44,17 @@ async fn test_wf_task_rejected_properly() {
|
|
|
42
44
|
mh.expect_fail_wft_matcher =
|
|
43
45
|
Box::new(|_, cause, _| matches!(cause, WorkflowTaskFailedCause::Unspecified));
|
|
44
46
|
let mock = build_mock_pollers(mh);
|
|
45
|
-
let core =
|
|
46
|
-
let mut worker =
|
|
47
|
+
let core = mock_worker(mock);
|
|
48
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
47
49
|
|
|
48
50
|
worker.register_wf(wf_type.to_owned(), timer_wf_fails_once);
|
|
49
51
|
worker
|
|
50
|
-
.submit_wf(
|
|
52
|
+
.submit_wf(
|
|
53
|
+
wf_id.to_owned(),
|
|
54
|
+
wf_type.to_owned(),
|
|
55
|
+
vec![],
|
|
56
|
+
WorkflowOptions::default(),
|
|
57
|
+
)
|
|
51
58
|
.await
|
|
52
59
|
.unwrap();
|
|
53
60
|
worker.run_until_done().await.unwrap();
|
|
@@ -63,7 +70,7 @@ async fn test_wf_task_rejected_properly_due_to_nondeterminism(#[case] use_cache:
|
|
|
63
70
|
let wf_id = "fakeid";
|
|
64
71
|
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
65
72
|
let t = canned_histories::single_timer_wf_completes("1");
|
|
66
|
-
let mock =
|
|
73
|
+
let mock = mock_workflow_client();
|
|
67
74
|
let mut mh = MockPollCfg::from_resp_batches(
|
|
68
75
|
wf_id,
|
|
69
76
|
t,
|
|
@@ -77,12 +84,12 @@ async fn test_wf_task_rejected_properly_due_to_nondeterminism(#[case] use_cache:
|
|
|
77
84
|
Box::new(|_, cause, _| matches!(cause, WorkflowTaskFailedCause::NonDeterministicError));
|
|
78
85
|
let mut mock = build_mock_pollers(mh);
|
|
79
86
|
if use_cache {
|
|
80
|
-
mock.worker_cfg(
|
|
87
|
+
mock.worker_cfg(|cfg| {
|
|
81
88
|
cfg.max_cached_workflows = 2;
|
|
82
89
|
});
|
|
83
90
|
}
|
|
84
|
-
let core =
|
|
85
|
-
let mut worker =
|
|
91
|
+
let core = mock_worker(mock);
|
|
92
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
86
93
|
|
|
87
94
|
let started_count: &'static _ = Box::leak(Box::new(AtomicUsize::new(0)));
|
|
88
95
|
worker.register_wf(wf_type.to_owned(), move |ctx: WfContext| async move {
|
|
@@ -96,7 +103,12 @@ async fn test_wf_task_rejected_properly_due_to_nondeterminism(#[case] use_cache:
|
|
|
96
103
|
});
|
|
97
104
|
|
|
98
105
|
worker
|
|
99
|
-
.submit_wf(
|
|
106
|
+
.submit_wf(
|
|
107
|
+
wf_id.to_owned(),
|
|
108
|
+
wf_type.to_owned(),
|
|
109
|
+
vec![],
|
|
110
|
+
WorkflowOptions::default(),
|
|
111
|
+
)
|
|
100
112
|
.await
|
|
101
113
|
.unwrap();
|
|
102
114
|
worker.run_until_done().await.unwrap();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
replay::{default_wes_attribs, TestHistoryBuilder, DEFAULT_WORKFLOW_TYPE},
|
|
3
|
-
test_help::{build_mock_pollers,
|
|
4
|
-
|
|
3
|
+
test_help::{build_mock_pollers, mock_worker, MockPollCfg, ResponseType, TEST_Q},
|
|
4
|
+
worker::client::mocks::mock_workflow_client,
|
|
5
5
|
};
|
|
6
6
|
use anyhow::anyhow;
|
|
7
7
|
use futures::future::join_all;
|
|
@@ -12,12 +12,13 @@ use std::{
|
|
|
12
12
|
},
|
|
13
13
|
time::Duration,
|
|
14
14
|
};
|
|
15
|
-
use temporal_client::
|
|
16
|
-
use temporal_sdk::{LocalActivityOptions,
|
|
15
|
+
use temporal_client::WorkflowOptions;
|
|
16
|
+
use temporal_sdk::{LocalActivityOptions, WfContext, WorkflowResult};
|
|
17
17
|
use temporal_sdk_core_protos::{
|
|
18
18
|
coresdk::{common::RetryPolicy, AsJsonPayloadExt},
|
|
19
19
|
temporal::api::{enums::v1::EventType, failure::v1::Failure},
|
|
20
20
|
};
|
|
21
|
+
use temporal_sdk_core_test_utils::TestWorker;
|
|
21
22
|
use tokio::sync::Barrier;
|
|
22
23
|
|
|
23
24
|
async fn echo(e: String) -> anyhow::Result<String> {
|
|
@@ -44,7 +45,7 @@ async fn local_act_two_wfts_before_marker(#[case] replay: bool, #[case] cached:
|
|
|
44
45
|
t.add_workflow_execution_completed();
|
|
45
46
|
|
|
46
47
|
let wf_id = "fakeid";
|
|
47
|
-
let mock =
|
|
48
|
+
let mock = mock_workflow_client();
|
|
48
49
|
let resps = if replay {
|
|
49
50
|
vec![ResponseType::AllHistory]
|
|
50
51
|
} else {
|
|
@@ -53,10 +54,10 @@ async fn local_act_two_wfts_before_marker(#[case] replay: bool, #[case] cached:
|
|
|
53
54
|
let mh = MockPollCfg::from_resp_batches(wf_id, t, resps, mock);
|
|
54
55
|
let mut mock = build_mock_pollers(mh);
|
|
55
56
|
if cached {
|
|
56
|
-
mock.worker_cfg(
|
|
57
|
+
mock.worker_cfg(|cfg| cfg.max_cached_workflows = 1);
|
|
57
58
|
}
|
|
58
|
-
let core =
|
|
59
|
-
let mut worker =
|
|
59
|
+
let core = mock_worker(mock);
|
|
60
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
60
61
|
|
|
61
62
|
worker.register_wf(
|
|
62
63
|
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
@@ -73,7 +74,12 @@ async fn local_act_two_wfts_before_marker(#[case] replay: bool, #[case] cached:
|
|
|
73
74
|
);
|
|
74
75
|
worker.register_activity("echo", echo);
|
|
75
76
|
worker
|
|
76
|
-
.submit_wf(
|
|
77
|
+
.submit_wf(
|
|
78
|
+
wf_id.to_owned(),
|
|
79
|
+
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
80
|
+
vec![],
|
|
81
|
+
WorkflowOptions::default(),
|
|
82
|
+
)
|
|
77
83
|
.await
|
|
78
84
|
.unwrap();
|
|
79
85
|
worker.run_until_done().await.unwrap();
|
|
@@ -111,16 +117,21 @@ async fn local_act_many_concurrent() {
|
|
|
111
117
|
t.add_workflow_execution_completed();
|
|
112
118
|
|
|
113
119
|
let wf_id = "fakeid";
|
|
114
|
-
let mock =
|
|
120
|
+
let mock = mock_workflow_client();
|
|
115
121
|
let mh = MockPollCfg::from_resp_batches(wf_id, t, [1, 2, 3], mock);
|
|
116
122
|
let mock = build_mock_pollers(mh);
|
|
117
|
-
let core =
|
|
118
|
-
let mut worker =
|
|
123
|
+
let core = mock_worker(mock);
|
|
124
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
119
125
|
|
|
120
126
|
worker.register_wf(DEFAULT_WORKFLOW_TYPE.to_owned(), local_act_fanout_wf);
|
|
121
127
|
worker.register_activity("echo", |str: String| async move { Ok(str) });
|
|
122
128
|
worker
|
|
123
|
-
.submit_wf(
|
|
129
|
+
.submit_wf(
|
|
130
|
+
wf_id.to_owned(),
|
|
131
|
+
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
132
|
+
vec![],
|
|
133
|
+
WorkflowOptions::default(),
|
|
134
|
+
)
|
|
124
135
|
.await
|
|
125
136
|
.unwrap();
|
|
126
137
|
worker.run_until_done().await.unwrap();
|
|
@@ -151,15 +162,15 @@ async fn local_act_heartbeat(#[case] shutdown_middle: bool) {
|
|
|
151
162
|
t.add_workflow_task_scheduled_and_started();
|
|
152
163
|
|
|
153
164
|
let wf_id = "fakeid";
|
|
154
|
-
let mock =
|
|
165
|
+
let mock = mock_workflow_client();
|
|
155
166
|
// Allow returning incomplete history more than once, as the wft timeout can be timing sensitive
|
|
156
167
|
// and might poll an extra time
|
|
157
168
|
let mut mh = MockPollCfg::from_resp_batches(wf_id, t, [1, 2, 2, 2, 2], mock);
|
|
158
169
|
mh.enforce_correct_number_of_polls = false;
|
|
159
170
|
let mut mock = build_mock_pollers(mh);
|
|
160
|
-
mock.worker_cfg(
|
|
161
|
-
let core = Arc::new(
|
|
162
|
-
let mut worker =
|
|
171
|
+
mock.worker_cfg(|wc| wc.max_cached_workflows = 1);
|
|
172
|
+
let core = Arc::new(mock_worker(mock));
|
|
173
|
+
let mut worker = TestWorker::new(core.clone(), TEST_Q.to_string());
|
|
163
174
|
let shutdown_barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
|
|
164
175
|
|
|
165
176
|
worker.register_wf(
|
|
@@ -183,7 +194,12 @@ async fn local_act_heartbeat(#[case] shutdown_middle: bool) {
|
|
|
183
194
|
Ok(str)
|
|
184
195
|
});
|
|
185
196
|
worker
|
|
186
|
-
.submit_wf(
|
|
197
|
+
.submit_wf(
|
|
198
|
+
wf_id.to_owned(),
|
|
199
|
+
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
200
|
+
vec![],
|
|
201
|
+
WorkflowOptions::default(),
|
|
202
|
+
)
|
|
187
203
|
.await
|
|
188
204
|
.unwrap();
|
|
189
205
|
let (_, runres) = tokio::join!(
|
|
@@ -208,11 +224,11 @@ async fn local_act_fail_and_retry(#[case] eventually_pass: bool) {
|
|
|
208
224
|
t.add_workflow_task_scheduled_and_started();
|
|
209
225
|
|
|
210
226
|
let wf_id = "fakeid";
|
|
211
|
-
let mock =
|
|
227
|
+
let mock = mock_workflow_client();
|
|
212
228
|
let mh = MockPollCfg::from_resp_batches(wf_id, t, [1], mock);
|
|
213
229
|
let mock = build_mock_pollers(mh);
|
|
214
|
-
let core =
|
|
215
|
-
let mut worker =
|
|
230
|
+
let core = mock_worker(mock);
|
|
231
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
216
232
|
|
|
217
233
|
worker.register_wf(
|
|
218
234
|
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
@@ -249,7 +265,12 @@ async fn local_act_fail_and_retry(#[case] eventually_pass: bool) {
|
|
|
249
265
|
}
|
|
250
266
|
});
|
|
251
267
|
worker
|
|
252
|
-
.submit_wf(
|
|
268
|
+
.submit_wf(
|
|
269
|
+
wf_id.to_owned(),
|
|
270
|
+
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
271
|
+
vec![],
|
|
272
|
+
WorkflowOptions::default(),
|
|
273
|
+
)
|
|
253
274
|
.await
|
|
254
275
|
.unwrap();
|
|
255
276
|
worker.run_until_done().await.unwrap();
|
|
@@ -281,7 +302,7 @@ async fn local_act_retry_long_backoff_uses_timer() {
|
|
|
281
302
|
t.add_workflow_execution_completed();
|
|
282
303
|
|
|
283
304
|
let wf_id = "fakeid";
|
|
284
|
-
let mock =
|
|
305
|
+
let mock = mock_workflow_client();
|
|
285
306
|
let mh = MockPollCfg::from_resp_batches(
|
|
286
307
|
wf_id,
|
|
287
308
|
t,
|
|
@@ -289,9 +310,9 @@ async fn local_act_retry_long_backoff_uses_timer() {
|
|
|
289
310
|
mock,
|
|
290
311
|
);
|
|
291
312
|
let mut mock = build_mock_pollers(mh);
|
|
292
|
-
mock.worker_cfg(
|
|
293
|
-
let core =
|
|
294
|
-
let mut worker =
|
|
313
|
+
mock.worker_cfg(|w| w.max_cached_workflows = 1);
|
|
314
|
+
let core = mock_worker(mock);
|
|
315
|
+
let mut worker = TestWorker::new(Arc::new(core), TEST_Q.to_string());
|
|
295
316
|
|
|
296
317
|
worker.register_wf(
|
|
297
318
|
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
@@ -321,7 +342,12 @@ async fn local_act_retry_long_backoff_uses_timer() {
|
|
|
321
342
|
Result::<(), _>::Err(anyhow!("Oh no I failed!"))
|
|
322
343
|
});
|
|
323
344
|
worker
|
|
324
|
-
.submit_wf(
|
|
345
|
+
.submit_wf(
|
|
346
|
+
wf_id.to_owned(),
|
|
347
|
+
DEFAULT_WORKFLOW_TYPE.to_owned(),
|
|
348
|
+
vec![],
|
|
349
|
+
WorkflowOptions::default(),
|
|
350
|
+
)
|
|
325
351
|
.await
|
|
326
352
|
.unwrap();
|
|
327
353
|
worker.run_until_done().await.unwrap();
|
|
@@ -10,32 +10,37 @@ mod workflow_tasks;
|
|
|
10
10
|
|
|
11
11
|
use crate::{
|
|
12
12
|
errors::{PollActivityError, PollWfError},
|
|
13
|
-
test_help::{
|
|
14
|
-
|
|
13
|
+
test_help::{build_mock_pollers, canned_histories, mock_worker, test_worker_cfg, MockPollCfg},
|
|
14
|
+
worker::client::mocks::{mock_manual_workflow_client, mock_workflow_client},
|
|
15
|
+
Worker,
|
|
15
16
|
};
|
|
16
17
|
use futures::FutureExt;
|
|
17
18
|
use std::time::Duration;
|
|
18
|
-
use
|
|
19
|
-
use temporal_sdk_core_protos::
|
|
20
|
-
coresdk::workflow_completion::WorkflowActivationCompletion,
|
|
21
|
-
temporal::api::workflowservice::v1::PollActivityTaskQueueResponse,
|
|
22
|
-
};
|
|
19
|
+
use temporal_sdk_core_api::Worker as WorkerTrait;
|
|
20
|
+
use temporal_sdk_core_protos::coresdk::workflow_completion::WorkflowActivationCompletion;
|
|
23
21
|
use tokio::{sync::Barrier, time::sleep};
|
|
24
22
|
|
|
25
23
|
#[tokio::test]
|
|
26
24
|
async fn after_shutdown_server_is_not_polled() {
|
|
27
25
|
let t = canned_histories::single_timer("fake_timer");
|
|
28
|
-
let
|
|
29
|
-
let
|
|
26
|
+
let mh = MockPollCfg::from_resp_batches("fake_wf_id", t, [1], mock_workflow_client());
|
|
27
|
+
let mut mock = build_mock_pollers(mh);
|
|
28
|
+
// Just so we don't have to deal w/ cache overflow
|
|
29
|
+
mock.worker_cfg(|cfg| cfg.max_cached_workflows = 1);
|
|
30
|
+
let worker = mock_worker(mock);
|
|
31
|
+
|
|
32
|
+
let res = worker.poll_workflow_activation().await.unwrap();
|
|
30
33
|
assert_eq!(res.jobs.len(), 1);
|
|
31
|
-
|
|
34
|
+
worker
|
|
35
|
+
.complete_workflow_activation(WorkflowActivationCompletion::empty(res.run_id))
|
|
32
36
|
.await
|
|
33
37
|
.unwrap();
|
|
34
|
-
|
|
38
|
+
worker.shutdown().await;
|
|
35
39
|
assert_matches!(
|
|
36
|
-
|
|
40
|
+
worker.poll_workflow_activation().await.unwrap_err(),
|
|
37
41
|
PollWfError::ShutDown
|
|
38
42
|
);
|
|
43
|
+
worker.finalize_shutdown().await;
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
// Better than cloning a billion arcs...
|
|
@@ -44,70 +49,52 @@ lazy_static::lazy_static! {
|
|
|
44
49
|
}
|
|
45
50
|
#[tokio::test]
|
|
46
51
|
async fn shutdown_interrupts_both_polls() {
|
|
47
|
-
let mut
|
|
48
|
-
|
|
52
|
+
let mut mock_client = mock_manual_workflow_client();
|
|
53
|
+
mock_client
|
|
49
54
|
.expect_poll_activity_task()
|
|
50
55
|
.times(1)
|
|
51
|
-
.returning(move |_| {
|
|
56
|
+
.returning(move |_, _| {
|
|
52
57
|
async move {
|
|
53
58
|
BARR.wait().await;
|
|
54
59
|
sleep(Duration::from_secs(1)).await;
|
|
55
|
-
Ok(
|
|
56
|
-
task_token: vec![1],
|
|
57
|
-
heartbeat_timeout: Some(Duration::from_secs(1).into()),
|
|
58
|
-
..Default::default()
|
|
59
|
-
})
|
|
60
|
+
Ok(Default::default())
|
|
60
61
|
}
|
|
61
62
|
.boxed()
|
|
62
63
|
});
|
|
63
|
-
|
|
64
|
+
mock_client
|
|
64
65
|
.expect_poll_workflow_task()
|
|
65
66
|
.times(1)
|
|
66
67
|
.returning(move |_, _| {
|
|
67
68
|
async move {
|
|
68
69
|
BARR.wait().await;
|
|
69
70
|
sleep(Duration::from_secs(1)).await;
|
|
70
|
-
|
|
71
|
-
Ok(hist_to_poll_resp(
|
|
72
|
-
&t,
|
|
73
|
-
"wf".to_string(),
|
|
74
|
-
ResponseType::AllHistory,
|
|
75
|
-
TEST_Q.to_string(),
|
|
76
|
-
))
|
|
71
|
+
Ok(Default::default())
|
|
77
72
|
}
|
|
78
73
|
.boxed()
|
|
79
74
|
});
|
|
80
75
|
|
|
81
|
-
let
|
|
82
|
-
|
|
83
|
-
CoreInitOptionsBuilder::default()
|
|
84
|
-
.gateway_opts(fake_sg_opts())
|
|
85
|
-
.build()
|
|
86
|
-
.unwrap(),
|
|
87
|
-
);
|
|
88
|
-
core.register_worker(
|
|
89
|
-
WorkerConfigBuilder::default()
|
|
90
|
-
.task_queue(TEST_Q)
|
|
76
|
+
let worker = Worker::new_test(
|
|
77
|
+
test_worker_cfg()
|
|
91
78
|
// Need only 1 concurrent pollers for mock expectations to work here
|
|
92
79
|
.max_concurrent_wft_polls(1_usize)
|
|
93
80
|
.max_concurrent_at_polls(1_usize)
|
|
94
81
|
.build()
|
|
95
82
|
.unwrap(),
|
|
96
|
-
|
|
97
|
-
|
|
83
|
+
mock_client,
|
|
84
|
+
);
|
|
98
85
|
tokio::join! {
|
|
99
86
|
async {
|
|
100
|
-
assert_matches!(
|
|
87
|
+
assert_matches!(worker.poll_activity_task().await.unwrap_err(),
|
|
101
88
|
PollActivityError::ShutDown);
|
|
102
89
|
},
|
|
103
90
|
async {
|
|
104
|
-
assert_matches!(
|
|
91
|
+
assert_matches!(worker.poll_workflow_activation().await.unwrap_err(),
|
|
105
92
|
PollWfError::ShutDown);
|
|
106
93
|
},
|
|
107
94
|
async {
|
|
108
95
|
// Give polling a bit to get stuck, then shutdown
|
|
109
96
|
BARR.wait().await;
|
|
110
|
-
|
|
97
|
+
worker.shutdown().await;
|
|
111
98
|
}
|
|
112
99
|
};
|
|
113
100
|
}
|