@temporalio/core-bridge 1.13.0 → 1.13.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 +239 -382
- package/Cargo.toml +11 -11
- package/lib/native.d.ts +10 -3
- 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/.cargo/config.toml +71 -11
- package/sdk-core/.clippy.toml +1 -0
- package/sdk-core/.github/workflows/heavy.yml +2 -0
- package/sdk-core/.github/workflows/per-pr.yml +50 -18
- package/sdk-core/ARCHITECTURE.md +44 -48
- package/sdk-core/Cargo.toml +26 -7
- package/sdk-core/README.md +4 -0
- package/sdk-core/arch_docs/diagrams/TimerMachine_Coverage.puml +14 -0
- package/sdk-core/arch_docs/diagrams/initial_event_history.png +0 -0
- package/sdk-core/arch_docs/sdks_intro.md +299 -0
- package/sdk-core/client/Cargo.toml +8 -7
- package/sdk-core/client/src/callback_based.rs +1 -2
- package/sdk-core/client/src/lib.rs +485 -299
- package/sdk-core/client/src/metrics.rs +32 -8
- package/sdk-core/client/src/proxy.rs +124 -5
- package/sdk-core/client/src/raw.rs +598 -307
- package/sdk-core/client/src/replaceable.rs +253 -0
- package/sdk-core/client/src/retry.rs +9 -6
- package/sdk-core/client/src/worker_registry/mod.rs +19 -3
- package/sdk-core/client/src/workflow_handle/mod.rs +20 -17
- package/sdk-core/core/Cargo.toml +100 -31
- package/sdk-core/core/src/core_tests/activity_tasks.rs +55 -225
- package/sdk-core/core/src/core_tests/mod.rs +2 -8
- package/sdk-core/core/src/core_tests/queries.rs +3 -5
- package/sdk-core/core/src/core_tests/replay_flag.rs +3 -62
- package/sdk-core/core/src/core_tests/updates.rs +4 -5
- package/sdk-core/core/src/core_tests/workers.rs +4 -3
- package/sdk-core/core/src/core_tests/workflow_cancels.rs +10 -7
- package/sdk-core/core/src/core_tests/workflow_tasks.rs +28 -291
- package/sdk-core/core/src/ephemeral_server/mod.rs +15 -3
- package/sdk-core/core/src/internal_flags.rs +11 -1
- package/sdk-core/core/src/lib.rs +50 -36
- package/sdk-core/core/src/pollers/mod.rs +5 -5
- package/sdk-core/core/src/pollers/poll_buffer.rs +2 -2
- package/sdk-core/core/src/protosext/mod.rs +13 -5
- package/sdk-core/core/src/protosext/protocol_messages.rs +4 -11
- package/sdk-core/core/src/retry_logic.rs +256 -108
- package/sdk-core/core/src/telemetry/metrics.rs +1 -0
- package/sdk-core/core/src/telemetry/mod.rs +8 -2
- package/sdk-core/core/src/telemetry/prometheus_meter.rs +2 -2
- package/sdk-core/core/src/test_help/integ_helpers.rs +971 -0
- package/sdk-core/core/src/test_help/mod.rs +10 -1100
- package/sdk-core/core/src/test_help/unit_helpers.rs +218 -0
- package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +42 -6
- package/sdk-core/core/src/worker/activities/local_activities.rs +19 -19
- package/sdk-core/core/src/worker/activities.rs +10 -3
- package/sdk-core/core/src/worker/client/mocks.rs +3 -3
- package/sdk-core/core/src/worker/client.rs +130 -93
- package/sdk-core/core/src/worker/heartbeat.rs +12 -13
- package/sdk-core/core/src/worker/mod.rs +31 -21
- package/sdk-core/core/src/worker/nexus.rs +14 -3
- package/sdk-core/core/src/worker/slot_provider.rs +9 -0
- package/sdk-core/core/src/worker/tuner.rs +159 -0
- package/sdk-core/core/src/worker/workflow/history_update.rs +3 -265
- package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -54
- package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -82
- package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -67
- package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -192
- package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -43
- package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +6 -554
- package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -71
- package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +102 -3
- package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +10 -539
- package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -139
- package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -119
- package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +6 -63
- package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +9 -4
- package/sdk-core/core/src/worker/workflow/mod.rs +5 -1
- package/sdk-core/core/src/worker/workflow/workflow_stream.rs +8 -3
- package/sdk-core/core-api/Cargo.toml +4 -4
- package/sdk-core/core-api/src/envconfig.rs +153 -54
- package/sdk-core/core-api/src/lib.rs +68 -0
- package/sdk-core/core-api/src/telemetry/metrics.rs +2 -1
- package/sdk-core/core-api/src/telemetry.rs +13 -0
- package/sdk-core/core-c-bridge/Cargo.toml +13 -8
- package/sdk-core/core-c-bridge/include/temporal-sdk-core-c-bridge.h +184 -22
- package/sdk-core/core-c-bridge/src/client.rs +462 -184
- package/sdk-core/core-c-bridge/src/envconfig.rs +314 -0
- package/sdk-core/core-c-bridge/src/lib.rs +1 -0
- package/sdk-core/core-c-bridge/src/random.rs +4 -4
- package/sdk-core/core-c-bridge/src/runtime.rs +22 -23
- package/sdk-core/core-c-bridge/src/testing.rs +1 -4
- package/sdk-core/core-c-bridge/src/tests/context.rs +31 -31
- package/sdk-core/core-c-bridge/src/tests/mod.rs +32 -28
- package/sdk-core/core-c-bridge/src/tests/utils.rs +7 -7
- package/sdk-core/core-c-bridge/src/worker.rs +319 -66
- package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +6 -1
- package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +5 -5
- package/sdk-core/sdk/Cargo.toml +8 -2
- package/sdk-core/sdk/src/activity_context.rs +1 -1
- package/sdk-core/sdk/src/app_data.rs +1 -1
- package/sdk-core/sdk/src/interceptors.rs +1 -4
- package/sdk-core/sdk/src/lib.rs +1 -5
- package/sdk-core/sdk/src/workflow_context/options.rs +10 -1
- package/sdk-core/sdk/src/workflow_future.rs +1 -1
- package/sdk-core/sdk-core-protos/Cargo.toml +6 -6
- package/sdk-core/sdk-core-protos/build.rs +10 -23
- package/sdk-core/sdk-core-protos/protos/api_upstream/.github/workflows/create-release.yml +9 -1
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +254 -5
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +234 -5
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +1 -1
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +6 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +30 -6
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
- package/sdk-core/{test-utils → sdk-core-protos}/src/canned_histories.rs +5 -5
- package/sdk-core/sdk-core-protos/src/history_builder.rs +2 -2
- package/sdk-core/sdk-core-protos/src/lib.rs +25 -9
- package/sdk-core/sdk-core-protos/src/test_utils.rs +89 -0
- package/sdk-core/sdk-core-protos/src/utilities.rs +14 -5
- package/sdk-core/tests/c_bridge_smoke_test.c +10 -0
- package/sdk-core/tests/cloud_tests.rs +10 -8
- package/sdk-core/tests/common/http_proxy.rs +134 -0
- package/sdk-core/{test-utils/src/lib.rs → tests/common/mod.rs} +214 -281
- package/sdk-core/{test-utils/src → tests/common}/workflows.rs +4 -3
- package/sdk-core/tests/fuzzy_workflow.rs +1 -1
- package/sdk-core/tests/global_metric_tests.rs +8 -7
- package/sdk-core/tests/heavy_tests.rs +7 -3
- package/sdk-core/tests/integ_tests/client_tests.rs +111 -24
- package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +14 -9
- package/sdk-core/tests/integ_tests/heartbeat_tests.rs +4 -4
- package/sdk-core/tests/integ_tests/metrics_tests.rs +114 -14
- package/sdk-core/tests/integ_tests/pagination_tests.rs +273 -0
- package/sdk-core/tests/integ_tests/polling_tests.rs +311 -93
- package/sdk-core/tests/integ_tests/queries_tests.rs +4 -4
- package/sdk-core/tests/integ_tests/update_tests.rs +13 -7
- package/sdk-core/tests/integ_tests/visibility_tests.rs +26 -9
- package/sdk-core/tests/integ_tests/worker_tests.rs +668 -13
- package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +40 -24
- package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +244 -11
- package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +78 -2
- package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +61 -2
- package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +465 -7
- package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +41 -2
- package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +315 -3
- package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +1 -1
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1990 -14
- package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +65 -2
- package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +123 -23
- package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +525 -3
- package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +65 -16
- package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +32 -23
- package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +126 -5
- package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +1 -2
- package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +124 -8
- package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +62 -2
- package/sdk-core/tests/integ_tests/workflow_tests.rs +67 -8
- package/sdk-core/tests/main.rs +26 -17
- package/sdk-core/tests/manual_tests.rs +5 -1
- package/sdk-core/tests/runner.rs +22 -40
- package/sdk-core/tests/shared_tests/mod.rs +1 -1
- package/sdk-core/tests/shared_tests/priority.rs +1 -1
- package/sdk-core/{core/benches/workflow_replay.rs → tests/workflow_replay_bench.rs} +10 -5
- package/src/client.rs +97 -20
- package/src/helpers/callbacks.rs +4 -4
- package/src/helpers/errors.rs +7 -1
- package/src/helpers/handles.rs +1 -0
- package/src/helpers/try_from_js.rs +4 -3
- package/src/lib.rs +3 -2
- package/src/metrics.rs +3 -0
- package/src/runtime.rs +5 -2
- package/src/worker.rs +9 -12
- package/ts/native.ts +13 -3
- package/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
- package/sdk-core/core/src/core_tests/child_workflows.rs +0 -281
- package/sdk-core/core/src/core_tests/determinism.rs +0 -318
- package/sdk-core/core/src/core_tests/local_activities.rs +0 -1442
- package/sdk-core/test-utils/Cargo.toml +0 -38
- package/sdk-core/test-utils/src/histfetch.rs +0 -28
- package/sdk-core/test-utils/src/interceptors.rs +0 -46
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
ActivityHeartbeat, Worker, advance_fut, job_assert, prost_dur,
|
|
3
3
|
test_help::{
|
|
4
|
-
MockPollCfg, MockWorkerInputs, MocksHolder, QueueResponse,
|
|
5
|
-
WorkflowCachingPolicy, build_fake_worker, build_mock_pollers,
|
|
6
|
-
gen_assert_and_reply, mock_manual_poller, mock_poller,
|
|
7
|
-
|
|
4
|
+
MockPollCfg, MockWorkerInputs, MocksHolder, QueueResponse, TEST_Q, WorkerExt,
|
|
5
|
+
WorkflowCachingPolicy, build_fake_worker, build_mock_pollers, fanout_tasks,
|
|
6
|
+
gen_assert_and_reply, mock_manual_poller, mock_poller, mock_worker, poll_and_reply,
|
|
7
|
+
single_hist_mock_sg, test_worker_cfg,
|
|
8
8
|
},
|
|
9
9
|
worker::client::mocks::{mock_manual_worker_client, mock_worker_client},
|
|
10
10
|
};
|
|
@@ -19,17 +19,13 @@ use std::{
|
|
|
19
19
|
Arc,
|
|
20
20
|
atomic::{AtomicBool, AtomicUsize, Ordering},
|
|
21
21
|
},
|
|
22
|
-
time::Duration,
|
|
22
|
+
time::{Duration, Instant},
|
|
23
23
|
};
|
|
24
|
-
use temporal_client::WorkflowOptions;
|
|
25
|
-
use temporal_sdk::{ActivityOptions, WfContext};
|
|
26
24
|
use temporal_sdk_core_api::{
|
|
27
|
-
Worker as WorkerTrait,
|
|
28
|
-
errors::{CompleteActivityError, PollError},
|
|
29
|
-
worker::PollerBehavior,
|
|
25
|
+
Worker as WorkerTrait, errors::CompleteActivityError, worker::PollerBehavior,
|
|
30
26
|
};
|
|
31
27
|
use temporal_sdk_core_protos::{
|
|
32
|
-
|
|
28
|
+
TestHistoryBuilder, canned_histories,
|
|
33
29
|
coresdk::{
|
|
34
30
|
ActivityTaskCompletion,
|
|
35
31
|
activity_result::{
|
|
@@ -46,20 +42,16 @@ use temporal_sdk_core_protos::{
|
|
|
46
42
|
},
|
|
47
43
|
temporal::api::{
|
|
48
44
|
command::v1::{ScheduleActivityTaskCommandAttributes, command::Attributes},
|
|
49
|
-
enums::v1::
|
|
50
|
-
history::v1::{
|
|
51
|
-
ActivityTaskScheduledEventAttributes, history_event::Attributes as EventAttributes,
|
|
52
|
-
},
|
|
53
|
-
sdk::v1::UserMetadata,
|
|
45
|
+
enums::v1::EventType,
|
|
54
46
|
workflowservice::v1::{
|
|
55
47
|
PollActivityTaskQueueResponse, RecordActivityTaskHeartbeatResponse,
|
|
56
48
|
RespondActivityTaskCanceledResponse, RespondActivityTaskCompletedResponse,
|
|
57
49
|
RespondActivityTaskFailedResponse, RespondWorkflowTaskCompletedResponse,
|
|
58
50
|
},
|
|
59
51
|
},
|
|
52
|
+
test_utils::start_timer_cmd,
|
|
60
53
|
};
|
|
61
|
-
use
|
|
62
|
-
use tokio::{join, sync::Barrier, time::sleep};
|
|
54
|
+
use tokio::{join, time::sleep};
|
|
63
55
|
use tokio_util::sync::CancellationToken;
|
|
64
56
|
|
|
65
57
|
fn three_tasks() -> VecDeque<PollActivityTaskQueueResponse> {
|
|
@@ -642,6 +634,47 @@ async fn max_tq_acts_set_passed_to_poll_properly() {
|
|
|
642
634
|
worker.poll_activity_task().await.unwrap();
|
|
643
635
|
}
|
|
644
636
|
|
|
637
|
+
#[tokio::test]
|
|
638
|
+
async fn max_worker_acts_per_second_respected() {
|
|
639
|
+
let mut mock_client = mock_worker_client();
|
|
640
|
+
mock_client
|
|
641
|
+
.expect_poll_activity_task()
|
|
642
|
+
.returning(move |_, _| {
|
|
643
|
+
Ok(PollActivityTaskQueueResponse {
|
|
644
|
+
task_token: vec![1],
|
|
645
|
+
activity_id: "some-id".to_string(),
|
|
646
|
+
..Default::default()
|
|
647
|
+
})
|
|
648
|
+
});
|
|
649
|
+
mock_client
|
|
650
|
+
.expect_complete_activity_task()
|
|
651
|
+
.returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
|
|
652
|
+
|
|
653
|
+
let cfg = test_worker_cfg()
|
|
654
|
+
.activity_task_poller_behavior(PollerBehavior::SimpleMaximum(1_usize))
|
|
655
|
+
.max_outstanding_activities(10_usize)
|
|
656
|
+
.max_worker_activities_per_second(1.0)
|
|
657
|
+
.build()
|
|
658
|
+
.unwrap();
|
|
659
|
+
let worker = Worker::new_test(cfg, mock_client);
|
|
660
|
+
let start = Instant::now();
|
|
661
|
+
let mut received = 0;
|
|
662
|
+
while start.elapsed().as_millis() < 900 {
|
|
663
|
+
let at = worker.poll_activity_task().await.unwrap();
|
|
664
|
+
received += 1;
|
|
665
|
+
worker
|
|
666
|
+
.complete_activity_task(ActivityTaskCompletion {
|
|
667
|
+
task_token: at.task_token,
|
|
668
|
+
result: Some(ActivityExecutionResult::ok("hi".into())),
|
|
669
|
+
})
|
|
670
|
+
.await
|
|
671
|
+
.unwrap();
|
|
672
|
+
}
|
|
673
|
+
// Two will be allowed because of the initial request. Without ratelimit in effect, this number
|
|
674
|
+
// would be comically high due to the mocks responding very fast.
|
|
675
|
+
assert_eq!(received, 2);
|
|
676
|
+
}
|
|
677
|
+
|
|
645
678
|
#[rstest::rstest]
|
|
646
679
|
#[tokio::test]
|
|
647
680
|
async fn no_eager_activities_requested_when_worker_options_disable_it(
|
|
@@ -781,9 +814,11 @@ async fn activity_tasks_from_completion_are_delivered() {
|
|
|
781
814
|
mock.expect_complete_activity_task()
|
|
782
815
|
.times(3)
|
|
783
816
|
.returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
|
|
784
|
-
let mut mock = single_hist_mock_sg(wfid, t, [1], mock, true);
|
|
785
817
|
let act_tasks: Vec<QueueResponse<PollActivityTaskQueueResponse>> = vec![];
|
|
786
|
-
mock
|
|
818
|
+
let mut mh = MockPollCfg::from_resp_batches(wfid, t, [1], mock);
|
|
819
|
+
mh.enforce_correct_number_of_polls = true;
|
|
820
|
+
mh.activity_responses = Some(act_tasks);
|
|
821
|
+
let mut mock = build_mock_pollers(mh);
|
|
787
822
|
mock.worker_cfg(|wc| wc.max_cached_workflows = 2);
|
|
788
823
|
let core = mock_worker(mock);
|
|
789
824
|
|
|
@@ -848,160 +883,6 @@ async fn activity_tasks_from_completion_are_delivered() {
|
|
|
848
883
|
assert_eq!(num_eager_requested.load(Ordering::Relaxed), 3);
|
|
849
884
|
}
|
|
850
885
|
|
|
851
|
-
#[tokio::test]
|
|
852
|
-
async fn activity_tasks_from_completion_reserve_slots() {
|
|
853
|
-
let wf_id = "fake_wf_id";
|
|
854
|
-
let mut t = TestHistoryBuilder::default();
|
|
855
|
-
t.add_by_type(EventType::WorkflowExecutionStarted);
|
|
856
|
-
t.add_full_wf_task();
|
|
857
|
-
let schedid = t.add(EventAttributes::ActivityTaskScheduledEventAttributes(
|
|
858
|
-
ActivityTaskScheduledEventAttributes {
|
|
859
|
-
activity_id: "1".to_string(),
|
|
860
|
-
activity_type: Some("act1".into()),
|
|
861
|
-
..Default::default()
|
|
862
|
-
},
|
|
863
|
-
));
|
|
864
|
-
let startid = t.add_activity_task_started(schedid);
|
|
865
|
-
t.add_activity_task_completed(schedid, startid, b"hi".into());
|
|
866
|
-
t.add_full_wf_task();
|
|
867
|
-
let schedid = t.add(EventAttributes::ActivityTaskScheduledEventAttributes(
|
|
868
|
-
ActivityTaskScheduledEventAttributes {
|
|
869
|
-
activity_id: "2".to_string(),
|
|
870
|
-
activity_type: Some("act2".into()),
|
|
871
|
-
..Default::default()
|
|
872
|
-
},
|
|
873
|
-
));
|
|
874
|
-
let startid = t.add_activity_task_started(schedid);
|
|
875
|
-
t.add_activity_task_completed(schedid, startid, b"hi".into());
|
|
876
|
-
t.add_full_wf_task();
|
|
877
|
-
t.add_workflow_execution_completed();
|
|
878
|
-
|
|
879
|
-
let mut mock = mock_worker_client();
|
|
880
|
-
// Set up two tasks to be returned via normal activity polling
|
|
881
|
-
let act_tasks = VecDeque::from(vec![
|
|
882
|
-
PollActivityTaskQueueResponse {
|
|
883
|
-
task_token: vec![1],
|
|
884
|
-
activity_id: "act1".to_string(),
|
|
885
|
-
..Default::default()
|
|
886
|
-
}
|
|
887
|
-
.into(),
|
|
888
|
-
PollActivityTaskQueueResponse {
|
|
889
|
-
task_token: vec![2],
|
|
890
|
-
activity_id: "act2".to_string(),
|
|
891
|
-
..Default::default()
|
|
892
|
-
}
|
|
893
|
-
.into(),
|
|
894
|
-
]);
|
|
895
|
-
mock.expect_complete_activity_task()
|
|
896
|
-
.times(2)
|
|
897
|
-
.returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
|
|
898
|
-
let barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
|
|
899
|
-
let mut mh = MockPollCfg::from_resp_batches(
|
|
900
|
-
wf_id,
|
|
901
|
-
t,
|
|
902
|
-
[
|
|
903
|
-
ResponseType::ToTaskNum(1),
|
|
904
|
-
// We don't want the second task to be delivered until *after* the activity tasks
|
|
905
|
-
// have been completed, so that the second activity schedule will have slots available
|
|
906
|
-
ResponseType::UntilResolved(
|
|
907
|
-
async {
|
|
908
|
-
barr.wait().await;
|
|
909
|
-
barr.wait().await;
|
|
910
|
-
}
|
|
911
|
-
.boxed(),
|
|
912
|
-
2,
|
|
913
|
-
),
|
|
914
|
-
ResponseType::AllHistory,
|
|
915
|
-
],
|
|
916
|
-
mock,
|
|
917
|
-
);
|
|
918
|
-
mh.completion_mock_fn = Some(Box::new(|wftc| {
|
|
919
|
-
// Make sure when we see the completion with the schedule act command that it does
|
|
920
|
-
// not have the eager execution flag set the first time, and does the second.
|
|
921
|
-
if let Some(Attributes::ScheduleActivityTaskCommandAttributes(attrs)) = wftc
|
|
922
|
-
.commands
|
|
923
|
-
.first()
|
|
924
|
-
.and_then(|cmd| cmd.attributes.as_ref())
|
|
925
|
-
{
|
|
926
|
-
if attrs.activity_id == "1" {
|
|
927
|
-
assert!(!attrs.request_eager_execution);
|
|
928
|
-
} else {
|
|
929
|
-
assert!(attrs.request_eager_execution);
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
Ok(Default::default())
|
|
933
|
-
}));
|
|
934
|
-
let mut mock = build_mock_pollers(mh);
|
|
935
|
-
mock.worker_cfg(|cfg| {
|
|
936
|
-
cfg.max_cached_workflows = 2;
|
|
937
|
-
cfg.max_outstanding_activities = Some(2);
|
|
938
|
-
});
|
|
939
|
-
mock.set_act_poller(mock_poller_from_resps(act_tasks));
|
|
940
|
-
let core = Arc::new(mock_worker(mock));
|
|
941
|
-
let mut worker = TestWorker::new(core.clone(), TEST_Q.to_string());
|
|
942
|
-
|
|
943
|
-
// First poll for activities twice, occupying both slots
|
|
944
|
-
let at1 = core.poll_activity_task().await.unwrap();
|
|
945
|
-
let at2 = core.poll_activity_task().await.unwrap();
|
|
946
|
-
let workflow_complete_token = CancellationToken::new();
|
|
947
|
-
let workflow_complete_token_clone = workflow_complete_token.clone();
|
|
948
|
-
|
|
949
|
-
worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| {
|
|
950
|
-
let complete_token = workflow_complete_token.clone();
|
|
951
|
-
async move {
|
|
952
|
-
ctx.activity(ActivityOptions {
|
|
953
|
-
activity_type: "act1".to_string(),
|
|
954
|
-
..Default::default()
|
|
955
|
-
})
|
|
956
|
-
.await;
|
|
957
|
-
ctx.activity(ActivityOptions {
|
|
958
|
-
activity_type: "act2".to_string(),
|
|
959
|
-
..Default::default()
|
|
960
|
-
})
|
|
961
|
-
.await;
|
|
962
|
-
complete_token.cancel();
|
|
963
|
-
Ok(().into())
|
|
964
|
-
}
|
|
965
|
-
});
|
|
966
|
-
|
|
967
|
-
worker
|
|
968
|
-
.submit_wf(
|
|
969
|
-
wf_id.to_owned(),
|
|
970
|
-
DEFAULT_WORKFLOW_TYPE,
|
|
971
|
-
vec![],
|
|
972
|
-
WorkflowOptions::default(),
|
|
973
|
-
)
|
|
974
|
-
.await
|
|
975
|
-
.unwrap();
|
|
976
|
-
let act_completer = async {
|
|
977
|
-
barr.wait().await;
|
|
978
|
-
core.complete_activity_task(ActivityTaskCompletion {
|
|
979
|
-
task_token: at1.task_token,
|
|
980
|
-
result: Some(ActivityExecutionResult::ok("hi".into())),
|
|
981
|
-
})
|
|
982
|
-
.await
|
|
983
|
-
.unwrap();
|
|
984
|
-
core.complete_activity_task(ActivityTaskCompletion {
|
|
985
|
-
task_token: at2.task_token,
|
|
986
|
-
result: Some(ActivityExecutionResult::ok("hi".into())),
|
|
987
|
-
})
|
|
988
|
-
.await
|
|
989
|
-
.unwrap();
|
|
990
|
-
barr.wait().await;
|
|
991
|
-
// Wait for workflow to complete in order for all eager activities to be requested before shutting down.
|
|
992
|
-
// After shutdown, no eager activities slots can be allocated.
|
|
993
|
-
workflow_complete_token_clone.cancelled().await;
|
|
994
|
-
core.initiate_shutdown();
|
|
995
|
-
// Even though this test requests eager activity tasks, none are returned in poll responses.
|
|
996
|
-
let err = core.poll_activity_task().await.unwrap_err();
|
|
997
|
-
assert_matches!(err, PollError::ShutDown);
|
|
998
|
-
};
|
|
999
|
-
// This wf poll should *not* set the flag that it wants tasks back since both slots are
|
|
1000
|
-
// occupied
|
|
1001
|
-
let run_fut = async { worker.run_until_done().await.unwrap() };
|
|
1002
|
-
join!(run_fut, act_completer);
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
886
|
#[tokio::test]
|
|
1006
887
|
async fn retryable_net_error_exhaustion_is_nonfatal() {
|
|
1007
888
|
let mut mock_client = mock_worker_client();
|
|
@@ -1198,57 +1079,6 @@ async fn activities_must_be_flushed_to_server_on_shutdown(#[values(true, false)]
|
|
|
1198
1079
|
join!(shutdown_task, complete_task);
|
|
1199
1080
|
}
|
|
1200
1081
|
|
|
1201
|
-
#[tokio::test]
|
|
1202
|
-
async fn pass_activity_summary_to_metadata() {
|
|
1203
|
-
let t = canned_histories::single_activity("1");
|
|
1204
|
-
let mut mock_cfg = MockPollCfg::from_hist_builder(t);
|
|
1205
|
-
let wf_id = mock_cfg.hists[0].wf_id.clone();
|
|
1206
|
-
let wf_type = DEFAULT_WORKFLOW_TYPE;
|
|
1207
|
-
let expected_user_metadata = Some(UserMetadata {
|
|
1208
|
-
summary: Some(b"activity summary".into()),
|
|
1209
|
-
details: None,
|
|
1210
|
-
});
|
|
1211
|
-
mock_cfg.completion_asserts_from_expectations(|mut asserts| {
|
|
1212
|
-
asserts
|
|
1213
|
-
.then(move |wft| {
|
|
1214
|
-
assert_eq!(wft.commands.len(), 1);
|
|
1215
|
-
assert_eq!(
|
|
1216
|
-
wft.commands[0].command_type(),
|
|
1217
|
-
CommandType::ScheduleActivityTask
|
|
1218
|
-
);
|
|
1219
|
-
assert_eq!(wft.commands[0].user_metadata, expected_user_metadata)
|
|
1220
|
-
})
|
|
1221
|
-
.then(move |wft| {
|
|
1222
|
-
assert_eq!(wft.commands.len(), 1);
|
|
1223
|
-
assert_eq!(
|
|
1224
|
-
wft.commands[0].command_type(),
|
|
1225
|
-
CommandType::CompleteWorkflowExecution
|
|
1226
|
-
);
|
|
1227
|
-
});
|
|
1228
|
-
});
|
|
1229
|
-
|
|
1230
|
-
let mut worker = mock_sdk_cfg(mock_cfg, |_| {});
|
|
1231
|
-
worker.register_wf(wf_type, |ctx: WfContext| async move {
|
|
1232
|
-
ctx.activity(ActivityOptions {
|
|
1233
|
-
activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
|
|
1234
|
-
summary: Some("activity summary".to_string()),
|
|
1235
|
-
..Default::default()
|
|
1236
|
-
})
|
|
1237
|
-
.await;
|
|
1238
|
-
Ok(().into())
|
|
1239
|
-
});
|
|
1240
|
-
worker
|
|
1241
|
-
.submit_wf(
|
|
1242
|
-
wf_id.to_owned(),
|
|
1243
|
-
wf_type.to_owned(),
|
|
1244
|
-
vec![],
|
|
1245
|
-
WorkflowOptions::default(),
|
|
1246
|
-
)
|
|
1247
|
-
.await
|
|
1248
|
-
.unwrap();
|
|
1249
|
-
worker.run_until_done().await.unwrap();
|
|
1250
|
-
}
|
|
1251
|
-
|
|
1252
1082
|
#[tokio::test]
|
|
1253
1083
|
async fn heartbeat_response_can_be_paused() {
|
|
1254
1084
|
let mut mock_client = mock_worker_client();
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
mod activity_tasks;
|
|
2
|
-
mod child_workflows;
|
|
3
|
-
mod determinism;
|
|
4
|
-
mod local_activities;
|
|
5
2
|
mod queries;
|
|
6
3
|
mod replay_flag;
|
|
7
4
|
mod updates;
|
|
@@ -13,8 +10,7 @@ use crate::{
|
|
|
13
10
|
Worker,
|
|
14
11
|
errors::PollError,
|
|
15
12
|
test_help::{
|
|
16
|
-
MockPollCfg, build_mock_pollers,
|
|
17
|
-
test_worker_cfg,
|
|
13
|
+
MockPollCfg, build_mock_pollers, mock_worker, single_hist_mock_sg, test_worker_cfg,
|
|
18
14
|
},
|
|
19
15
|
worker::client::mocks::{mock_manual_worker_client, mock_worker_client},
|
|
20
16
|
};
|
|
@@ -22,7 +18,7 @@ use futures_util::FutureExt;
|
|
|
22
18
|
use std::{sync::LazyLock, time::Duration};
|
|
23
19
|
use temporal_sdk_core_api::{Worker as WorkerTrait, worker::PollerBehavior};
|
|
24
20
|
use temporal_sdk_core_protos::{
|
|
25
|
-
TestHistoryBuilder,
|
|
21
|
+
TestHistoryBuilder, canned_histories,
|
|
26
22
|
coresdk::{
|
|
27
23
|
workflow_activation::{WorkflowActivationJob, workflow_activation_job},
|
|
28
24
|
workflow_completion::WorkflowActivationCompletion,
|
|
@@ -113,8 +109,6 @@ async fn shutdown_interrupts_both_polls() {
|
|
|
113
109
|
|
|
114
110
|
#[tokio::test]
|
|
115
111
|
async fn ignores_workflow_options_updated_event() {
|
|
116
|
-
temporal_sdk_core_test_utils::init_integ_telem();
|
|
117
|
-
|
|
118
112
|
let mut t = TestHistoryBuilder::default();
|
|
119
113
|
t.add_by_type(EventType::WorkflowExecutionStarted);
|
|
120
114
|
t.add(WorkflowExecutionOptionsUpdatedEventAttributes::default());
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
test_help::{
|
|
3
|
-
MockPollCfg, MocksHolder, ResponseType, WorkerExt,
|
|
3
|
+
MockPollCfg, MocksHolder, ResponseType, WorkerExt, WorkerTestHelpers, build_mock_pollers,
|
|
4
4
|
hist_to_poll_resp, mock_worker, single_hist_mock_sg,
|
|
5
5
|
},
|
|
6
6
|
worker::{
|
|
@@ -15,7 +15,7 @@ use std::{
|
|
|
15
15
|
};
|
|
16
16
|
use temporal_sdk_core_api::{Worker as WorkerTrait, worker::WorkerVersioningStrategy};
|
|
17
17
|
use temporal_sdk_core_protos::{
|
|
18
|
-
TestHistoryBuilder,
|
|
18
|
+
TestHistoryBuilder, canned_histories,
|
|
19
19
|
coresdk::{
|
|
20
20
|
workflow_activation::{
|
|
21
21
|
WorkflowActivationJob, remove_from_cache::EvictionReason, workflow_activation_job,
|
|
@@ -36,9 +36,7 @@ use temporal_sdk_core_protos::{
|
|
|
36
36
|
GetWorkflowExecutionHistoryResponse, RespondWorkflowTaskCompletedResponse,
|
|
37
37
|
},
|
|
38
38
|
},
|
|
39
|
-
}
|
|
40
|
-
use temporal_sdk_core_test_utils::{
|
|
41
|
-
WorkerTestHelpers, query_ok, schedule_activity_cmd, start_timer_cmd,
|
|
39
|
+
test_utils::{query_ok, schedule_activity_cmd, start_timer_cmd},
|
|
42
40
|
};
|
|
43
41
|
|
|
44
42
|
#[rstest::rstest]
|
|
@@ -1,77 +1,18 @@
|
|
|
1
1
|
use crate::{
|
|
2
|
-
test_help::{
|
|
3
|
-
MockPollCfg, ResponseType, build_fake_sdk, build_mock_pollers, canned_histories,
|
|
4
|
-
hist_to_poll_resp, mock_worker,
|
|
5
|
-
},
|
|
2
|
+
test_help::{MockPollCfg, ResponseType, build_mock_pollers, hist_to_poll_resp, mock_worker},
|
|
6
3
|
worker::{LEGACY_QUERY_ID, client::mocks::mock_worker_client},
|
|
7
4
|
};
|
|
8
|
-
use rstest::{fixture, rstest};
|
|
9
5
|
use std::{collections::VecDeque, time::Duration};
|
|
10
|
-
use temporal_sdk::{WfContext, Worker, WorkflowFunction};
|
|
11
6
|
use temporal_sdk_core_api::Worker as CoreWorker;
|
|
12
7
|
use temporal_sdk_core_protos::{
|
|
13
|
-
|
|
8
|
+
TestHistoryBuilder, canned_histories,
|
|
14
9
|
coresdk::{
|
|
15
10
|
workflow_activation::{WorkflowActivationJob, workflow_activation_job},
|
|
16
11
|
workflow_completion::WorkflowActivationCompletion,
|
|
17
12
|
},
|
|
18
13
|
temporal::api::{enums::v1::EventType, query::v1::WorkflowQuery},
|
|
14
|
+
test_utils::{query_ok, start_timer_cmd},
|
|
19
15
|
};
|
|
20
|
-
use temporal_sdk_core_test_utils::{
|
|
21
|
-
interceptors::ActivationAssertionsInterceptor, query_ok, start_timer_cmd,
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
fn timers_wf(num_timers: u32) -> WorkflowFunction {
|
|
25
|
-
WorkflowFunction::new(move |command_sink: WfContext| async move {
|
|
26
|
-
for _ in 1..=num_timers {
|
|
27
|
-
command_sink.timer(Duration::from_secs(1)).await;
|
|
28
|
-
}
|
|
29
|
-
Ok(().into())
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
#[fixture(num_timers = 1)]
|
|
34
|
-
fn fire_happy_hist(num_timers: u32) -> Worker {
|
|
35
|
-
let func = timers_wf(num_timers);
|
|
36
|
-
// Add 1 b/c history takes # wf tasks, not timers
|
|
37
|
-
let t = canned_histories::long_sequential_timers(num_timers as usize);
|
|
38
|
-
let mut worker = build_fake_sdk(MockPollCfg::from_resps(t, [ResponseType::AllHistory]));
|
|
39
|
-
worker.register_wf(DEFAULT_WORKFLOW_TYPE, func);
|
|
40
|
-
worker
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
#[rstest]
|
|
44
|
-
#[case::one_timer(fire_happy_hist(1), 1)]
|
|
45
|
-
#[case::five_timers(fire_happy_hist(5), 5)]
|
|
46
|
-
#[tokio::test]
|
|
47
|
-
async fn replay_flag_is_correct(#[case] mut worker: Worker, #[case] num_timers: usize) {
|
|
48
|
-
// Verify replay flag is correct by constructing a workflow manager that already has a complete
|
|
49
|
-
// history fed into it. It should always be replaying, because history is complete.
|
|
50
|
-
|
|
51
|
-
let mut aai = ActivationAssertionsInterceptor::default();
|
|
52
|
-
|
|
53
|
-
for _ in 1..=num_timers + 1 {
|
|
54
|
-
aai.then(|a| assert!(a.is_replaying));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
worker.set_worker_interceptor(aai);
|
|
58
|
-
worker.run().await.unwrap();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
#[tokio::test(flavor = "multi_thread")]
|
|
62
|
-
async fn replay_flag_is_correct_partial_history() {
|
|
63
|
-
let func = timers_wf(1);
|
|
64
|
-
// Add 1 b/c history takes # wf tasks, not timers
|
|
65
|
-
let t = canned_histories::long_sequential_timers(2);
|
|
66
|
-
let mut worker = build_fake_sdk(MockPollCfg::from_resps(t, [1]));
|
|
67
|
-
worker.register_wf(DEFAULT_WORKFLOW_TYPE, func);
|
|
68
|
-
|
|
69
|
-
let mut aai = ActivationAssertionsInterceptor::default();
|
|
70
|
-
aai.then(|a| assert!(!a.is_replaying));
|
|
71
|
-
|
|
72
|
-
worker.set_worker_interceptor(aai);
|
|
73
|
-
worker.run().await.unwrap();
|
|
74
|
-
}
|
|
75
16
|
|
|
76
17
|
#[tokio::test]
|
|
77
18
|
async fn replay_flag_correct_with_query() {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
prost_dur,
|
|
3
3
|
test_help::{
|
|
4
|
-
MockPollCfg, PollWFTRespExt, ResponseType,
|
|
5
|
-
mock_worker,
|
|
4
|
+
MockPollCfg, PollWFTRespExt, ResponseType, WorkerTestHelpers, build_mock_pollers,
|
|
5
|
+
hist_to_poll_resp, mock_worker,
|
|
6
6
|
},
|
|
7
7
|
worker::client::mocks::mock_worker_client,
|
|
8
8
|
};
|
|
@@ -24,7 +24,6 @@ use temporal_sdk_core_protos::{
|
|
|
24
24
|
workflowservice::v1::RespondWorkflowTaskCompletedResponse,
|
|
25
25
|
},
|
|
26
26
|
};
|
|
27
|
-
use temporal_sdk_core_test_utils::WorkerTestHelpers;
|
|
28
27
|
|
|
29
28
|
#[tokio::test]
|
|
30
29
|
async fn replay_with_empty_first_task() {
|
|
@@ -115,10 +114,10 @@ async fn initial_request_sent_back(#[values(false, true)] reject: bool) {
|
|
|
115
114
|
.returning(move |mut resp| {
|
|
116
115
|
let msg = resp.messages.pop().unwrap();
|
|
117
116
|
let orig_req = if reject {
|
|
118
|
-
let acceptance = msg.body.unwrap().
|
|
117
|
+
let acceptance = msg.body.unwrap().to_msg::<Rejection>().unwrap();
|
|
119
118
|
acceptance.rejected_request.unwrap()
|
|
120
119
|
} else {
|
|
121
|
-
let acceptance = msg.body.unwrap().
|
|
120
|
+
let acceptance = msg.body.unwrap().to_msg::<Acceptance>().unwrap();
|
|
122
121
|
acceptance.accepted_request.unwrap()
|
|
123
122
|
};
|
|
124
123
|
assert_eq!(orig_req, upd_req_body);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
PollError, prost_dur,
|
|
3
3
|
test_help::{
|
|
4
|
-
MockPollCfg, MockWorkerInputs, MocksHolder, ResponseType, WorkerExt,
|
|
5
|
-
|
|
4
|
+
MockPollCfg, MockWorkerInputs, MocksHolder, ResponseType, WorkerExt, WorkerTestHelpers,
|
|
5
|
+
build_fake_worker, build_mock_pollers, mock_worker, test_worker_cfg,
|
|
6
6
|
},
|
|
7
7
|
worker::{
|
|
8
8
|
self,
|
|
@@ -16,6 +16,7 @@ use futures_util::{stream, stream::StreamExt};
|
|
|
16
16
|
use std::{cell::RefCell, time::Duration};
|
|
17
17
|
use temporal_sdk_core_api::{Worker, worker::PollerBehavior};
|
|
18
18
|
use temporal_sdk_core_protos::{
|
|
19
|
+
canned_histories,
|
|
19
20
|
coresdk::{
|
|
20
21
|
workflow_activation::workflow_activation_job,
|
|
21
22
|
workflow_commands::{CompleteWorkflowExecution, StartTimer, workflow_command},
|
|
@@ -24,8 +25,8 @@ use temporal_sdk_core_protos::{
|
|
|
24
25
|
temporal::api::workflowservice::v1::{
|
|
25
26
|
PollWorkflowTaskQueueResponse, RespondWorkflowTaskCompletedResponse, ShutdownWorkerResponse,
|
|
26
27
|
},
|
|
28
|
+
test_utils::start_timer_cmd,
|
|
27
29
|
};
|
|
28
|
-
use temporal_sdk_core_test_utils::{WorkerTestHelpers, start_timer_cmd};
|
|
29
30
|
use tokio::sync::{Barrier, watch};
|
|
30
31
|
|
|
31
32
|
#[tokio::test]
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
job_assert,
|
|
3
3
|
test_help::{
|
|
4
|
-
ResponseType, WorkflowCachingPolicy::NonSticky, build_fake_worker,
|
|
5
|
-
|
|
4
|
+
ResponseType, WorkflowCachingPolicy::NonSticky, build_fake_worker, gen_assert_and_reply,
|
|
5
|
+
poll_and_reply,
|
|
6
6
|
},
|
|
7
7
|
};
|
|
8
8
|
use rstest::rstest;
|
|
9
9
|
use std::time::Duration;
|
|
10
|
-
use temporal_sdk_core_protos::
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
use temporal_sdk_core_protos::{
|
|
11
|
+
canned_histories,
|
|
12
|
+
coresdk::{
|
|
13
|
+
workflow_activation::{WorkflowActivationJob, workflow_activation_job},
|
|
14
|
+
workflow_commands::{
|
|
15
|
+
CancelWorkflowExecution, CompleteWorkflowExecution, FailWorkflowExecution,
|
|
16
|
+
},
|
|
14
17
|
},
|
|
18
|
+
test_utils::start_timer_cmd,
|
|
15
19
|
};
|
|
16
|
-
use temporal_sdk_core_test_utils::start_timer_cmd;
|
|
17
20
|
|
|
18
21
|
enum CompletionType {
|
|
19
22
|
Complete,
|