@temporalio/core-bridge 0.17.2 → 0.18.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 +339 -226
- package/Cargo.toml +7 -3
- package/common.js +50 -0
- package/index.d.ts +7 -0
- package/index.js +12 -0
- package/package.json +7 -4
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/{index.node → releases/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/scripts/build.js +10 -50
- package/sdk-core/.buildkite/docker/Dockerfile +1 -1
- package/sdk-core/.buildkite/docker/docker-compose.yaml +2 -2
- package/sdk-core/.buildkite/pipeline.yml +2 -0
- package/sdk-core/Cargo.toml +1 -88
- package/sdk-core/README.md +30 -6
- package/sdk-core/bridge-ffi/Cargo.toml +24 -0
- package/sdk-core/bridge-ffi/LICENSE.txt +23 -0
- package/sdk-core/bridge-ffi/build.rs +25 -0
- package/sdk-core/bridge-ffi/include/sdk-core-bridge.h +216 -0
- package/sdk-core/bridge-ffi/src/lib.rs +829 -0
- package/sdk-core/bridge-ffi/src/wrappers.rs +193 -0
- package/sdk-core/client/Cargo.toml +32 -0
- package/sdk-core/{src/pollers/gateway.rs → client/src/lib.rs} +101 -195
- package/sdk-core/client/src/metrics.rs +89 -0
- package/sdk-core/client/src/mocks.rs +167 -0
- package/sdk-core/{src/pollers → client/src}/retry.rs +172 -14
- package/sdk-core/core/Cargo.toml +96 -0
- package/sdk-core/{src → core/src}/core_tests/activity_tasks.rs +193 -37
- package/sdk-core/{src → core/src}/core_tests/child_workflows.rs +14 -14
- package/sdk-core/{src → core/src}/core_tests/determinism.rs +8 -8
- package/sdk-core/core/src/core_tests/local_activities.rs +328 -0
- package/sdk-core/{src → core/src}/core_tests/mod.rs +6 -9
- package/sdk-core/{src → core/src}/core_tests/queries.rs +45 -52
- package/sdk-core/{src → core/src}/core_tests/replay_flag.rs +8 -12
- package/sdk-core/{src → core/src}/core_tests/workers.rs +120 -33
- package/sdk-core/{src → core/src}/core_tests/workflow_cancels.rs +16 -26
- package/sdk-core/{src → core/src}/core_tests/workflow_tasks.rs +264 -286
- package/sdk-core/core/src/lib.rs +374 -0
- package/sdk-core/{src → core/src}/log_export.rs +3 -27
- package/sdk-core/core/src/pending_activations.rs +162 -0
- package/sdk-core/{src → core/src}/pollers/mod.rs +4 -22
- package/sdk-core/{src → core/src}/pollers/poll_buffer.rs +1 -1
- package/sdk-core/core/src/protosext/mod.rs +396 -0
- package/sdk-core/core/src/replay/mod.rs +210 -0
- package/sdk-core/core/src/retry_logic.rs +144 -0
- package/sdk-core/{src → core/src}/telemetry/metrics.rs +3 -58
- package/sdk-core/{src → core/src}/telemetry/mod.rs +8 -8
- package/sdk-core/{src → core/src}/telemetry/prometheus_server.rs +0 -0
- package/sdk-core/{src → core/src}/test_help/mod.rs +34 -73
- package/sdk-core/{src → core/src}/worker/activities/activity_heartbeat_manager.rs +95 -42
- package/sdk-core/core/src/worker/activities/local_activities.rs +973 -0
- package/sdk-core/{src → core/src}/worker/activities.rs +52 -33
- package/sdk-core/{src → core/src}/worker/dispatcher.rs +8 -6
- package/sdk-core/{src → core/src}/worker/mod.rs +305 -195
- package/sdk-core/core/src/worker/wft_delivery.rs +81 -0
- package/sdk-core/{src → core/src}/workflow/bridge.rs +5 -2
- package/sdk-core/{src → core/src}/workflow/driven_workflow.rs +17 -7
- package/sdk-core/{src → core/src}/workflow/history_update.rs +33 -7
- package/sdk-core/{src → core/src/workflow}/machines/activity_state_machine.rs +26 -26
- package/sdk-core/{src → core/src/workflow}/machines/cancel_external_state_machine.rs +8 -11
- package/sdk-core/{src → core/src/workflow}/machines/cancel_workflow_state_machine.rs +19 -21
- package/sdk-core/{src → core/src/workflow}/machines/child_workflow_state_machine.rs +19 -21
- package/sdk-core/{src → core/src/workflow}/machines/complete_workflow_state_machine.rs +3 -5
- package/sdk-core/{src → core/src/workflow}/machines/continue_as_new_workflow_state_machine.rs +18 -18
- package/sdk-core/{src → core/src/workflow}/machines/fail_workflow_state_machine.rs +5 -6
- package/sdk-core/core/src/workflow/machines/local_activity_state_machine.rs +1451 -0
- package/sdk-core/{src → core/src/workflow}/machines/mod.rs +54 -107
- package/sdk-core/{src → core/src/workflow}/machines/mutable_side_effect_state_machine.rs +0 -0
- package/sdk-core/{src → core/src/workflow}/machines/patch_state_machine.rs +29 -30
- package/sdk-core/{src → core/src/workflow}/machines/side_effect_state_machine.rs +0 -0
- package/sdk-core/{src → core/src/workflow}/machines/signal_external_state_machine.rs +17 -19
- package/sdk-core/{src → core/src/workflow}/machines/timer_state_machine.rs +20 -21
- package/sdk-core/{src → core/src/workflow}/machines/transition_coverage.rs +5 -2
- package/sdk-core/{src → core/src/workflow}/machines/upsert_search_attributes_state_machine.rs +0 -0
- package/sdk-core/core/src/workflow/machines/workflow_machines/local_acts.rs +96 -0
- package/sdk-core/{src → core/src/workflow}/machines/workflow_machines.rs +344 -160
- package/sdk-core/{src → core/src/workflow}/machines/workflow_task_state_machine.rs +1 -1
- package/sdk-core/{src → core/src}/workflow/mod.rs +200 -39
- package/sdk-core/{src → core/src}/workflow/workflow_tasks/cache_manager.rs +0 -0
- package/sdk-core/{src → core/src}/workflow/workflow_tasks/concurrency_manager.rs +38 -5
- package/sdk-core/{src → core/src}/workflow/workflow_tasks/mod.rs +297 -81
- package/sdk-core/{test_utils → core-api}/Cargo.toml +10 -7
- package/sdk-core/{src → core-api/src}/errors.rs +42 -90
- package/sdk-core/core-api/src/lib.rs +158 -0
- package/sdk-core/{src/worker/config.rs → core-api/src/worker.rs} +18 -23
- package/sdk-core/etc/deps.svg +156 -0
- package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +5 -5
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +3 -5
- package/sdk-core/fsm/rustfsm_trait/src/lib.rs +7 -1
- package/sdk-core/histories/fail_wf_task.bin +0 -0
- package/sdk-core/histories/timer_workflow_history.bin +0 -0
- package/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +44 -13
- package/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +19 -1
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +1 -1
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +9 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +1 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +1 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +13 -0
- package/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +14 -7
- package/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +176 -18
- package/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -0
- package/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +11 -0
- package/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +3 -0
- package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +156 -7
- package/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +135 -104
- package/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
- package/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +78 -0
- package/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +205 -0
- package/sdk-core/protos/local/temporal/sdk/core/bridge/service.proto +61 -0
- package/sdk-core/protos/local/{child_workflow.proto → temporal/sdk/core/child_workflow/child_workflow.proto} +1 -1
- package/sdk-core/protos/local/{common.proto → temporal/sdk/core/common/common.proto} +5 -3
- package/sdk-core/protos/local/{core_interface.proto → temporal/sdk/core/core_interface.proto} +10 -10
- package/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
- package/sdk-core/protos/local/{workflow_activation.proto → temporal/sdk/core/workflow_activation/workflow_activation.proto} +35 -11
- package/sdk-core/protos/local/{workflow_commands.proto → temporal/sdk/core/workflow_commands/workflow_commands.proto} +55 -4
- package/sdk-core/protos/local/{workflow_completion.proto → temporal/sdk/core/workflow_completion/workflow_completion.proto} +3 -3
- package/sdk-core/sdk/Cargo.toml +32 -0
- package/sdk-core/{src/prototype_rust_sdk → sdk/src}/conversions.rs +0 -0
- package/sdk-core/sdk/src/lib.rs +699 -0
- package/sdk-core/sdk/src/payload_converter.rs +11 -0
- package/sdk-core/sdk/src/workflow_context/options.rs +180 -0
- package/sdk-core/{src/prototype_rust_sdk → sdk/src}/workflow_context.rs +201 -124
- package/sdk-core/{src/prototype_rust_sdk → sdk/src}/workflow_future.rs +63 -30
- package/sdk-core/sdk-core-protos/Cargo.toml +10 -0
- package/sdk-core/sdk-core-protos/build.rs +28 -6
- package/sdk-core/sdk-core-protos/src/constants.rs +7 -0
- package/sdk-core/{src/test_help → sdk-core-protos/src}/history_builder.rs +134 -49
- package/sdk-core/sdk-core-protos/src/history_info.rs +216 -0
- package/sdk-core/sdk-core-protos/src/lib.rs +594 -168
- package/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
- package/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
- package/sdk-core/test-utils/Cargo.toml +32 -0
- package/sdk-core/{src/test_help → test-utils/src}/canned_histories.rs +59 -78
- package/sdk-core/test-utils/src/histfetch.rs +28 -0
- package/sdk-core/{test_utils → test-utils}/src/lib.rs +131 -68
- package/sdk-core/tests/integ_tests/client_tests.rs +1 -1
- package/sdk-core/tests/integ_tests/heartbeat_tests.rs +11 -7
- package/sdk-core/tests/integ_tests/polling_tests.rs +12 -11
- package/sdk-core/tests/integ_tests/queries_tests.rs +82 -78
- package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +91 -71
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +3 -4
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +2 -4
- package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +4 -6
- package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +4 -6
- package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -4
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +496 -0
- package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +5 -8
- package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +125 -0
- package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +7 -13
- package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +33 -5
- package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +12 -16
- package/sdk-core/tests/integ_tests/workflow_tests.rs +85 -82
- package/sdk-core/tests/load_tests.rs +6 -6
- package/sdk-core/tests/main.rs +2 -2
- package/src/conversions.rs +24 -21
- package/src/errors.rs +8 -0
- package/src/lib.rs +323 -211
- package/sdk-core/protos/local/activity_result.proto +0 -46
- package/sdk-core/protos/local/activity_task.proto +0 -66
- package/sdk-core/src/core_tests/retry.rs +0 -147
- package/sdk-core/src/lib.rs +0 -403
- package/sdk-core/src/machines/local_activity_state_machine.rs +0 -117
- package/sdk-core/src/pending_activations.rs +0 -249
- package/sdk-core/src/protosext/mod.rs +0 -160
- package/sdk-core/src/prototype_rust_sdk.rs +0 -412
- package/sdk-core/src/task_token.rs +0 -20
- package/sdk-core/src/test_help/history_info.rs +0 -158
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
use assert_matches::assert_matches;
|
|
2
2
|
use futures::future::join_all;
|
|
3
3
|
use std::time::Duration;
|
|
4
|
-
use
|
|
4
|
+
use temporal_sdk::{WfContext, WorkflowResult};
|
|
5
5
|
use temporal_sdk_core_protos::coresdk::{
|
|
6
6
|
activity_task::activity_task as act_task,
|
|
7
|
-
workflow_activation::{
|
|
7
|
+
workflow_activation::{workflow_activation_job, FireTimer, WorkflowActivationJob},
|
|
8
8
|
workflow_commands::{ActivityCancellationType, RequestCancelActivity, StartTimer},
|
|
9
|
-
workflow_completion::
|
|
9
|
+
workflow_completion::WorkflowActivationCompletion,
|
|
10
10
|
IntoCompletion,
|
|
11
11
|
};
|
|
12
|
-
use
|
|
12
|
+
use temporal_sdk_core_test_utils::{
|
|
13
|
+
init_core_and_create_wf, schedule_activity_cmd, CoreTestHelpers, CoreWfStarter,
|
|
14
|
+
};
|
|
13
15
|
use tokio::time::timeout;
|
|
14
16
|
|
|
15
17
|
#[tokio::test]
|
|
@@ -52,8 +54,8 @@ async fn out_of_order_completion_doesnt_hang() {
|
|
|
52
54
|
assert_matches!(
|
|
53
55
|
task.jobs.as_slice(),
|
|
54
56
|
[
|
|
55
|
-
|
|
56
|
-
variant: Some(
|
|
57
|
+
WorkflowActivationJob {
|
|
58
|
+
variant: Some(workflow_activation_job::Variant::FireTimer(
|
|
57
59
|
FireTimer { seq: t_seq }
|
|
58
60
|
)),
|
|
59
61
|
},
|
|
@@ -73,8 +75,8 @@ async fn out_of_order_completion_doesnt_hang() {
|
|
|
73
75
|
.unwrap();
|
|
74
76
|
assert_matches!(
|
|
75
77
|
task.jobs.as_slice(),
|
|
76
|
-
[
|
|
77
|
-
variant: Some(
|
|
78
|
+
[WorkflowActivationJob {
|
|
79
|
+
variant: Some(workflow_activation_job::Variant::ResolveActivity(_)),
|
|
78
80
|
}]
|
|
79
81
|
);
|
|
80
82
|
cc.complete_execution(&tq, &task.run_id).await;
|
|
@@ -83,7 +85,7 @@ async fn out_of_order_completion_doesnt_hang() {
|
|
|
83
85
|
tokio::time::sleep(Duration::from_millis(100)).await;
|
|
84
86
|
// Then complete the (last) WFT with a request to cancel the AT, which should produce a
|
|
85
87
|
// pending activation, unblocking the (already started) poll
|
|
86
|
-
core.complete_workflow_activation(
|
|
88
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
87
89
|
&task_q,
|
|
88
90
|
task.run_id,
|
|
89
91
|
vec![RequestCancelActivity { seq: 0 }.into()],
|
|
@@ -94,7 +96,7 @@ async fn out_of_order_completion_doesnt_hang() {
|
|
|
94
96
|
jh.await.unwrap();
|
|
95
97
|
}
|
|
96
98
|
|
|
97
|
-
pub async fn many_parallel_timers_longhist(
|
|
99
|
+
pub async fn many_parallel_timers_longhist(ctx: WfContext) -> WorkflowResult<()> {
|
|
98
100
|
for _ in 0..20 {
|
|
99
101
|
let mut futs = vec![];
|
|
100
102
|
for _ in 0..1000 {
|
|
@@ -122,5 +124,4 @@ async fn can_paginate_long_history() {
|
|
|
122
124
|
.await
|
|
123
125
|
.unwrap();
|
|
124
126
|
worker.run_until_done().await.unwrap();
|
|
125
|
-
starter.shutdown().await;
|
|
126
127
|
}
|
|
@@ -3,21 +3,21 @@ use futures::{prelude::stream::FuturesUnordered, FutureExt, StreamExt};
|
|
|
3
3
|
use std::time::Duration;
|
|
4
4
|
use temporal_sdk_core_protos::{
|
|
5
5
|
coresdk::{
|
|
6
|
-
workflow_activation::{
|
|
6
|
+
workflow_activation::{workflow_activation_job, WorkflowActivationJob},
|
|
7
7
|
workflow_commands::{QueryResult, QuerySuccess, StartTimer},
|
|
8
|
-
workflow_completion::
|
|
8
|
+
workflow_completion::WorkflowActivationCompletion,
|
|
9
9
|
},
|
|
10
10
|
temporal::api::{failure::v1::Failure, query::v1::WorkflowQuery},
|
|
11
11
|
};
|
|
12
|
-
use
|
|
12
|
+
use temporal_sdk_core_test_utils::{init_core_and_create_wf, CoreTestHelpers, CoreWfStarter};
|
|
13
13
|
|
|
14
14
|
#[tokio::test]
|
|
15
15
|
async fn simple_query_legacy() {
|
|
16
|
-
let workflow_id = "simple_query";
|
|
17
16
|
let query_resp = b"response";
|
|
18
|
-
let (core, task_q) = init_core_and_create_wf(
|
|
17
|
+
let (core, task_q) = init_core_and_create_wf("simple_query_legacy").await;
|
|
18
|
+
let workflow_id = task_q.clone();
|
|
19
19
|
let task = core.poll_workflow_activation(&task_q).await.unwrap();
|
|
20
|
-
core.complete_workflow_activation(
|
|
20
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
21
21
|
&task_q,
|
|
22
22
|
task.run_id.clone(),
|
|
23
23
|
vec![
|
|
@@ -37,18 +37,20 @@ async fn simple_query_legacy() {
|
|
|
37
37
|
.unwrap();
|
|
38
38
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
39
39
|
// Query after timer should have fired and there should be new WFT
|
|
40
|
-
let query_fut =
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
40
|
+
let query_fut = async {
|
|
41
|
+
core.server_gateway()
|
|
42
|
+
.query_workflow_execution(
|
|
43
|
+
workflow_id,
|
|
44
|
+
task.run_id.to_string(),
|
|
45
|
+
WorkflowQuery {
|
|
46
|
+
query_type: "myquery".to_string(),
|
|
47
|
+
query_args: Some(b"hi".into()),
|
|
48
|
+
header: None,
|
|
49
|
+
},
|
|
50
|
+
)
|
|
51
|
+
.await
|
|
52
|
+
.unwrap()
|
|
53
|
+
};
|
|
52
54
|
let workflow_completions_future = async {
|
|
53
55
|
// Give query a beat to get going
|
|
54
56
|
tokio::time::sleep(Duration::from_millis(400)).await;
|
|
@@ -57,11 +59,11 @@ async fn simple_query_legacy() {
|
|
|
57
59
|
let task = core.poll_workflow_activation(&task_q).await.unwrap();
|
|
58
60
|
assert_matches!(
|
|
59
61
|
task.jobs.as_slice(),
|
|
60
|
-
[
|
|
61
|
-
variant: Some(
|
|
62
|
+
[WorkflowActivationJob {
|
|
63
|
+
variant: Some(workflow_activation_job::Variant::FireTimer(_)),
|
|
62
64
|
}]
|
|
63
65
|
);
|
|
64
|
-
core.complete_workflow_activation(
|
|
66
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
65
67
|
&task_q,
|
|
66
68
|
task.run_id,
|
|
67
69
|
vec![],
|
|
@@ -72,12 +74,12 @@ async fn simple_query_legacy() {
|
|
|
72
74
|
// Poll again, and we end up getting a `query` field query response
|
|
73
75
|
let query = assert_matches!(
|
|
74
76
|
task.jobs.as_slice(),
|
|
75
|
-
[
|
|
76
|
-
variant: Some(
|
|
77
|
+
[WorkflowActivationJob {
|
|
78
|
+
variant: Some(workflow_activation_job::Variant::QueryWorkflow(q)),
|
|
77
79
|
}] => q
|
|
78
80
|
);
|
|
79
81
|
// Complete the query
|
|
80
|
-
core.complete_workflow_activation(
|
|
82
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
|
|
81
83
|
&task_q,
|
|
82
84
|
task.run_id,
|
|
83
85
|
QueryResult {
|
|
@@ -107,9 +109,10 @@ async fn simple_query_legacy() {
|
|
|
107
109
|
#[case::with_eviction(true)]
|
|
108
110
|
#[tokio::test]
|
|
109
111
|
async fn query_after_execution_complete(#[case] do_evict: bool) {
|
|
110
|
-
let workflow_id = &format!("after_done_query_evict-{}", do_evict);
|
|
111
112
|
let query_resp = b"response";
|
|
112
|
-
let (ref core, ref task_q) =
|
|
113
|
+
let (ref core, ref task_q) =
|
|
114
|
+
init_core_and_create_wf(&format!("after_done_query_evict-{}", do_evict)).await;
|
|
115
|
+
let workflow_id = task_q.as_str();
|
|
113
116
|
|
|
114
117
|
let do_workflow = |go_until_query: bool| async move {
|
|
115
118
|
loop {
|
|
@@ -117,11 +120,11 @@ async fn query_after_execution_complete(#[case] do_evict: bool) {
|
|
|
117
120
|
|
|
118
121
|
// When we see the query, handle it.
|
|
119
122
|
if go_until_query {
|
|
120
|
-
if let [
|
|
121
|
-
variant: Some(
|
|
123
|
+
if let [WorkflowActivationJob {
|
|
124
|
+
variant: Some(workflow_activation_job::Variant::QueryWorkflow(query)),
|
|
122
125
|
}] = task.jobs.as_slice()
|
|
123
126
|
{
|
|
124
|
-
core.complete_workflow_activation(
|
|
127
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
|
|
125
128
|
task_q,
|
|
126
129
|
task.run_id,
|
|
127
130
|
QueryResult {
|
|
@@ -143,11 +146,11 @@ async fn query_after_execution_complete(#[case] do_evict: bool) {
|
|
|
143
146
|
|
|
144
147
|
if matches!(
|
|
145
148
|
task.jobs.as_slice(),
|
|
146
|
-
[
|
|
147
|
-
variant: Some(
|
|
149
|
+
[WorkflowActivationJob {
|
|
150
|
+
variant: Some(workflow_activation_job::Variant::RemoveFromCache(_)),
|
|
148
151
|
}]
|
|
149
152
|
) {
|
|
150
|
-
core.complete_workflow_activation(
|
|
153
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::empty(
|
|
151
154
|
task_q,
|
|
152
155
|
task.run_id,
|
|
153
156
|
))
|
|
@@ -157,8 +160,8 @@ async fn query_after_execution_complete(#[case] do_evict: bool) {
|
|
|
157
160
|
}
|
|
158
161
|
assert_matches!(
|
|
159
162
|
task.jobs.as_slice(),
|
|
160
|
-
[
|
|
161
|
-
variant: Some(
|
|
163
|
+
[WorkflowActivationJob {
|
|
164
|
+
variant: Some(workflow_activation_job::Variant::StartWorkflow(_)),
|
|
162
165
|
}]
|
|
163
166
|
);
|
|
164
167
|
let run_id = task.run_id.clone();
|
|
@@ -191,6 +194,7 @@ async fn query_after_execution_complete(#[case] do_evict: bool) {
|
|
|
191
194
|
WorkflowQuery {
|
|
192
195
|
query_type: "myquery".to_string(),
|
|
193
196
|
query_args: Some(b"hi".into()),
|
|
197
|
+
header: None,
|
|
194
198
|
},
|
|
195
199
|
)
|
|
196
200
|
.await
|
|
@@ -209,11 +213,9 @@ async fn query_after_execution_complete(#[case] do_evict: bool) {
|
|
|
209
213
|
#[tokio::test]
|
|
210
214
|
async fn repros_query_dropped_on_floor() {
|
|
211
215
|
// This test reliably repros the server dropping one of the two simultaneously issued queries.
|
|
212
|
-
|
|
213
|
-
let workflow_id = "queries_in_wf_task";
|
|
214
216
|
let q1_resp = b"query_1_resp";
|
|
215
217
|
let q2_resp = b"query_2_resp";
|
|
216
|
-
let mut wf_starter = CoreWfStarter::new(
|
|
218
|
+
let mut wf_starter = CoreWfStarter::new("repros_query_dropped_on_floor");
|
|
217
219
|
// Easiest way I discovered to reliably trigger new query path is with a WFT timeout
|
|
218
220
|
wf_starter.wft_timeout(Duration::from_secs(1));
|
|
219
221
|
let core = wf_starter.get_core().await;
|
|
@@ -228,7 +230,7 @@ async fn repros_query_dropped_on_floor() {
|
|
|
228
230
|
let task = core.poll_workflow_activation(task_q).await.unwrap();
|
|
229
231
|
tokio::time::sleep(Duration::from_secs(2)).await;
|
|
230
232
|
// Complete now-timed-out task (add a new timer)
|
|
231
|
-
core.complete_workflow_activation(
|
|
233
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
232
234
|
task_q,
|
|
233
235
|
task.run_id.clone(),
|
|
234
236
|
vec![],
|
|
@@ -237,35 +239,35 @@ async fn repros_query_dropped_on_floor() {
|
|
|
237
239
|
.unwrap();
|
|
238
240
|
|
|
239
241
|
let run_id = task.run_id.to_string();
|
|
240
|
-
let q1_fut =
|
|
241
|
-
|
|
242
|
+
let q1_fut = async {
|
|
243
|
+
core.server_gateway()
|
|
242
244
|
.query_workflow_execution(
|
|
243
|
-
|
|
245
|
+
task_q.to_string(),
|
|
244
246
|
run_id,
|
|
245
247
|
WorkflowQuery {
|
|
246
248
|
query_type: "query_1".to_string(),
|
|
247
249
|
query_args: Some(b"hi 1".into()),
|
|
250
|
+
header: None,
|
|
248
251
|
},
|
|
249
252
|
)
|
|
250
253
|
.await
|
|
251
|
-
.unwrap()
|
|
252
|
-
|
|
253
|
-
});
|
|
254
|
+
.unwrap()
|
|
255
|
+
};
|
|
254
256
|
let run_id = task.run_id.to_string();
|
|
255
|
-
let q2_fut =
|
|
256
|
-
|
|
257
|
+
let q2_fut = async {
|
|
258
|
+
core.server_gateway()
|
|
257
259
|
.query_workflow_execution(
|
|
258
|
-
|
|
260
|
+
task_q.to_string(),
|
|
259
261
|
run_id,
|
|
260
262
|
WorkflowQuery {
|
|
261
263
|
query_type: "query_2".to_string(),
|
|
262
264
|
query_args: Some(b"hi 2".into()),
|
|
265
|
+
header: None,
|
|
263
266
|
},
|
|
264
267
|
)
|
|
265
268
|
.await
|
|
266
|
-
.unwrap()
|
|
267
|
-
|
|
268
|
-
});
|
|
269
|
+
.unwrap()
|
|
270
|
+
};
|
|
269
271
|
let workflow_completions_future = async {
|
|
270
272
|
let mut seen_q1 = false;
|
|
271
273
|
let mut seen_q2 = false;
|
|
@@ -274,8 +276,8 @@ async fn repros_query_dropped_on_floor() {
|
|
|
274
276
|
|
|
275
277
|
if matches!(
|
|
276
278
|
task.jobs[0],
|
|
277
|
-
|
|
278
|
-
variant: Some(
|
|
279
|
+
WorkflowActivationJob {
|
|
280
|
+
variant: Some(workflow_activation_job::Variant::RemoveFromCache(_)),
|
|
279
281
|
}
|
|
280
282
|
) {
|
|
281
283
|
let task = core.poll_workflow_activation(task_q).await.unwrap();
|
|
@@ -286,8 +288,8 @@ async fn repros_query_dropped_on_floor() {
|
|
|
286
288
|
|
|
287
289
|
if matches!(
|
|
288
290
|
task.jobs[0],
|
|
289
|
-
|
|
290
|
-
variant: Some(
|
|
291
|
+
WorkflowActivationJob {
|
|
292
|
+
variant: Some(workflow_activation_job::Variant::FireTimer(_)),
|
|
291
293
|
}
|
|
292
294
|
) {
|
|
293
295
|
// If we get the timer firing after replay, be done.
|
|
@@ -297,8 +299,8 @@ async fn repros_query_dropped_on_floor() {
|
|
|
297
299
|
// There should be a query job (really, there should be both... server only sends one?)
|
|
298
300
|
let query = assert_matches!(
|
|
299
301
|
task.jobs.as_slice(),
|
|
300
|
-
[
|
|
301
|
-
variant: Some(
|
|
302
|
+
[WorkflowActivationJob {
|
|
303
|
+
variant: Some(workflow_activation_job::Variant::QueryWorkflow(q)),
|
|
302
304
|
}] => q
|
|
303
305
|
);
|
|
304
306
|
let resp = if query.query_type == "query_1" {
|
|
@@ -309,7 +311,7 @@ async fn repros_query_dropped_on_floor() {
|
|
|
309
311
|
q2_resp
|
|
310
312
|
};
|
|
311
313
|
// Complete the query
|
|
312
|
-
core.complete_workflow_activation(
|
|
314
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
313
315
|
task_q,
|
|
314
316
|
task.run_id,
|
|
315
317
|
vec![QueryResult {
|
|
@@ -335,11 +337,11 @@ async fn repros_query_dropped_on_floor() {
|
|
|
335
337
|
|
|
336
338
|
#[tokio::test]
|
|
337
339
|
async fn fail_legacy_query() {
|
|
338
|
-
let workflow_id = "fail_legacy_query";
|
|
339
340
|
let query_err = "oh no broken";
|
|
340
|
-
let (core, task_q) = init_core_and_create_wf(
|
|
341
|
+
let (core, task_q) = init_core_and_create_wf("fail_legacy_query").await;
|
|
342
|
+
let workflow_id = task_q.clone();
|
|
341
343
|
let task = core.poll_workflow_activation(&task_q).await.unwrap();
|
|
342
|
-
core.complete_workflow_activation(
|
|
344
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
343
345
|
&task_q,
|
|
344
346
|
task.run_id.clone(),
|
|
345
347
|
vec![
|
|
@@ -359,18 +361,20 @@ async fn fail_legacy_query() {
|
|
|
359
361
|
.unwrap();
|
|
360
362
|
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
361
363
|
// Query after timer should have fired and there should be new WFT
|
|
362
|
-
let query_fut =
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
364
|
+
let query_fut = async {
|
|
365
|
+
core.server_gateway()
|
|
366
|
+
.query_workflow_execution(
|
|
367
|
+
workflow_id.to_string(),
|
|
368
|
+
task.run_id.to_string(),
|
|
369
|
+
WorkflowQuery {
|
|
370
|
+
query_type: "myquery".to_string(),
|
|
371
|
+
query_args: Some(b"hi".into()),
|
|
372
|
+
header: None,
|
|
373
|
+
},
|
|
374
|
+
)
|
|
375
|
+
.await
|
|
376
|
+
.unwrap_err()
|
|
377
|
+
};
|
|
374
378
|
let workflow_completions_future = async {
|
|
375
379
|
// Give query a beat to get going
|
|
376
380
|
tokio::time::sleep(Duration::from_millis(400)).await;
|
|
@@ -379,11 +383,11 @@ async fn fail_legacy_query() {
|
|
|
379
383
|
let task = core.poll_workflow_activation(&task_q).await.unwrap();
|
|
380
384
|
assert_matches!(
|
|
381
385
|
task.jobs.as_slice(),
|
|
382
|
-
[
|
|
383
|
-
variant: Some(
|
|
386
|
+
[WorkflowActivationJob {
|
|
387
|
+
variant: Some(workflow_activation_job::Variant::FireTimer(_)),
|
|
384
388
|
}]
|
|
385
389
|
);
|
|
386
|
-
core.complete_workflow_activation(
|
|
390
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
|
|
387
391
|
&task_q,
|
|
388
392
|
task.run_id,
|
|
389
393
|
vec![],
|
|
@@ -394,12 +398,12 @@ async fn fail_legacy_query() {
|
|
|
394
398
|
// Poll again, and we end up getting a `query` field query response
|
|
395
399
|
assert_matches!(
|
|
396
400
|
task.jobs.as_slice(),
|
|
397
|
-
[
|
|
398
|
-
variant: Some(
|
|
401
|
+
[WorkflowActivationJob {
|
|
402
|
+
variant: Some(workflow_activation_job::Variant::QueryWorkflow(q)),
|
|
399
403
|
}] => q
|
|
400
404
|
);
|
|
401
405
|
// Fail this task
|
|
402
|
-
core.complete_workflow_activation(
|
|
406
|
+
core.complete_workflow_activation(WorkflowActivationCompletion::fail(
|
|
403
407
|
&task_q,
|
|
404
408
|
task.run_id,
|
|
405
409
|
Failure {
|