temporalio 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +175 -4
- data/bridge/Cargo.lock +44 -21
- data/bridge/Cargo.toml +1 -0
- data/bridge/sdk-core/Cargo.toml +1 -1
- data/bridge/sdk-core/README.md +1 -4
- data/bridge/sdk-core/client/Cargo.toml +1 -1
- data/bridge/sdk-core/client/src/lib.rs +12 -20
- data/bridge/sdk-core/client/src/raw.rs +9 -8
- data/bridge/sdk-core/client/src/retry.rs +100 -23
- data/bridge/sdk-core/core/Cargo.toml +7 -7
- data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
- data/bridge/sdk-core/core/src/abstractions.rs +22 -22
- data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +146 -43
- data/bridge/sdk-core/core/src/core_tests/local_activities.rs +419 -9
- data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -89
- data/bridge/sdk-core/core/src/core_tests/workers.rs +2 -2
- data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
- data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +47 -27
- data/bridge/sdk-core/core/src/lib.rs +139 -32
- data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
- data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
- data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
- data/bridge/sdk-core/core/src/telemetry/metrics.rs +184 -139
- data/bridge/sdk-core/core/src/telemetry/mod.rs +310 -315
- data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +4 -3
- data/bridge/sdk-core/core/src/test_help/mod.rs +23 -9
- data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +12 -6
- data/bridge/sdk-core/core/src/worker/activities.rs +40 -23
- data/bridge/sdk-core/core/src/worker/client/mocks.rs +1 -1
- data/bridge/sdk-core/core/src/worker/client.rs +30 -4
- data/bridge/sdk-core/core/src/worker/mod.rs +23 -19
- data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +10 -19
- data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +99 -25
- data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +3 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +2 -6
- data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +24 -22
- data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +12 -38
- data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
- data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +8 -2
- data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +1 -5
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +1 -1
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +233 -217
- data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +1 -6
- data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +4 -4
- data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +13 -5
- data/bridge/sdk-core/core/src/worker/workflow/mod.rs +86 -29
- data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +2 -2
- data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +56 -11
- data/bridge/sdk-core/core-api/Cargo.toml +4 -3
- data/bridge/sdk-core/core-api/src/lib.rs +1 -43
- data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
- data/bridge/sdk-core/core-api/src/worker.rs +13 -0
- data/bridge/sdk-core/etc/deps.svg +115 -140
- data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
- data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
- data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
- data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
- data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -3
- data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
- data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
- data/bridge/sdk-core/protos/api_upstream/{temporal/api/update/v1/message.proto → build/tools.go} +6 -23
- data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
- data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
- data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +20 -19
- data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -4
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +5 -3
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +23 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/{cluster.proto → interaction_type.proto} +10 -11
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +2 -13
- data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +26 -19
- data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
- data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +21 -61
- data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
- data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
- data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
- data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -16
- data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +17 -3
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
- data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +8 -1
- data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
- data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
- data/bridge/sdk-core/sdk/Cargo.toml +2 -2
- data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
- data/bridge/sdk-core/sdk/src/lib.rs +7 -5
- data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
- data/bridge/sdk-core/sdk/src/workflow_future.rs +3 -7
- data/bridge/sdk-core/sdk-core-protos/Cargo.toml +1 -1
- data/bridge/sdk-core/sdk-core-protos/build.rs +0 -1
- data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +65 -18
- data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +22 -22
- data/bridge/sdk-core/sdk-core-protos/src/lib.rs +104 -44
- data/bridge/sdk-core/test-utils/Cargo.toml +2 -1
- data/bridge/sdk-core/test-utils/src/lib.rs +81 -29
- data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +5 -2
- data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
- data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -13
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +167 -13
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
- data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +106 -20
- data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +18 -8
- data/bridge/sdk-core/tests/main.rs +6 -4
- data/bridge/src/connection.rs +81 -62
- data/bridge/src/lib.rs +92 -33
- data/bridge/src/runtime.rs +9 -2
- data/bridge/src/worker.rs +53 -2
- data/lib/bridge.so +0 -0
- data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
- data/lib/gen/temporal/api/command/v1/message_pb.rb +17 -9
- data/lib/gen/temporal/api/common/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
- data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -1
- data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
- data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +3 -2
- data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +7 -1
- data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
- data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/update_pb.rb +1 -6
- data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
- data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/history/v1/message_pb.rb +19 -18
- data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
- data/lib/gen/temporal/api/namespace/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +11 -51
- data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
- data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
- data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
- data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
- data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +27 -10
- data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
- data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +1 -0
- data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +5 -1
- data/lib/temporalio/activity/context.rb +97 -0
- data/lib/temporalio/activity/info.rb +67 -0
- data/lib/temporalio/activity.rb +85 -0
- data/lib/temporalio/bridge/error.rb +8 -0
- data/lib/temporalio/bridge.rb +14 -0
- data/lib/{temporal → temporalio}/client/implementation.rb +49 -48
- data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
- data/lib/{temporal → temporalio}/client.rb +19 -32
- data/lib/{temporal → temporalio}/connection.rb +238 -223
- data/lib/{temporal → temporalio}/data_converter.rb +76 -35
- data/lib/{temporal → temporalio}/error/failure.rb +6 -6
- data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
- data/lib/{temporal → temporalio}/errors.rb +19 -1
- data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
- data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
- data/lib/temporalio/failure_converter.rb +7 -0
- data/lib/{temporal → temporalio}/interceptor/chain.rb +2 -1
- data/lib/{temporal → temporalio}/interceptor/client.rb +22 -1
- data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
- data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
- data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
- data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
- data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
- data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
- data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
- data/lib/temporalio/payload_converter.rb +14 -0
- data/lib/{temporal → temporalio}/retry_policy.rb +4 -4
- data/lib/{temporal → temporalio}/retry_state.rb +1 -1
- data/lib/temporalio/runtime.rb +25 -0
- data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
- data/lib/temporalio/version.rb +3 -0
- data/lib/temporalio/worker/activity_runner.rb +92 -0
- data/lib/temporalio/worker/activity_worker.rb +138 -0
- data/lib/temporalio/worker/reactor.rb +46 -0
- data/lib/temporalio/worker/runner.rb +63 -0
- data/lib/temporalio/worker/sync_worker.rb +88 -0
- data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
- data/lib/temporalio/worker.rb +198 -0
- data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
- data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
- data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
- data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
- data/lib/temporalio.rb +12 -3
- data/temporalio.gemspec +7 -3
- metadata +79 -56
- data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
- data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
- data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
- data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
- data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
- data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
- data/bridge/sdk-core/core/src/log_export.rs +0 -62
- data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
- data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
- data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
- data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
- data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
- data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
- data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
- data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -26
- data/lib/temporal/bridge.rb +0 -14
- data/lib/temporal/failure_converter.rb +0 -8
- data/lib/temporal/payload_converter.rb +0 -14
- data/lib/temporal/runtime.rb +0 -22
- data/lib/temporal/version.rb +0 -3
- data/lib/temporal.rb +0 -8
@@ -1,7 +1,11 @@
|
|
1
1
|
//! User-definable interceptors are defined in this module
|
2
2
|
|
3
3
|
use crate::Worker;
|
4
|
-
use
|
4
|
+
use anyhow::bail;
|
5
|
+
use temporal_sdk_core_protos::coresdk::{
|
6
|
+
workflow_activation::{remove_from_cache::EvictionReason, WorkflowActivation},
|
7
|
+
workflow_completion::WorkflowActivationCompletion,
|
8
|
+
};
|
5
9
|
|
6
10
|
/// Implementors can intercept certain actions that happen within the Worker.
|
7
11
|
///
|
@@ -10,8 +14,37 @@ use temporal_sdk_core_protos::coresdk::workflow_completion::WorkflowActivationCo
|
|
10
14
|
pub trait WorkerInterceptor {
|
11
15
|
/// Called every time a workflow activation completes (just before sending the completion to
|
12
16
|
/// core).
|
13
|
-
async fn on_workflow_activation_completion(&self,
|
17
|
+
async fn on_workflow_activation_completion(&self, _completion: &WorkflowActivationCompletion) {}
|
14
18
|
/// Called after the worker has initiated shutdown and the workflow/activity polling loops
|
15
19
|
/// have exited, but just before waiting for the inner core worker shutdown
|
16
|
-
fn on_shutdown(&self,
|
20
|
+
fn on_shutdown(&self, _sdk_worker: &Worker) {}
|
21
|
+
/// Called every time a workflow is about to be activated
|
22
|
+
async fn on_workflow_activation(
|
23
|
+
&self,
|
24
|
+
_activation: &WorkflowActivation,
|
25
|
+
) -> Result<(), anyhow::Error> {
|
26
|
+
Ok(())
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
/// An interceptor which causes the worker's run function to exit early if nondeterminism errors are
|
31
|
+
/// encountered
|
32
|
+
pub struct FailOnNondeterminismInterceptor {}
|
33
|
+
#[async_trait::async_trait(?Send)]
|
34
|
+
impl WorkerInterceptor for FailOnNondeterminismInterceptor {
|
35
|
+
async fn on_workflow_activation(
|
36
|
+
&self,
|
37
|
+
activation: &WorkflowActivation,
|
38
|
+
) -> Result<(), anyhow::Error> {
|
39
|
+
if matches!(
|
40
|
+
activation.eviction_reason(),
|
41
|
+
Some(EvictionReason::Nondeterminism)
|
42
|
+
) {
|
43
|
+
bail!(
|
44
|
+
"Workflow is being evicted because of nondeterminism! {}",
|
45
|
+
activation
|
46
|
+
);
|
47
|
+
}
|
48
|
+
Ok(())
|
49
|
+
}
|
17
50
|
}
|
@@ -10,8 +10,8 @@
|
|
10
10
|
//! ```no_run
|
11
11
|
//! use std::{str::FromStr, sync::Arc};
|
12
12
|
//! use temporal_sdk::{sdk_client_options, ActContext, Worker};
|
13
|
-
//! use temporal_sdk_core::{init_worker,
|
14
|
-
//! use temporal_sdk_core_api::worker::WorkerConfigBuilder;
|
13
|
+
//! use temporal_sdk_core::{init_worker, Url, CoreRuntime};
|
14
|
+
//! use temporal_sdk_core_api::{worker::WorkerConfigBuilder, telemetry::TelemetryOptionsBuilder};
|
15
15
|
//!
|
16
16
|
//! #[tokio::main]
|
17
17
|
//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
@@ -20,14 +20,14 @@
|
|
20
20
|
//! let client = server_options.connect("default", None, None).await?;
|
21
21
|
//!
|
22
22
|
//! let telemetry_options = TelemetryOptionsBuilder::default().build()?;
|
23
|
-
//!
|
23
|
+
//! let runtime = CoreRuntime::new_assume_tokio(telemetry_options)?;
|
24
24
|
//!
|
25
25
|
//! let worker_config = WorkerConfigBuilder::default()
|
26
26
|
//! .namespace("default")
|
27
27
|
//! .task_queue("task_queue")
|
28
28
|
//! .build()?;
|
29
29
|
//!
|
30
|
-
//! let core_worker = init_worker(worker_config, client)
|
30
|
+
//! let core_worker = init_worker(&runtime, worker_config, client)?;
|
31
31
|
//!
|
32
32
|
//! let mut worker = Worker::new_from_core(Arc::new(core_worker), "task_queue");
|
33
33
|
//! worker.register_activity(
|
@@ -46,7 +46,6 @@ extern crate tracing;
|
|
46
46
|
|
47
47
|
mod activity_context;
|
48
48
|
mod app_data;
|
49
|
-
mod conversions;
|
50
49
|
pub mod interceptors;
|
51
50
|
mod payload_converter;
|
52
51
|
mod workflow_context;
|
@@ -279,6 +278,9 @@ impl Worker {
|
|
279
278
|
}
|
280
279
|
o => o?,
|
281
280
|
};
|
281
|
+
if let Some(ref i) = common.worker_interceptor {
|
282
|
+
i.on_workflow_activation(&activation).await?;
|
283
|
+
}
|
282
284
|
if let Some(wf_fut) = wf_half.workflow_activation_handler(
|
283
285
|
common,
|
284
286
|
shutdown_token.clone(),
|
@@ -34,11 +34,11 @@ use temporal_sdk_core_protos::{
|
|
34
34
|
workflow_commands::{
|
35
35
|
request_cancel_external_workflow_execution as cancel_we,
|
36
36
|
signal_external_workflow_execution as sig_we, workflow_command,
|
37
|
-
RequestCancelExternalWorkflowExecution, SetPatchMarker,
|
37
|
+
ModifyWorkflowProperties, RequestCancelExternalWorkflowExecution, SetPatchMarker,
|
38
38
|
SignalExternalWorkflowExecution, StartTimer, UpsertWorkflowSearchAttributes,
|
39
39
|
},
|
40
40
|
},
|
41
|
-
temporal::api::common::v1::Payload,
|
41
|
+
temporal::api::common::v1::{Memo, Payload},
|
42
42
|
};
|
43
43
|
use tokio::sync::{mpsc, oneshot, watch};
|
44
44
|
use tokio_stream::wrappers::UnboundedReceiverStream;
|
@@ -297,6 +297,17 @@ impl WfContext {
|
|
297
297
|
))
|
298
298
|
}
|
299
299
|
|
300
|
+
/// Add or create a set of search attributes
|
301
|
+
pub fn upsert_memo(&self, attr_iter: impl IntoIterator<Item = (String, Payload)>) {
|
302
|
+
self.send(RustWfCmd::NewNonblockingCmd(
|
303
|
+
workflow_command::Variant::ModifyWorkflowProperties(ModifyWorkflowProperties {
|
304
|
+
upserted_memo: Some(Memo {
|
305
|
+
fields: HashMap::from_iter(attr_iter.into_iter()),
|
306
|
+
}),
|
307
|
+
}),
|
308
|
+
))
|
309
|
+
}
|
310
|
+
|
300
311
|
/// Return a stream that produces values when the named signal is sent to this workflow
|
301
312
|
pub fn make_signal_channel(&self, signal_name: impl Into<String>) -> DrainableSignalStream {
|
302
313
|
let (tx, rx) = mpsc::unbounded_channel();
|
@@ -1,7 +1,6 @@
|
|
1
1
|
use crate::{
|
2
|
-
|
3
|
-
|
4
|
-
WorkflowResult,
|
2
|
+
workflow_context::WfContextSharedData, CancellableID, RustWfCmd, SignalData, TimerResult,
|
3
|
+
UnblockEvent, WfContext, WfExitValue, WorkflowFunction, WorkflowResult,
|
5
4
|
};
|
6
5
|
use anyhow::{anyhow, bail, Context as AnyhowContext, Error};
|
7
6
|
use crossbeam::channel::Receiver;
|
@@ -132,10 +131,7 @@ impl WorkflowFuture {
|
|
132
131
|
fn fail_wft(&self, run_id: String, fail: Error) {
|
133
132
|
warn!("Workflow task failed for {}: {}", run_id, fail);
|
134
133
|
self.outgoing_completions
|
135
|
-
.send(WorkflowActivationCompletion::fail(
|
136
|
-
run_id,
|
137
|
-
anyhow_to_fail(fail),
|
138
|
-
))
|
134
|
+
.send(WorkflowActivationCompletion::fail(run_id, fail.into()))
|
139
135
|
.expect("Completion channel intact");
|
140
136
|
}
|
141
137
|
|
@@ -91,7 +91,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
91
91
|
.compile(
|
92
92
|
&[
|
93
93
|
"../protos/local/temporal/sdk/core/core_interface.proto",
|
94
|
-
"../protos/local/temporal/sdk/core/bridge/bridge.proto",
|
95
94
|
"../protos/api_upstream/temporal/api/workflowservice/v1/service.proto",
|
96
95
|
"../protos/api_upstream/temporal/api/operatorservice/v1/service.proto",
|
97
96
|
"../protos/testsrv_upstream/temporal/api/testservice/v1/service.proto",
|
@@ -10,9 +10,10 @@ use crate::{
|
|
10
10
|
},
|
11
11
|
temporal::api::{
|
12
12
|
common::v1::{Payload, Payloads, WorkflowExecution, WorkflowType},
|
13
|
-
enums::v1::{EventType, WorkflowTaskFailedCause},
|
13
|
+
enums::v1::{EventType, TaskQueueKind, WorkflowTaskFailedCause},
|
14
14
|
failure::v1::{failure, CanceledFailureInfo, Failure},
|
15
15
|
history::v1::{history_event::Attributes, *},
|
16
|
+
taskqueue::v1::TaskQueue,
|
16
17
|
},
|
17
18
|
HistoryInfo,
|
18
19
|
};
|
@@ -38,6 +39,27 @@ pub struct TestHistoryBuilder {
|
|
38
39
|
}
|
39
40
|
|
40
41
|
impl TestHistoryBuilder {
|
42
|
+
pub fn from_history(events: Vec<HistoryEvent>) -> Self {
|
43
|
+
let find_matching_id = |etype: EventType| {
|
44
|
+
events
|
45
|
+
.iter()
|
46
|
+
.rev()
|
47
|
+
.find(|e| e.event_type() == etype)
|
48
|
+
.map(|e| e.event_id)
|
49
|
+
.unwrap_or_default()
|
50
|
+
};
|
51
|
+
Self {
|
52
|
+
current_event_id: events.last().map(|e| e.event_id).unwrap_or_default(),
|
53
|
+
workflow_task_scheduled_event_id: find_matching_id(EventType::WorkflowTaskScheduled),
|
54
|
+
final_workflow_task_started_event_id: find_matching_id(EventType::WorkflowTaskStarted),
|
55
|
+
previous_task_completed_id: find_matching_id(EventType::WorkflowTaskCompleted),
|
56
|
+
original_run_id: extract_original_run_id_from_events(&events)
|
57
|
+
.expect("Run id must be discoverable")
|
58
|
+
.to_string(),
|
59
|
+
events,
|
60
|
+
}
|
61
|
+
}
|
62
|
+
|
41
63
|
/// Add an event by type with attributes. Bundles both into a [HistoryEvent] with an id that is
|
42
64
|
/// incremented on each call to add.
|
43
65
|
pub fn add(&mut self, event_type: EventType, attribs: Attributes) {
|
@@ -270,22 +292,21 @@ impl TestHistoryBuilder {
|
|
270
292
|
activity_id: &str,
|
271
293
|
payload: Option<Payload>,
|
272
294
|
failure: Option<Failure>,
|
273
|
-
|
295
|
+
detail_mutator: impl FnOnce(&mut LocalActivityMarkerData),
|
274
296
|
) {
|
297
|
+
let mut lamd = LocalActivityMarkerData {
|
298
|
+
seq,
|
299
|
+
attempt: 1,
|
300
|
+
activity_id: activity_id.to_string(),
|
301
|
+
activity_type: "some_act_type".to_string(),
|
302
|
+
complete_time: None,
|
303
|
+
backoff: None,
|
304
|
+
original_schedule_time: None,
|
305
|
+
};
|
306
|
+
detail_mutator(&mut lamd);
|
275
307
|
let attrs = MarkerRecordedEventAttributes {
|
276
308
|
marker_name: LOCAL_ACTIVITY_MARKER_NAME.to_string(),
|
277
|
-
details: build_local_activity_marker_details(
|
278
|
-
LocalActivityMarkerData {
|
279
|
-
seq,
|
280
|
-
attempt: 1,
|
281
|
-
activity_id: activity_id.to_string(),
|
282
|
-
activity_type: "some_act_type".to_string(),
|
283
|
-
complete_time,
|
284
|
-
backoff: None,
|
285
|
-
original_schedule_time: None,
|
286
|
-
},
|
287
|
-
payload,
|
288
|
-
),
|
309
|
+
details: build_local_activity_marker_details(lamd, payload),
|
289
310
|
workflow_task_completed_event_id: self.previous_task_completed_id,
|
290
311
|
failure,
|
291
312
|
..Default::default()
|
@@ -299,7 +320,7 @@ impl TestHistoryBuilder {
|
|
299
320
|
activity_id: &str,
|
300
321
|
payload: Payload,
|
301
322
|
) {
|
302
|
-
self.add_local_activity_marker(seq, activity_id, Some(payload), None,
|
323
|
+
self.add_local_activity_marker(seq, activity_id, Some(payload), None, |_| {});
|
303
324
|
}
|
304
325
|
|
305
326
|
pub fn add_local_activity_result_marker_with_time(
|
@@ -309,7 +330,9 @@ impl TestHistoryBuilder {
|
|
309
330
|
payload: Payload,
|
310
331
|
complete_time: Timestamp,
|
311
332
|
) {
|
312
|
-
self.add_local_activity_marker(seq, activity_id, Some(payload), None,
|
333
|
+
self.add_local_activity_marker(seq, activity_id, Some(payload), None, |d| {
|
334
|
+
d.complete_time = Some(complete_time)
|
335
|
+
});
|
313
336
|
}
|
314
337
|
|
315
338
|
pub fn add_local_activity_fail_marker(
|
@@ -318,7 +341,7 @@ impl TestHistoryBuilder {
|
|
318
341
|
activity_id: &str,
|
319
342
|
failure: Failure,
|
320
343
|
) {
|
321
|
-
self.add_local_activity_marker(seq, activity_id, None, Some(failure),
|
344
|
+
self.add_local_activity_marker(seq, activity_id, None, Some(failure), |_| {});
|
322
345
|
}
|
323
346
|
|
324
347
|
pub fn add_local_activity_cancel_marker(&mut self, seq: u32, activity_id: &str) {
|
@@ -336,7 +359,7 @@ impl TestHistoryBuilder {
|
|
336
359
|
)),
|
337
360
|
encoded_attributes: Default::default(),
|
338
361
|
}),
|
339
|
-
|
362
|
+
|_| {},
|
340
363
|
);
|
341
364
|
}
|
342
365
|
|
@@ -450,6 +473,26 @@ impl TestHistoryBuilder {
|
|
450
473
|
.unwrap()
|
451
474
|
}
|
452
475
|
|
476
|
+
/// Alter the workflow type of the history
|
477
|
+
pub fn set_wf_type(&mut self, name: &str) {
|
478
|
+
if let Some(Attributes::WorkflowExecutionStartedEventAttributes(wes)) =
|
479
|
+
self.events.get_mut(0).and_then(|e| e.attributes.as_mut())
|
480
|
+
{
|
481
|
+
wes.workflow_type = Some(WorkflowType {
|
482
|
+
name: name.to_string(),
|
483
|
+
})
|
484
|
+
}
|
485
|
+
}
|
486
|
+
|
487
|
+
/// Alter some specific event. You can easily craft nonsense histories this way, use carefully.
|
488
|
+
pub fn modify_event(&mut self, event_id: i64, modifier: impl FnOnce(&mut HistoryEvent)) {
|
489
|
+
let he = self
|
490
|
+
.events
|
491
|
+
.get_mut((event_id - 1) as usize)
|
492
|
+
.expect("Event must be present");
|
493
|
+
modifier(he);
|
494
|
+
}
|
495
|
+
|
453
496
|
fn build_and_push_event(&mut self, event_type: EventType, attribs: Attributes) {
|
454
497
|
self.current_event_id += 1;
|
455
498
|
let evt = HistoryEvent {
|
@@ -492,6 +535,10 @@ pub fn default_wes_attribs() -> WorkflowExecutionStartedEventAttributes {
|
|
492
535
|
.try_into()
|
493
536
|
.expect("5 secs is a valid duration"),
|
494
537
|
),
|
538
|
+
task_queue: Some(TaskQueue {
|
539
|
+
name: "q".to_string(),
|
540
|
+
kind: TaskQueueKind::Normal as i32,
|
541
|
+
}),
|
495
542
|
..Default::default()
|
496
543
|
}
|
497
544
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
use crate::temporal::api::{
|
2
2
|
common::v1::WorkflowType,
|
3
3
|
enums::v1::{EventType, TaskQueueKind},
|
4
|
-
history::v1::{history_event, History, HistoryEvent},
|
4
|
+
history::v1::{history_event, History, HistoryEvent, WorkflowExecutionStartedEventAttributes},
|
5
5
|
taskqueue::v1::TaskQueue,
|
6
6
|
workflowservice::v1::{GetWorkflowExecutionHistoryResponse, PollWorkflowTaskQueueResponse},
|
7
7
|
};
|
@@ -18,6 +18,7 @@ pub struct HistoryInfo {
|
|
18
18
|
events: Vec<HistoryEvent>,
|
19
19
|
wf_task_count: usize,
|
20
20
|
wf_type: String,
|
21
|
+
wf_exe_started_attrs: WorkflowExecutionStartedEventAttributes,
|
21
22
|
}
|
22
23
|
|
23
24
|
type Result<T, E = anyhow::Error> = std::result::Result<T, E>;
|
@@ -36,20 +37,18 @@ impl HistoryInfo {
|
|
36
37
|
let mut workflow_task_started_event_id = 0;
|
37
38
|
let mut wf_task_count = 0;
|
38
39
|
let mut history = events.iter().peekable();
|
39
|
-
|
40
|
-
let wf_type = match &events.get(0).unwrap().attributes {
|
40
|
+
let started_attrs = match &events.get(0).unwrap().attributes {
|
41
41
|
Some(history_event::Attributes::WorkflowExecutionStartedEventAttributes(attrs)) => {
|
42
|
-
attrs
|
43
|
-
.workflow_type
|
44
|
-
.as_ref()
|
45
|
-
.ok_or_else(|| {
|
46
|
-
anyhow!("No workflow type defined in execution started attributes")
|
47
|
-
})?
|
48
|
-
.name
|
49
|
-
.clone()
|
42
|
+
attrs.clone()
|
50
43
|
}
|
51
44
|
_ => bail!("First event in history was not workflow execution started!"),
|
52
45
|
};
|
46
|
+
let wf_type = started_attrs
|
47
|
+
.workflow_type
|
48
|
+
.as_ref()
|
49
|
+
.ok_or_else(|| anyhow!("No workflow type defined in execution started attributes"))?
|
50
|
+
.name
|
51
|
+
.clone();
|
53
52
|
|
54
53
|
let mut events = vec![];
|
55
54
|
while let Some(event) = history.next() {
|
@@ -87,6 +86,7 @@ impl HistoryInfo {
|
|
87
86
|
events,
|
88
87
|
wf_task_count,
|
89
88
|
wf_type,
|
89
|
+
wf_exe_started_attrs: started_attrs,
|
90
90
|
});
|
91
91
|
}
|
92
92
|
} else if next_event.is_some() && !next_is_failed_or_timeout_or_term {
|
@@ -108,6 +108,7 @@ impl HistoryInfo {
|
|
108
108
|
events,
|
109
109
|
wf_task_count,
|
110
110
|
wf_type,
|
111
|
+
wf_exe_started_attrs: started_attrs,
|
111
112
|
});
|
112
113
|
}
|
113
114
|
// No more events
|
@@ -135,16 +136,9 @@ impl HistoryInfo {
|
|
135
136
|
&self.events
|
136
137
|
}
|
137
138
|
|
138
|
-
///
|
139
|
-
/// started, it will panic.
|
139
|
+
/// Extract run id from the workflow execution started attributes.
|
140
140
|
pub fn orig_run_id(&self) -> &str {
|
141
|
-
|
142
|
-
&self.events[0].attributes
|
143
|
-
{
|
144
|
-
&wes.original_execution_run_id
|
145
|
-
} else {
|
146
|
-
panic!("First event is wrong type")
|
147
|
-
}
|
141
|
+
&self.wf_exe_started_attrs.original_execution_run_id
|
148
142
|
}
|
149
143
|
|
150
144
|
/// Return total workflow task count in this history
|
@@ -155,7 +149,7 @@ impl HistoryInfo {
|
|
155
149
|
/// Create a workflow task polling response containing all the events in this history and a
|
156
150
|
/// randomly generated task token. Caller should attach a meaningful `workflow_execution` if
|
157
151
|
/// needed.
|
158
|
-
pub fn as_poll_wft_response(&self
|
152
|
+
pub fn as_poll_wft_response(&self) -> PollWorkflowTaskQueueResponse {
|
159
153
|
let task_token: [u8; 16] = thread_rng().gen();
|
160
154
|
PollWorkflowTaskQueueResponse {
|
161
155
|
history: Some(History {
|
@@ -166,7 +160,13 @@ impl HistoryInfo {
|
|
166
160
|
name: self.wf_type.clone(),
|
167
161
|
}),
|
168
162
|
workflow_execution_task_queue: Some(TaskQueue {
|
169
|
-
name:
|
163
|
+
name: self
|
164
|
+
.wf_exe_started_attrs
|
165
|
+
.task_queue
|
166
|
+
.as_ref()
|
167
|
+
.unwrap()
|
168
|
+
.name
|
169
|
+
.clone(),
|
170
170
|
kind: TaskQueueKind::Normal as i32,
|
171
171
|
}),
|
172
172
|
previous_started_event_id: self.previous_started_event_id,
|