@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
|
@@ -46,7 +46,7 @@ use temporalio_common::protos::{
|
|
|
46
46
|
RecordMarkerCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes,
|
|
47
47
|
},
|
|
48
48
|
common::v1::SearchAttributes,
|
|
49
|
-
enums::v1::
|
|
49
|
+
enums::v1::CommandType,
|
|
50
50
|
},
|
|
51
51
|
};
|
|
52
52
|
|
|
@@ -141,13 +141,10 @@ pub(super) fn has_change<'a>(
|
|
|
141
141
|
);
|
|
142
142
|
vec![]
|
|
143
143
|
} else {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
.as_bytes()
|
|
149
|
-
.to_vec(),
|
|
150
|
-
);
|
|
144
|
+
// "KeywordList" is the expected type for this search attribute
|
|
145
|
+
serialized
|
|
146
|
+
.metadata
|
|
147
|
+
.insert("type".to_string(), "KeywordList".as_bytes().to_vec());
|
|
151
148
|
let indexed_fields = {
|
|
152
149
|
let mut m = HashMap::new();
|
|
153
150
|
m.insert(VERSION_SEARCH_ATTR_KEY.to_string(), serialized);
|
|
@@ -50,11 +50,11 @@ pub(super) fn upsert_search_attrs(
|
|
|
50
50
|
let has_flag = internal_flags
|
|
51
51
|
.borrow_mut()
|
|
52
52
|
.try_use(CoreInternalFlags::UpsertSearchAttributeOnPatch, !replaying);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
{
|
|
53
|
+
let contains_version_key = attribs
|
|
54
|
+
.search_attributes
|
|
55
|
+
.as_ref()
|
|
56
|
+
.is_some_and(|sa| sa.indexed_fields.contains_key(VERSION_SEARCH_ATTR_KEY));
|
|
57
|
+
if has_flag && contains_version_key {
|
|
58
58
|
warn!(
|
|
59
59
|
"Upserting the {VERSION_SEARCH_ATTR_KEY} search attribute directly from workflow code \
|
|
60
60
|
is not permitted and has no effect!"
|
|
@@ -63,7 +63,7 @@ pub(super) fn upsert_search_attrs(
|
|
|
63
63
|
// this.
|
|
64
64
|
create_new(Default::default())
|
|
65
65
|
} else {
|
|
66
|
-
create_new(attribs.search_attributes.
|
|
66
|
+
create_new(attribs.search_attributes.unwrap_or_default())
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
|
|
@@ -186,21 +186,18 @@ mod tests {
|
|
|
186
186
|
worker::client::mocks::mock_worker_client,
|
|
187
187
|
};
|
|
188
188
|
use std::collections::HashMap;
|
|
189
|
-
use temporalio_common::{
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
enums::v1::EventType,
|
|
202
|
-
history::v1::{HistoryEvent, UpsertWorkflowSearchAttributesEventAttributes},
|
|
203
|
-
},
|
|
189
|
+
use temporalio_common::protos::{
|
|
190
|
+
coresdk::{
|
|
191
|
+
AsJsonPayloadExt,
|
|
192
|
+
workflow_activation::{WorkflowActivationJob, workflow_activation_job},
|
|
193
|
+
workflow_commands::SetPatchMarker,
|
|
194
|
+
workflow_completion::WorkflowActivationCompletion,
|
|
195
|
+
},
|
|
196
|
+
temporal::api::{
|
|
197
|
+
command::v1::command::Attributes,
|
|
198
|
+
common::v1::Payload,
|
|
199
|
+
enums::v1::EventType,
|
|
200
|
+
history::v1::{HistoryEvent, UpsertWorkflowSearchAttributesEventAttributes},
|
|
204
201
|
},
|
|
205
202
|
};
|
|
206
203
|
|
|
@@ -318,7 +315,9 @@ mod tests {
|
|
|
318
315
|
};
|
|
319
316
|
cmds.push(
|
|
320
317
|
UpsertWorkflowSearchAttributes {
|
|
321
|
-
search_attributes:
|
|
318
|
+
search_attributes: Some(SearchAttributes {
|
|
319
|
+
indexed_fields: ver_upsert,
|
|
320
|
+
}),
|
|
322
321
|
}
|
|
323
322
|
.into(),
|
|
324
323
|
);
|
|
@@ -13,6 +13,7 @@ use super::{
|
|
|
13
13
|
workflow_task_state_machine::WorkflowTaskMachine,
|
|
14
14
|
};
|
|
15
15
|
use crate::{
|
|
16
|
+
WorkerConfig,
|
|
16
17
|
abstractions::dbg_panic,
|
|
17
18
|
internal_flags::{CoreInternalFlags, InternalFlags},
|
|
18
19
|
protosext::{
|
|
@@ -66,13 +67,14 @@ use temporalio_common::{
|
|
|
66
67
|
command::v1::{
|
|
67
68
|
Command as ProtoCommand, CommandAttributesExt, command::Attributes as ProtoCmdAttrs,
|
|
68
69
|
},
|
|
70
|
+
common::v1::SearchAttributes,
|
|
69
71
|
enums::v1::EventType,
|
|
70
72
|
history::v1::{HistoryEvent, history_event},
|
|
71
73
|
protocol::v1::{Message as ProtocolMessage, message::SequencingId},
|
|
72
74
|
sdk::v1::{UserMetadata, WorkflowTaskCompletedMetadata},
|
|
73
75
|
},
|
|
74
76
|
},
|
|
75
|
-
worker::
|
|
77
|
+
worker::WorkerDeploymentVersion,
|
|
76
78
|
};
|
|
77
79
|
|
|
78
80
|
type Result<T, E = WFMachinesError> = std::result::Result<T, E>;
|
|
@@ -126,6 +128,10 @@ pub(crate) struct WorkflowMachines {
|
|
|
126
128
|
history_size_bytes: u64,
|
|
127
129
|
/// Set on each WFT started event
|
|
128
130
|
continue_as_new_suggested: bool,
|
|
131
|
+
/// Set on each WFT started event
|
|
132
|
+
suggest_continue_as_new_reasons: Vec<i32>,
|
|
133
|
+
/// Set on each WFT started event
|
|
134
|
+
target_worker_deployment_version_changed: bool,
|
|
129
135
|
/// Set if the current WFT is already complete and that completion event had legacy build-id
|
|
130
136
|
/// or a deployment version in it. Will use an empty deployment name if it's legacy build-id.
|
|
131
137
|
current_wft_deployment_info: Option<WorkerDeploymentVersion>,
|
|
@@ -290,6 +296,8 @@ impl WorkflowMachines {
|
|
|
290
296
|
observed_internal_flags: Rc::new(RefCell::new(observed_internal_flags)),
|
|
291
297
|
history_size_bytes: 0,
|
|
292
298
|
continue_as_new_suggested: false,
|
|
299
|
+
suggest_continue_as_new_reasons: Default::default(),
|
|
300
|
+
target_worker_deployment_version_changed: false,
|
|
293
301
|
current_wft_deployment_info: None,
|
|
294
302
|
all_machines: Default::default(),
|
|
295
303
|
machine_is_core_created: Default::default(),
|
|
@@ -471,6 +479,8 @@ impl WorkflowMachines {
|
|
|
471
479
|
.last_sdk_version()
|
|
472
480
|
.unwrap_or_default()
|
|
473
481
|
.to_owned(),
|
|
482
|
+
suggest_continue_as_new_reasons: self.suggest_continue_as_new_reasons.clone(),
|
|
483
|
+
target_worker_deployment_version_changed: self.target_worker_deployment_version_changed,
|
|
474
484
|
}
|
|
475
485
|
}
|
|
476
486
|
|
|
@@ -635,6 +645,9 @@ impl WorkflowMachines {
|
|
|
635
645
|
if events.is_empty() {
|
|
636
646
|
self.replaying = false;
|
|
637
647
|
}
|
|
648
|
+
// Track if we were replaying before processing events. We only want to record replay
|
|
649
|
+
// latency if we actually did replay work (i.e., started with replaying=true).
|
|
650
|
+
let was_replaying = self.replaying;
|
|
638
651
|
let replay_start = Instant::now();
|
|
639
652
|
|
|
640
653
|
if let Some(last_event) = events.last()
|
|
@@ -821,7 +834,10 @@ impl WorkflowMachines {
|
|
|
821
834
|
}
|
|
822
835
|
}
|
|
823
836
|
|
|
824
|
-
if
|
|
837
|
+
// Only record replay latency if we actually did replay work. This avoids recording
|
|
838
|
+
// near-zero latencies for the first workflow task (which has no history to replay) or
|
|
839
|
+
// when there were no events to process.
|
|
840
|
+
if was_replaying && !self.replaying {
|
|
825
841
|
self.metrics.wf_task_replay_latency(replay_start.elapsed());
|
|
826
842
|
}
|
|
827
843
|
|
|
@@ -885,6 +901,9 @@ impl WorkflowMachines {
|
|
|
885
901
|
{
|
|
886
902
|
self.history_size_bytes = u64::try_from(attrs.history_size_bytes).unwrap_or_default();
|
|
887
903
|
self.continue_as_new_suggested = attrs.suggest_continue_as_new;
|
|
904
|
+
self.suggest_continue_as_new_reasons = attrs.suggest_continue_as_new_reasons.clone();
|
|
905
|
+
self.target_worker_deployment_version_changed =
|
|
906
|
+
attrs.target_worker_deployment_version_changed;
|
|
888
907
|
}
|
|
889
908
|
|
|
890
909
|
if let Some(initial_cmd_id) = event.get_initial_command_event_id() {
|
|
@@ -1637,8 +1656,13 @@ impl WorkflowMachines {
|
|
|
1637
1656
|
attrs.retry_policy.clone_from(&started_info.retry_policy);
|
|
1638
1657
|
}
|
|
1639
1658
|
}
|
|
1640
|
-
if attrs.search_attributes.
|
|
1641
|
-
|
|
1659
|
+
if attrs.search_attributes.is_none() {
|
|
1660
|
+
let current = self.drive_me.get_current_search_attributes();
|
|
1661
|
+
if !current.is_empty() {
|
|
1662
|
+
attrs.search_attributes = Some(SearchAttributes {
|
|
1663
|
+
indexed_fields: current,
|
|
1664
|
+
});
|
|
1665
|
+
}
|
|
1642
1666
|
}
|
|
1643
1667
|
attrs
|
|
1644
1668
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
use crate::{
|
|
2
|
-
MetricsContext,
|
|
2
|
+
MetricsContext, WorkerConfig,
|
|
3
3
|
abstractions::dbg_panic,
|
|
4
4
|
internal_flags::CoreInternalFlags,
|
|
5
5
|
protosext::{WorkflowActivationExt, protocol_messages::IncomingProtocolMessage},
|
|
6
6
|
telemetry::metrics,
|
|
7
7
|
worker::{
|
|
8
|
-
LEGACY_QUERY_ID, LocalActRequest,
|
|
8
|
+
LEGACY_QUERY_ID, LocalActRequest, WorkflowErrorType,
|
|
9
9
|
workflow::{
|
|
10
10
|
ActivationAction, ActivationCompleteOutcome, ActivationCompleteResult,
|
|
11
11
|
ActivationOrAuto, BufferedTasks, DrivenWorkflow, EvictionRequestResult,
|
|
@@ -28,25 +28,20 @@ use std::{
|
|
|
28
28
|
sync::{Arc, mpsc::Sender},
|
|
29
29
|
time::{Duration, Instant},
|
|
30
30
|
};
|
|
31
|
-
use temporalio_common::{
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
WorkflowActivation, create_evict_activation, query_to_job,
|
|
38
|
-
remove_from_cache::EvictionReason, workflow_activation_job,
|
|
39
|
-
},
|
|
40
|
-
workflow_commands::{FailWorkflowExecution, QueryResult},
|
|
41
|
-
workflow_completion,
|
|
42
|
-
},
|
|
43
|
-
temporal::api::{
|
|
44
|
-
command::v1::command::Attributes as CmdAttribs,
|
|
45
|
-
enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
|
|
46
|
-
failure::v1::Failure,
|
|
31
|
+
use temporalio_common::protos::{
|
|
32
|
+
TaskToken,
|
|
33
|
+
coresdk::{
|
|
34
|
+
workflow_activation::{
|
|
35
|
+
WorkflowActivation, create_evict_activation, query_to_job,
|
|
36
|
+
remove_from_cache::EvictionReason, workflow_activation_job,
|
|
47
37
|
},
|
|
38
|
+
workflow_commands::{FailWorkflowExecution, QueryResult},
|
|
39
|
+
workflow_completion,
|
|
40
|
+
},
|
|
41
|
+
temporal::api::{
|
|
42
|
+
enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
|
|
43
|
+
failure::v1::Failure,
|
|
48
44
|
},
|
|
49
|
-
worker::WorkerConfig,
|
|
50
45
|
};
|
|
51
46
|
use tokio::sync::oneshot;
|
|
52
47
|
use tracing::Span;
|
|
@@ -191,6 +186,7 @@ impl ManagedRun {
|
|
|
191
186
|
attempt = %work.attempt,
|
|
192
187
|
"Applying new workflow task from server"
|
|
193
188
|
);
|
|
189
|
+
let is_incremental = work.is_incremental();
|
|
194
190
|
let wft_info = WorkflowTaskInfo {
|
|
195
191
|
attempt: work.attempt,
|
|
196
192
|
task_token: work.task_token,
|
|
@@ -239,7 +235,9 @@ impl ManagedRun {
|
|
|
239
235
|
|
|
240
236
|
// The update field is only populated in the event we hit the cache
|
|
241
237
|
let activation = if work.update.is_real() {
|
|
242
|
-
|
|
238
|
+
if is_incremental {
|
|
239
|
+
self.metrics.sticky_cache_hit();
|
|
240
|
+
}
|
|
243
241
|
self.wfm.new_work_from_server(work.update, work.messages)?
|
|
244
242
|
} else {
|
|
245
243
|
let r = self.wfm.get_next_activation()?;
|
|
@@ -440,6 +438,7 @@ impl ManagedRun {
|
|
|
440
438
|
action: ActivationAction::RespondLegacyQuery {
|
|
441
439
|
result: Box::new(qr),
|
|
442
440
|
},
|
|
441
|
+
metrics: self.metrics.clone(),
|
|
443
442
|
}),
|
|
444
443
|
resp_chan,
|
|
445
444
|
);
|
|
@@ -1127,27 +1126,6 @@ impl ManagedRun {
|
|
|
1127
1126
|
)
|
|
1128
1127
|
};
|
|
1129
1128
|
|
|
1130
|
-
// Record metrics for any outgoing terminal commands
|
|
1131
|
-
for cmd in commands.iter() {
|
|
1132
|
-
match cmd.attributes.as_ref() {
|
|
1133
|
-
Some(CmdAttribs::CompleteWorkflowExecutionCommandAttributes(_)) => {
|
|
1134
|
-
self.metrics.wf_completed();
|
|
1135
|
-
}
|
|
1136
|
-
Some(CmdAttribs::FailWorkflowExecutionCommandAttributes(attrs)) => {
|
|
1137
|
-
if metrics::should_record_failure_metric(&attrs.failure) {
|
|
1138
|
-
self.metrics.wf_failed();
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
Some(CmdAttribs::ContinueAsNewWorkflowExecutionCommandAttributes(_)) => {
|
|
1142
|
-
self.metrics.wf_continued_as_new();
|
|
1143
|
-
}
|
|
1144
|
-
Some(CmdAttribs::CancelWorkflowExecutionCommandAttributes(_)) => {
|
|
1145
|
-
self.metrics.wf_canceled();
|
|
1146
|
-
}
|
|
1147
|
-
_ => (),
|
|
1148
|
-
}
|
|
1149
|
-
}
|
|
1150
|
-
|
|
1151
1129
|
let attempt = self.wft.as_ref().map(|t| t.info.attempt).unwrap_or(1);
|
|
1152
1130
|
ActivationCompleteOutcome::ReportWFTSuccess(ServerCommandsWithWorkflowInfo {
|
|
1153
1131
|
task_token: data.task_token,
|
|
@@ -1160,6 +1138,7 @@ impl ManagedRun {
|
|
|
1160
1138
|
versioning_behavior: data.versioning_behavior,
|
|
1161
1139
|
attempt,
|
|
1162
1140
|
},
|
|
1141
|
+
metrics: self.metrics.clone(),
|
|
1163
1142
|
})
|
|
1164
1143
|
} else {
|
|
1165
1144
|
ActivationCompleteOutcome::DoNothing
|
|
@@ -15,7 +15,7 @@ pub(crate) use driven_workflow::DrivenWorkflow;
|
|
|
15
15
|
pub(crate) use history_update::HistoryUpdate;
|
|
16
16
|
|
|
17
17
|
use crate::{
|
|
18
|
-
MetricsContext,
|
|
18
|
+
MetricsContext, WorkerConfig,
|
|
19
19
|
abstractions::{
|
|
20
20
|
MeteredPermitDealer, TrackedOwnedMeteredSemPermit, UsedMeteredSemPermit, dbg_panic,
|
|
21
21
|
take_cell::TakeCell,
|
|
@@ -26,11 +26,10 @@ use crate::{
|
|
|
26
26
|
telemetry::{
|
|
27
27
|
VecDisplayer,
|
|
28
28
|
metrics::{self, FailureReason},
|
|
29
|
-
set_trace_subscriber_for_current_thread,
|
|
30
29
|
},
|
|
31
30
|
worker::{
|
|
32
|
-
LocalActRequest, LocalActivityExecutionResult,
|
|
33
|
-
PostActivateHookData,
|
|
31
|
+
ActivitySlotKind, CompleteWfError, LocalActRequest, LocalActivityExecutionResult,
|
|
32
|
+
LocalActivityResolution, PollError, PostActivateHookData, WorkflowSlotKind,
|
|
34
33
|
activities::{ActivitiesFromWFTsHandle, LocalActivityManager},
|
|
35
34
|
client::{LegacyQueryResult, WorkerClient, WorkflowTaskCompletion},
|
|
36
35
|
workflow::{
|
|
@@ -61,7 +60,6 @@ use std::{
|
|
|
61
60
|
};
|
|
62
61
|
use temporalio_client::MESSAGE_TOO_LARGE_KEY;
|
|
63
62
|
use temporalio_common::{
|
|
64
|
-
errors::{CompleteWfError, PollError},
|
|
65
63
|
protos::{
|
|
66
64
|
TaskToken,
|
|
67
65
|
coresdk::{
|
|
@@ -88,7 +86,7 @@ use temporalio_common::{
|
|
|
88
86
|
workflowservice::v1::{PollActivityTaskQueueResponse, get_system_info_response},
|
|
89
87
|
},
|
|
90
88
|
},
|
|
91
|
-
|
|
89
|
+
telemetry::set_trace_subscriber_for_current_thread,
|
|
92
90
|
};
|
|
93
91
|
use tokio::{
|
|
94
92
|
sync::{
|
|
@@ -98,8 +96,7 @@ use tokio::{
|
|
|
98
96
|
task::{LocalSet, spawn_blocking},
|
|
99
97
|
};
|
|
100
98
|
use tokio_stream::wrappers::UnboundedReceiverStream;
|
|
101
|
-
use tokio_util::either::Either;
|
|
102
|
-
use tokio_util::sync::CancellationToken;
|
|
99
|
+
use tokio_util::{either::Either, sync::CancellationToken};
|
|
103
100
|
use tracing::{Span, Subscriber};
|
|
104
101
|
|
|
105
102
|
/// Id used by server for "legacy" queries. IE: Queries that come in the `query` rather than
|
|
@@ -355,6 +352,7 @@ impl Workflows {
|
|
|
355
352
|
mut versioning_behavior,
|
|
356
353
|
attempt,
|
|
357
354
|
},
|
|
355
|
+
metrics: run_metrics,
|
|
358
356
|
} => {
|
|
359
357
|
let reserved_act_permits =
|
|
360
358
|
self.reserve_activity_slots_for_outgoing_commands(commands.as_mut_slice());
|
|
@@ -372,6 +370,7 @@ impl Workflows {
|
|
|
372
370
|
} else {
|
|
373
371
|
0
|
|
374
372
|
};
|
|
373
|
+
let mut maybe_record_terminal_metric = detect_terminal_command(&commands);
|
|
375
374
|
let mut completion = WorkflowTaskCompletion {
|
|
376
375
|
task_token: task_token.clone(),
|
|
377
376
|
commands,
|
|
@@ -398,6 +397,9 @@ impl Workflows {
|
|
|
398
397
|
self.handle_wft_reporting_errs(run_id, || async {
|
|
399
398
|
match self.client.complete_workflow_task(completion).await {
|
|
400
399
|
Ok(response) => {
|
|
400
|
+
if let Some(record) = maybe_record_terminal_metric.take() {
|
|
401
|
+
record(&run_metrics);
|
|
402
|
+
}
|
|
401
403
|
if response.reset_history_event_id > 0 {
|
|
402
404
|
reset_last_started_to = Some(response.reset_history_event_id);
|
|
403
405
|
}
|
|
@@ -460,6 +462,7 @@ impl Workflows {
|
|
|
460
462
|
ServerCommandsWithWorkflowInfo {
|
|
461
463
|
task_token,
|
|
462
464
|
action: ActivationAction::RespondLegacyQuery { result },
|
|
465
|
+
..
|
|
463
466
|
} => {
|
|
464
467
|
self.respond_legacy_query(task_token, LegacyQueryResult::Succeeded(*result))
|
|
465
468
|
.await;
|
|
@@ -1008,10 +1011,18 @@ enum FailedActivationWFTReport {
|
|
|
1008
1011
|
ReportLegacyQueryFailure(TaskToken, Failure),
|
|
1009
1012
|
}
|
|
1010
1013
|
|
|
1011
|
-
#[derive(Debug)]
|
|
1012
1014
|
struct ServerCommandsWithWorkflowInfo {
|
|
1013
1015
|
task_token: TaskToken,
|
|
1014
1016
|
action: ActivationAction,
|
|
1017
|
+
metrics: MetricsContext,
|
|
1018
|
+
}
|
|
1019
|
+
impl Debug for ServerCommandsWithWorkflowInfo {
|
|
1020
|
+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
1021
|
+
f.debug_struct("ServerCommandsWithWorkflowInfo")
|
|
1022
|
+
.field("task_token", &self.task_token)
|
|
1023
|
+
.field("action", &self.action)
|
|
1024
|
+
.finish()
|
|
1025
|
+
}
|
|
1015
1026
|
}
|
|
1016
1027
|
|
|
1017
1028
|
#[derive(Debug)]
|
|
@@ -1031,6 +1042,7 @@ pub(crate) enum ActivationAction {
|
|
|
1031
1042
|
}
|
|
1032
1043
|
|
|
1033
1044
|
#[derive(Debug)]
|
|
1045
|
+
#[allow(clippy::large_enum_variant)]
|
|
1034
1046
|
enum EvictionRequestResult {
|
|
1035
1047
|
EvictionRequested(Option<u32>, RunUpdateAct),
|
|
1036
1048
|
NotFound,
|
|
@@ -1046,6 +1058,35 @@ impl EvictionRequestResult {
|
|
|
1046
1058
|
}
|
|
1047
1059
|
}
|
|
1048
1060
|
|
|
1061
|
+
#[allow(clippy::type_complexity)]
|
|
1062
|
+
fn detect_terminal_command(
|
|
1063
|
+
commands: &[ProtoCommand],
|
|
1064
|
+
) -> Option<Box<dyn FnOnce(&MetricsContext) + Send>> {
|
|
1065
|
+
for cmd in commands {
|
|
1066
|
+
match cmd.attributes.as_ref() {
|
|
1067
|
+
Some(Attributes::CompleteWorkflowExecutionCommandAttributes(_)) => {
|
|
1068
|
+
return Some(Box::new(|m: &MetricsContext| m.wf_completed()));
|
|
1069
|
+
}
|
|
1070
|
+
Some(Attributes::FailWorkflowExecutionCommandAttributes(attrs)) => {
|
|
1071
|
+
let should_record = metrics::should_record_failure_metric(&attrs.failure);
|
|
1072
|
+
return Some(Box::new(move |m: &MetricsContext| {
|
|
1073
|
+
if should_record {
|
|
1074
|
+
m.wf_failed();
|
|
1075
|
+
}
|
|
1076
|
+
}));
|
|
1077
|
+
}
|
|
1078
|
+
Some(Attributes::ContinueAsNewWorkflowExecutionCommandAttributes(_)) => {
|
|
1079
|
+
return Some(Box::new(|m: &MetricsContext| m.wf_continued_as_new()));
|
|
1080
|
+
}
|
|
1081
|
+
Some(Attributes::CancelWorkflowExecutionCommandAttributes(_)) => {
|
|
1082
|
+
return Some(Box::new(|m: &MetricsContext| m.wf_canceled()));
|
|
1083
|
+
}
|
|
1084
|
+
_ => {}
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
None
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1049
1090
|
#[derive(Debug)]
|
|
1050
1091
|
#[allow(dead_code)] // Not always used in non-test
|
|
1051
1092
|
pub(crate) struct WorkflowStateInfo {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
use crate::{
|
|
2
|
-
MetricsContext,
|
|
2
|
+
MetricsContext, WorkerConfig,
|
|
3
3
|
telemetry::metrics::workflow_type,
|
|
4
4
|
worker::workflow::{
|
|
5
5
|
HistoryUpdate, LocalActivityRequestSink, PermittedWFT, RequestEvictMsg, RunBasics,
|
|
@@ -8,12 +8,9 @@ use crate::{
|
|
|
8
8
|
};
|
|
9
9
|
use lru::LruCache;
|
|
10
10
|
use std::{num::NonZeroUsize, rc::Rc, sync::Arc};
|
|
11
|
-
use temporalio_common::{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
temporal::api::workflowservice::v1::get_system_info_response,
|
|
15
|
-
},
|
|
16
|
-
worker::WorkerConfig,
|
|
11
|
+
use temporalio_common::protos::{
|
|
12
|
+
coresdk::workflow_activation::remove_from_cache::EvictionReason,
|
|
13
|
+
temporal::api::workflowservice::v1::get_system_info_response,
|
|
17
14
|
};
|
|
18
15
|
|
|
19
16
|
pub(super) struct RunCache {
|
|
@@ -2,6 +2,7 @@ use crate::{
|
|
|
2
2
|
abstractions::OwnedMeteredSemPermit,
|
|
3
3
|
protosext::ValidPollWFTQResponse,
|
|
4
4
|
worker::{
|
|
5
|
+
WorkflowSlotKind,
|
|
5
6
|
client::WorkerClient,
|
|
6
7
|
workflow::{
|
|
7
8
|
CacheMissFetchReq, HistoryUpdate, NextPageReq, PermittedWFT,
|
|
@@ -11,10 +12,7 @@ use crate::{
|
|
|
11
12
|
};
|
|
12
13
|
use futures_util::{FutureExt, Stream, StreamExt, stream, stream::PollNext};
|
|
13
14
|
use std::{future, sync::Arc};
|
|
14
|
-
use temporalio_common::{
|
|
15
|
-
protos::{TaskToken, coresdk::WorkflowSlotInfo},
|
|
16
|
-
worker::WorkflowSlotKind,
|
|
17
|
-
};
|
|
15
|
+
use temporalio_common::protos::{TaskToken, coresdk::WorkflowSlotInfo};
|
|
18
16
|
use tracing::Span;
|
|
19
17
|
|
|
20
18
|
/// Transforms incoming validated WFTs and history fetching requests into [PermittedWFT]s ready
|
|
@@ -1,21 +1,18 @@
|
|
|
1
1
|
use crate::{
|
|
2
|
-
MetricsContext,
|
|
2
|
+
MetricsContext, WorkerConfig,
|
|
3
3
|
abstractions::{MeteredPermitDealer, OwnedMeteredSemPermit},
|
|
4
4
|
pollers::{BoxedWFPoller, LongPollBuffer, Poller, WorkflowTaskOptions, WorkflowTaskPoller},
|
|
5
5
|
protosext::ValidPollWFTQResponse,
|
|
6
6
|
telemetry::metrics::{workflow_poller, workflow_sticky_poller},
|
|
7
|
-
worker::{client::WorkerClient, wft_poller_behavior},
|
|
7
|
+
worker::{WorkflowSlotKind, client::WorkerClient, wft_poller_behavior},
|
|
8
8
|
};
|
|
9
9
|
use crossbeam_utils::atomic::AtomicCell;
|
|
10
10
|
use futures_util::{Stream, stream};
|
|
11
11
|
use std::{
|
|
12
|
-
sync::{Arc, OnceLock},
|
|
12
|
+
sync::{Arc, OnceLock, atomic::AtomicBool},
|
|
13
13
|
time::SystemTime,
|
|
14
14
|
};
|
|
15
|
-
use temporalio_common::
|
|
16
|
-
protos::temporal::api::workflowservice::v1::PollWorkflowTaskQueueResponse,
|
|
17
|
-
worker::{WorkerConfig, WorkflowSlotKind},
|
|
18
|
-
};
|
|
15
|
+
use temporalio_common::protos::temporal::api::workflowservice::v1::PollWorkflowTaskQueueResponse;
|
|
19
16
|
use tokio::sync::watch;
|
|
20
17
|
use tokio_util::sync::CancellationToken;
|
|
21
18
|
|
|
@@ -29,6 +26,7 @@ pub(crate) fn make_wft_poller(
|
|
|
29
26
|
wft_slots: &MeteredPermitDealer<WorkflowSlotKind>,
|
|
30
27
|
last_successful_poll_time: Arc<AtomicCell<Option<SystemTime>>>,
|
|
31
28
|
sticky_last_successful_poll_time: Arc<AtomicCell<Option<SystemTime>>>,
|
|
29
|
+
graceful_poll_shutdown: Arc<AtomicBool>,
|
|
32
30
|
) -> impl Stream<
|
|
33
31
|
Item = Result<
|
|
34
32
|
(
|
|
@@ -62,6 +60,7 @@ pub(crate) fn make_wft_poller(
|
|
|
62
60
|
wft_poller_shared: wft_poller_shared.clone(),
|
|
63
61
|
},
|
|
64
62
|
last_successful_poll_time,
|
|
63
|
+
graceful_poll_shutdown.clone(),
|
|
65
64
|
);
|
|
66
65
|
let sticky_queue_poller = sticky_queue_name.as_ref().map(|sqn| {
|
|
67
66
|
let sticky_metrics = metrics.with_new_attrs([workflow_sticky_poller()]);
|
|
@@ -77,6 +76,7 @@ pub(crate) fn make_wft_poller(
|
|
|
77
76
|
}),
|
|
78
77
|
WorkflowTaskOptions { wft_poller_shared },
|
|
79
78
|
sticky_last_successful_poll_time,
|
|
79
|
+
graceful_poll_shutdown,
|
|
80
80
|
)
|
|
81
81
|
});
|
|
82
82
|
let wf_task_poll_buffer = Box::new(WorkflowTaskPoller::new(
|
|
@@ -258,11 +258,10 @@ mod tests {
|
|
|
258
258
|
use super::*;
|
|
259
259
|
use crate::{
|
|
260
260
|
abstractions::tests::fixed_size_permit_dealer, pollers::MockPermittedPollBuffer,
|
|
261
|
-
test_help::mock_poller,
|
|
261
|
+
test_help::mock_poller, worker::WorkflowSlotKind,
|
|
262
262
|
};
|
|
263
263
|
use futures_util::{StreamExt, pin_mut};
|
|
264
264
|
use std::sync::Arc;
|
|
265
|
-
use temporalio_common::worker::WorkflowSlotKind;
|
|
266
265
|
|
|
267
266
|
#[tokio::test]
|
|
268
267
|
async fn poll_timeouts_do_not_produce_responses() {
|
|
@@ -10,9 +10,7 @@ use crate::{
|
|
|
10
10
|
};
|
|
11
11
|
use futures_util::{Stream, StreamExt, stream, stream::PollNext};
|
|
12
12
|
use std::{collections::VecDeque, fmt::Debug, future, sync::Arc};
|
|
13
|
-
use temporalio_common::
|
|
14
|
-
errors::PollError, protos::coresdk::workflow_activation::remove_from_cache::EvictionReason,
|
|
15
|
-
};
|
|
13
|
+
use temporalio_common::protos::coresdk::workflow_activation::remove_from_cache::EvictionReason;
|
|
16
14
|
use tokio_util::sync::CancellationToken;
|
|
17
15
|
use tracing::{Level, Span};
|
|
18
16
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
use std::sync::Arc;
|
|
2
|
+
use temporalio_macros::activities;
|
|
3
|
+
use temporalio_sdk::activities::{ActivityContext, ActivityError};
|
|
4
|
+
|
|
5
|
+
pub struct MyActivities;
|
|
6
|
+
|
|
7
|
+
#[activities]
|
|
8
|
+
impl MyActivities {
|
|
9
|
+
#[activity]
|
|
10
|
+
pub async fn static_activity(
|
|
11
|
+
_ctx: ActivityContext,
|
|
12
|
+
_in: String,
|
|
13
|
+
) -> Result<String, ActivityError> {
|
|
14
|
+
Ok("Can be static".to_string())
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#[activity]
|
|
18
|
+
pub async fn activity(
|
|
19
|
+
self: Arc<Self>,
|
|
20
|
+
_ctx: ActivityContext,
|
|
21
|
+
_in: bool,
|
|
22
|
+
) -> Result<String, ActivityError> {
|
|
23
|
+
Ok("I'm done!".to_string())
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
#[activity]
|
|
27
|
+
pub async fn activity_arc_fully_qualified(
|
|
28
|
+
self: std::sync::Arc<Self>,
|
|
29
|
+
_ctx: ActivityContext,
|
|
30
|
+
_in: bool,
|
|
31
|
+
) -> Result<String, ActivityError> {
|
|
32
|
+
Ok("I'm done!".to_string())
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#[activity]
|
|
36
|
+
pub fn sync_activity(_ctx: ActivityContext, _in: bool) -> Result<String, ActivityError> {
|
|
37
|
+
Ok("Sync activities are supported too".to_string())
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
pub struct MyActivitiesStatic;
|
|
42
|
+
|
|
43
|
+
#[activities]
|
|
44
|
+
impl MyActivitiesStatic {
|
|
45
|
+
#[activity]
|
|
46
|
+
pub async fn static_activity(
|
|
47
|
+
_ctx: ActivityContext,
|
|
48
|
+
_in: String,
|
|
49
|
+
) -> Result<String, ActivityError> {
|
|
50
|
+
Ok("Can be static".to_string())
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
fn main() {}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
use temporalio_macros::activities;
|
|
2
|
+
|
|
3
|
+
pub struct BadActivities;
|
|
4
|
+
|
|
5
|
+
#[activities]
|
|
6
|
+
impl BadActivities {
|
|
7
|
+
#[activity]
|
|
8
|
+
pub async fn no_context(
|
|
9
|
+
&self,
|
|
10
|
+
_ctx: ActivityContext,
|
|
11
|
+
_in: String,
|
|
12
|
+
) -> Result<String, ActivityError> {
|
|
13
|
+
// This should fail because the self type is invalid.
|
|
14
|
+
Ok("bad".to_string())
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
fn main() {}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
use temporalio_macros::activities;
|
|
2
|
+
|
|
3
|
+
pub struct BadActivities;
|
|
4
|
+
|
|
5
|
+
#[activities]
|
|
6
|
+
impl BadActivities {
|
|
7
|
+
#[activity]
|
|
8
|
+
pub async fn no_context(_in: String) -> Result<String, ActivityError> {
|
|
9
|
+
// This should fail because there's no ActivityContext parameter
|
|
10
|
+
Ok("bad".to_string())
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
fn main() {}
|