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
data/bridge/src/connection.rs
CHANGED
@@ -8,7 +8,9 @@ use temporal_client::{
|
|
8
8
|
ConfiguredClient, TemporalServiceClientWithMetrics
|
9
9
|
};
|
10
10
|
use thiserror::Error;
|
11
|
+
use tokio::{select};
|
11
12
|
use tokio::runtime::{Runtime};
|
13
|
+
use tokio_util::sync::CancellationToken;
|
12
14
|
use tonic::metadata::{MetadataKey,MetadataValue};
|
13
15
|
use url::Url;
|
14
16
|
|
@@ -42,13 +44,18 @@ pub enum ConnectionError {
|
|
42
44
|
|
43
45
|
#[error(transparent)]
|
44
46
|
RequestError(#[from] tonic::Status),
|
47
|
+
|
48
|
+
#[error("RPC call was cancelled")]
|
49
|
+
RequestCancelled,
|
45
50
|
}
|
46
51
|
|
52
|
+
pub type RpcResult = Result<Vec<u8>, ConnectionError>;
|
53
|
+
|
47
54
|
fn rpc_req<P: prost::Message + Default>(params: RpcParams) -> Result<tonic::Request<P>, ConnectionError> {
|
48
55
|
let proto = P::decode(&*params.request)?;
|
49
56
|
let mut req = tonic::Request::new(proto);
|
50
57
|
|
51
|
-
for (k, v) in params.metadata {
|
58
|
+
for (k, v) in ¶ms.metadata {
|
52
59
|
req.metadata_mut().insert(
|
53
60
|
MetadataKey::from_str(k.as_str())?,
|
54
61
|
MetadataValue::try_from(v.as_str())?
|
@@ -62,16 +69,77 @@ fn rpc_req<P: prost::Message + Default>(params: RpcParams) -> Result<tonic::Requ
|
|
62
69
|
Ok(req)
|
63
70
|
}
|
64
71
|
|
65
|
-
fn rpc_resp<P: prost::Message + Default>(res: Result<tonic::Response<P>, tonic::Status>) ->
|
72
|
+
fn rpc_resp<P: prost::Message + Default>(res: Result<tonic::Response<P>, tonic::Status>) -> RpcResult {
|
66
73
|
Ok(res?.get_ref().encode_to_vec())
|
67
74
|
}
|
68
75
|
|
69
76
|
macro_rules! rpc_call {
|
70
|
-
($client:expr, $
|
71
|
-
rpc_resp($
|
77
|
+
($client:expr, $rpc:ident, $params:expr) => {
|
78
|
+
rpc_resp($client.$rpc(rpc_req($params)?).await)
|
72
79
|
};
|
73
80
|
}
|
74
81
|
|
82
|
+
async fn make_rpc_call(mut client: Client, params: RpcParams) -> RpcResult {
|
83
|
+
match params.rpc.as_str() {
|
84
|
+
"register_namespace" => rpc_call!(client, register_namespace, params),
|
85
|
+
"describe_namespace" => rpc_call!(client, describe_namespace, params),
|
86
|
+
"list_namespaces" => rpc_call!(client, list_namespaces, params),
|
87
|
+
"update_namespace" => rpc_call!(client, update_namespace, params),
|
88
|
+
"deprecate_namespace" => rpc_call!(client, deprecate_namespace, params),
|
89
|
+
"start_workflow_execution" => rpc_call!(client, start_workflow_execution, params),
|
90
|
+
"get_workflow_execution_history" => rpc_call!(client, get_workflow_execution_history, params),
|
91
|
+
// "get_workflow_execution_history_reverse" => rpc_call!(client, get_workflow_execution_history_reverse, params),
|
92
|
+
"poll_workflow_task_queue" => rpc_call!(client, poll_workflow_task_queue, params),
|
93
|
+
"respond_workflow_task_completed" => rpc_call!(client, respond_workflow_task_completed, params),
|
94
|
+
"respond_workflow_task_failed" => rpc_call!(client, respond_workflow_task_failed, params),
|
95
|
+
"poll_activity_task_queue" => rpc_call!(client, poll_activity_task_queue, params),
|
96
|
+
"record_activity_task_heartbeat" => rpc_call!(client, record_activity_task_heartbeat, params),
|
97
|
+
"record_activity_task_heartbeat_by_id" => rpc_call!(client, record_activity_task_heartbeat_by_id, params),
|
98
|
+
"respond_activity_task_completed" => rpc_call!(client, respond_activity_task_completed, params),
|
99
|
+
"respond_activity_task_completed_by_id" => rpc_call!(client, respond_activity_task_completed_by_id, params),
|
100
|
+
"respond_activity_task_failed" => rpc_call!(client, respond_activity_task_failed, params),
|
101
|
+
"respond_activity_task_failed_by_id" => rpc_call!(client, respond_activity_task_failed_by_id, params),
|
102
|
+
"respond_activity_task_canceled" => rpc_call!(client, respond_activity_task_canceled, params),
|
103
|
+
"respond_activity_task_canceled_by_id" => rpc_call!(client, respond_activity_task_canceled_by_id, params),
|
104
|
+
"request_cancel_workflow_execution" => rpc_call!(client, request_cancel_workflow_execution, params),
|
105
|
+
"signal_workflow_execution" => rpc_call!(client, signal_workflow_execution, params),
|
106
|
+
"signal_with_start_workflow_execution" => rpc_call!(client, signal_with_start_workflow_execution, params),
|
107
|
+
"reset_workflow_execution" => rpc_call!(client, reset_workflow_execution, params),
|
108
|
+
"terminate_workflow_execution" => rpc_call!(client, terminate_workflow_execution, params),
|
109
|
+
"delete_workflow_execution" => rpc_call!(client, delete_workflow_execution, params),
|
110
|
+
"list_open_workflow_executions" => rpc_call!(client, list_open_workflow_executions, params),
|
111
|
+
"list_closed_workflow_executions" => rpc_call!(client, list_closed_workflow_executions, params),
|
112
|
+
"list_workflow_executions" => rpc_call!(client, list_workflow_executions, params),
|
113
|
+
"list_archived_workflow_executions" => rpc_call!(client, list_archived_workflow_executions, params),
|
114
|
+
"scan_workflow_executions" => rpc_call!(client, scan_workflow_executions, params),
|
115
|
+
"count_workflow_executions" => rpc_call!(client, count_workflow_executions, params),
|
116
|
+
"get_search_attributes" => rpc_call!(client, get_search_attributes, params),
|
117
|
+
"respond_query_task_completed" => rpc_call!(client, respond_query_task_completed, params),
|
118
|
+
"reset_sticky_task_queue" => rpc_call!(client, reset_sticky_task_queue, params),
|
119
|
+
"query_workflow" => rpc_call!(client, query_workflow, params),
|
120
|
+
"describe_workflow_execution" => rpc_call!(client, describe_workflow_execution, params),
|
121
|
+
"describe_task_queue" => rpc_call!(client, describe_task_queue, params),
|
122
|
+
"get_cluster_info" => rpc_call!(client, get_cluster_info, params),
|
123
|
+
"get_system_info" => rpc_call!(client, get_system_info, params),
|
124
|
+
"list_task_queue_partitions" => rpc_call!(client, list_task_queue_partitions, params),
|
125
|
+
"create_schedule" => rpc_call!(client, create_schedule, params),
|
126
|
+
"describe_schedule" => rpc_call!(client, describe_schedule, params),
|
127
|
+
"update_schedule" => rpc_call!(client, update_schedule, params),
|
128
|
+
"patch_schedule" => rpc_call!(client, patch_schedule, params),
|
129
|
+
"list_schedule_matching_times" => rpc_call!(client, list_schedule_matching_times, params),
|
130
|
+
"delete_schedule" => rpc_call!(client, delete_schedule, params),
|
131
|
+
"list_schedules" => rpc_call!(client, list_schedules, params),
|
132
|
+
"update_worker_build_id_ordering" => rpc_call!(client, update_worker_build_id_ordering, params),
|
133
|
+
"get_worker_build_id_ordering" => rpc_call!(client, get_worker_build_id_ordering, params),
|
134
|
+
"update_workflow" => rpc_call!(client, update_workflow, params),
|
135
|
+
"start_batch_operation" => rpc_call!(client, start_batch_operation, params),
|
136
|
+
"stop_batch_operation" => rpc_call!(client, stop_batch_operation, params),
|
137
|
+
"describe_batch_operation" => rpc_call!(client, describe_batch_operation, params),
|
138
|
+
"list_batch_operations" => rpc_call!(client, list_batch_operations, params),
|
139
|
+
_ => Err(ConnectionError::InvalidRpc(params.rpc.to_string()))
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
75
143
|
// A Connection is a Client wrapper for making RPC calls
|
76
144
|
pub struct Connection {
|
77
145
|
pub client: Client,
|
@@ -105,63 +173,14 @@ impl Connection {
|
|
105
173
|
Ok(Connection { client, runtime })
|
106
174
|
}
|
107
175
|
|
108
|
-
pub fn call(&
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
// "get_workflow_execution_history_reverse" => rpc_call!(self.client, self.runtime, get_workflow_execution_history_reverse, params),
|
118
|
-
"poll_workflow_task_queue" => rpc_call!(self.client, self.runtime, poll_workflow_task_queue, params),
|
119
|
-
"respond_workflow_task_completed" => rpc_call!(self.client, self.runtime, respond_workflow_task_completed, params),
|
120
|
-
"respond_workflow_task_failed" => rpc_call!(self.client, self.runtime, respond_workflow_task_failed, params),
|
121
|
-
"poll_activity_task_queue" => rpc_call!(self.client, self.runtime, poll_activity_task_queue, params),
|
122
|
-
"record_activity_task_heartbeat" => rpc_call!(self.client, self.runtime, record_activity_task_heartbeat, params),
|
123
|
-
"record_activity_task_heartbeat_by_id" => rpc_call!(self.client, self.runtime, record_activity_task_heartbeat_by_id, params),
|
124
|
-
"respond_activity_task_completed" => rpc_call!(self.client, self.runtime, respond_activity_task_completed, params),
|
125
|
-
"respond_activity_task_completed_by_id" => rpc_call!(self.client, self.runtime, respond_activity_task_completed_by_id, params),
|
126
|
-
"respond_activity_task_failed" => rpc_call!(self.client, self.runtime, respond_activity_task_failed, params),
|
127
|
-
"respond_activity_task_failed_by_id" => rpc_call!(self.client, self.runtime, respond_activity_task_failed_by_id, params),
|
128
|
-
"respond_activity_task_canceled" => rpc_call!(self.client, self.runtime, respond_activity_task_canceled, params),
|
129
|
-
"respond_activity_task_canceled_by_id" => rpc_call!(self.client, self.runtime, respond_activity_task_canceled_by_id, params),
|
130
|
-
"request_cancel_workflow_execution" => rpc_call!(self.client, self.runtime, request_cancel_workflow_execution, params),
|
131
|
-
"signal_workflow_execution" => rpc_call!(self.client, self.runtime, signal_workflow_execution, params),
|
132
|
-
"signal_with_start_workflow_execution" => rpc_call!(self.client, self.runtime, signal_with_start_workflow_execution, params),
|
133
|
-
"reset_workflow_execution" => rpc_call!(self.client, self.runtime, reset_workflow_execution, params),
|
134
|
-
"terminate_workflow_execution" => rpc_call!(self.client, self.runtime, terminate_workflow_execution, params),
|
135
|
-
"list_open_workflow_executions" => rpc_call!(self.client, self.runtime, list_open_workflow_executions, params),
|
136
|
-
"list_closed_workflow_executions" => rpc_call!(self.client, self.runtime, list_closed_workflow_executions, params),
|
137
|
-
"list_workflow_executions" => rpc_call!(self.client, self.runtime, list_workflow_executions, params),
|
138
|
-
"list_archived_workflow_executions" => rpc_call!(self.client, self.runtime, list_archived_workflow_executions, params),
|
139
|
-
"scan_workflow_executions" => rpc_call!(self.client, self.runtime, scan_workflow_executions, params),
|
140
|
-
"count_workflow_executions" => rpc_call!(self.client, self.runtime, count_workflow_executions, params),
|
141
|
-
"get_search_attributes" => rpc_call!(self.client, self.runtime, get_search_attributes, params),
|
142
|
-
"respond_query_task_completed" => rpc_call!(self.client, self.runtime, respond_query_task_completed, params),
|
143
|
-
"reset_sticky_task_queue" => rpc_call!(self.client, self.runtime, reset_sticky_task_queue, params),
|
144
|
-
"query_workflow" => rpc_call!(self.client, self.runtime, query_workflow, params),
|
145
|
-
"describe_workflow_execution" => rpc_call!(self.client, self.runtime, describe_workflow_execution, params),
|
146
|
-
"describe_task_queue" => rpc_call!(self.client, self.runtime, describe_task_queue, params),
|
147
|
-
"get_cluster_info" => rpc_call!(self.client, self.runtime, get_cluster_info, params),
|
148
|
-
"get_system_info" => rpc_call!(self.client, self.runtime, get_system_info, params),
|
149
|
-
"list_task_queue_partitions" => rpc_call!(self.client, self.runtime, list_task_queue_partitions, params),
|
150
|
-
"create_schedule" => rpc_call!(self.client, self.runtime, create_schedule, params),
|
151
|
-
"describe_schedule" => rpc_call!(self.client, self.runtime, describe_schedule, params),
|
152
|
-
"update_schedule" => rpc_call!(self.client, self.runtime, update_schedule, params),
|
153
|
-
"patch_schedule" => rpc_call!(self.client, self.runtime, patch_schedule, params),
|
154
|
-
"list_schedule_matching_times" => rpc_call!(self.client, self.runtime, list_schedule_matching_times, params),
|
155
|
-
"delete_schedule" => rpc_call!(self.client, self.runtime, delete_schedule, params),
|
156
|
-
"list_schedules" => rpc_call!(self.client, self.runtime, list_schedules, params),
|
157
|
-
"update_worker_build_id_ordering" => rpc_call!(self.client, self.runtime, update_worker_build_id_ordering, params),
|
158
|
-
"get_worker_build_id_ordering" => rpc_call!(self.client, self.runtime, get_worker_build_id_ordering, params),
|
159
|
-
"update_workflow" => rpc_call!(self.client, self.runtime, update_workflow, params),
|
160
|
-
"start_batch_operation" => rpc_call!(self.client, self.runtime, start_batch_operation, params),
|
161
|
-
"stop_batch_operation" => rpc_call!(self.client, self.runtime, stop_batch_operation, params),
|
162
|
-
"describe_batch_operation" => rpc_call!(self.client, self.runtime, describe_batch_operation, params),
|
163
|
-
"list_batch_operations" => rpc_call!(self.client, self.runtime, list_batch_operations, params),
|
164
|
-
_ => Err(ConnectionError::InvalidRpc(params.rpc.to_string()))
|
165
|
-
}
|
176
|
+
pub fn call(&self, params: RpcParams, cancel_token: CancellationToken) -> RpcResult {
|
177
|
+
let core_client = self.client.clone();
|
178
|
+
|
179
|
+
self.runtime.block_on(async move {
|
180
|
+
select! {
|
181
|
+
_ = cancel_token.cancelled() => Err(ConnectionError::RequestCancelled),
|
182
|
+
result = make_rpc_call(core_client, params) => result
|
183
|
+
}
|
184
|
+
})
|
166
185
|
}
|
167
186
|
}
|
data/bridge/src/lib.rs
CHANGED
@@ -13,18 +13,34 @@ use rutie::{
|
|
13
13
|
NilClass, Hash, Integer,
|
14
14
|
};
|
15
15
|
use std::collections::HashMap;
|
16
|
-
use
|
17
|
-
use
|
16
|
+
use temporal_sdk_core_api::telemetry::{Logger, TelemetryOptionsBuilder};
|
17
|
+
use tokio_util::sync::CancellationToken;
|
18
|
+
use worker::{Worker, WorkerError, WorkerResult};
|
18
19
|
|
19
20
|
const RUNTIME_THREAD_COUNT: u8 = 2;
|
20
21
|
|
21
22
|
fn raise_bridge_exception(message: &str) {
|
22
|
-
VM::raise_ex(AnyException::new("
|
23
|
+
VM::raise_ex(AnyException::new("Temporalio::Bridge::Error", Some(message)));
|
23
24
|
}
|
24
25
|
|
25
|
-
fn
|
26
|
+
fn wrap_worker_error(e: &WorkerError) -> AnyException {
|
27
|
+
let name = match e {
|
28
|
+
WorkerError::Shutdown() => "Temporalio::Bridge::Error::WorkerShutdown",
|
29
|
+
_ => "Temporalio::Bridge::Error"
|
30
|
+
};
|
31
|
+
|
32
|
+
AnyException::new(name, Some(&format!("[{:?}] {}", e, e)))
|
33
|
+
}
|
34
|
+
|
35
|
+
fn wrap_bytes(bytes: Vec<u8>) -> RString {
|
26
36
|
let enc = Encoding::find("ASCII-8BIT").unwrap();
|
27
|
-
RString::from_bytes(bytes, &enc)
|
37
|
+
RString::from_bytes(&bytes, &enc)
|
38
|
+
}
|
39
|
+
|
40
|
+
fn unwrap_bytes(string: RString) -> Vec<u8> {
|
41
|
+
// It is important to use the _unchecked conversion, otherwise Rutie
|
42
|
+
// will assume incorrect encoding and screw up the encoded proto
|
43
|
+
string.to_vec_u8_unchecked()
|
28
44
|
}
|
29
45
|
|
30
46
|
fn to_hash_map(hash: Hash) -> HashMap<String, String> {
|
@@ -40,6 +56,14 @@ fn to_hash_map(hash: Hash) -> HashMap<String, String> {
|
|
40
56
|
result
|
41
57
|
}
|
42
58
|
|
59
|
+
fn worker_result_to_proc_args(result: WorkerResult) -> [AnyObject; 2] {
|
60
|
+
let ruby_nil = NilClass::new().to_any_object();
|
61
|
+
match result {
|
62
|
+
Ok(bytes) => [wrap_bytes(bytes).to_any_object(), ruby_nil],
|
63
|
+
Err(e) => [ruby_nil, wrap_worker_error(&e).to_any_object()]
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
43
67
|
wrappable_struct!(Connection, ConnectionWrapper, CONNECTION_WRAPPER);
|
44
68
|
wrappable_struct!(Runtime, RuntimeWrapper, RUNTIME_WRAPPER);
|
45
69
|
wrappable_struct!(Worker, WorkerWrapper, WORKER_WRAPPER);
|
@@ -61,7 +85,7 @@ methods!(
|
|
61
85
|
|
62
86
|
let connection = result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
|
63
87
|
|
64
|
-
Module::from_existing("
|
88
|
+
Module::from_existing("Temporalio")
|
65
89
|
.get_nested_module("Bridge")
|
66
90
|
.get_nested_class("Connection")
|
67
91
|
.wrap_data(connection, &*CONNECTION_WRAPPER)
|
@@ -69,11 +93,12 @@ methods!(
|
|
69
93
|
|
70
94
|
fn call_rpc(rpc: Symbol, request: RString, metadata: Hash, timeout: Integer) -> RString {
|
71
95
|
let rpc = rpc.map_err(VM::raise_ex).unwrap().to_string();
|
72
|
-
let request = request.map_err(VM::raise_ex).unwrap()
|
96
|
+
let request = unwrap_bytes(request.map_err(VM::raise_ex).unwrap());
|
73
97
|
let metadata = to_hash_map(metadata.map_err(VM::raise_ex).unwrap());
|
74
98
|
let timeout = timeout.map_or(None, |v| Some(v.to_u64()));
|
99
|
+
let token = CancellationToken::new();
|
75
100
|
|
76
|
-
let result = Thread::call_without_gvl(
|
101
|
+
let result = Thread::call_without_gvl(|| {
|
77
102
|
let connection = _rtself.get_data_mut(&*CONNECTION_WRAPPER);
|
78
103
|
let params = RpcParams {
|
79
104
|
rpc: rpc.clone(),
|
@@ -81,34 +106,24 @@ methods!(
|
|
81
106
|
metadata: metadata.clone(),
|
82
107
|
timeout_millis: timeout
|
83
108
|
};
|
84
|
-
connection.call(params)
|
85
|
-
}, Some(|| {}));
|
109
|
+
connection.call(params, token.clone())
|
110
|
+
}, Some(|| { token.cancel() }));
|
86
111
|
|
87
112
|
let response = result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
|
88
113
|
|
89
|
-
|
90
|
-
RString::from_bytes(&response, &enc)
|
114
|
+
wrap_bytes(response)
|
91
115
|
}
|
92
116
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
.tracing_filter("temporal_sdk_core=DEBUG".to_string())
|
97
|
-
.logging(Logger::Console)
|
117
|
+
fn init_runtime() -> AnyObject {
|
118
|
+
let telemetry_options = TelemetryOptionsBuilder::default()
|
119
|
+
.logging(Logger::Console { filter: "temporal_sdk_core=DEBUG".to_string() })
|
98
120
|
.build()
|
99
121
|
.map_err(|e| raise_bridge_exception(&e.to_string()))
|
100
122
|
.unwrap();
|
101
123
|
|
102
|
-
|
103
|
-
.expect("Unable to initialize telemetry");
|
124
|
+
let runtime = Runtime::new(RUNTIME_THREAD_COUNT, telemetry_options);
|
104
125
|
|
105
|
-
|
106
|
-
}
|
107
|
-
|
108
|
-
fn init_runtime() -> AnyObject {
|
109
|
-
let runtime = Runtime::new(RUNTIME_THREAD_COUNT);
|
110
|
-
|
111
|
-
Module::from_existing("Temporal")
|
126
|
+
Module::from_existing("Temporalio")
|
112
127
|
.get_nested_module("Bridge")
|
113
128
|
.get_nested_class("Runtime")
|
114
129
|
.wrap_data(runtime, &*RUNTIME_WRAPPER)
|
@@ -130,7 +145,7 @@ methods!(
|
|
130
145
|
let connection = connection.get_data(&*CONNECTION_WRAPPER);
|
131
146
|
let worker = Worker::new(runtime, &connection.client, &namespace, &task_queue);
|
132
147
|
|
133
|
-
Module::from_existing("
|
148
|
+
Module::from_existing("Temporalio")
|
134
149
|
.get_nested_module("Bridge")
|
135
150
|
.get_nested_class("Worker")
|
136
151
|
.wrap_data(worker.unwrap(), &*WORKER_WRAPPER)
|
@@ -142,10 +157,8 @@ methods!(
|
|
142
157
|
}
|
143
158
|
|
144
159
|
let ruby_callback = VM::block_proc();
|
145
|
-
|
146
160
|
let callback = move |result: WorkerResult| {
|
147
|
-
|
148
|
-
ruby_callback.call(&[wrap_bytes(&bytes)]);
|
161
|
+
ruby_callback.call(&worker_result_to_proc_args(result));
|
149
162
|
};
|
150
163
|
|
151
164
|
let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
|
@@ -155,13 +168,55 @@ methods!(
|
|
155
168
|
|
156
169
|
NilClass::new()
|
157
170
|
}
|
171
|
+
|
172
|
+
fn worker_complete_activity_task(proto: RString) -> NilClass {
|
173
|
+
if !VM::is_block_given() {
|
174
|
+
panic!("Called #worker_complete_activity_task without a block");
|
175
|
+
}
|
176
|
+
|
177
|
+
let bytes = unwrap_bytes(proto.map_err(VM::raise_ex).unwrap());
|
178
|
+
let ruby_callback = VM::block_proc();
|
179
|
+
let callback = move |result: WorkerResult| {
|
180
|
+
ruby_callback.call(&worker_result_to_proc_args(result));
|
181
|
+
};
|
182
|
+
|
183
|
+
let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
|
184
|
+
let result = worker.complete_activity_task(bytes, callback);
|
185
|
+
|
186
|
+
result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
|
187
|
+
|
188
|
+
NilClass::new()
|
189
|
+
}
|
190
|
+
|
191
|
+
fn worker_record_activity_heartbeat(proto: RString) -> NilClass {
|
192
|
+
let bytes = unwrap_bytes(proto.map_err(VM::raise_ex).unwrap());
|
193
|
+
let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
|
194
|
+
|
195
|
+
let result = worker.record_activity_heartbeat(bytes);
|
196
|
+
|
197
|
+
result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
|
198
|
+
|
199
|
+
NilClass::new()
|
200
|
+
}
|
201
|
+
|
202
|
+
fn worker_initiate_shutdown() -> NilClass {
|
203
|
+
let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
|
204
|
+
worker.initiate_shutdown();
|
205
|
+
|
206
|
+
NilClass::new()
|
207
|
+
}
|
208
|
+
|
209
|
+
fn worker_shutdown() -> NilClass {
|
210
|
+
let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
|
211
|
+
worker.shutdown();
|
212
|
+
|
213
|
+
NilClass::new()
|
214
|
+
}
|
158
215
|
);
|
159
216
|
|
160
217
|
#[no_mangle]
|
161
218
|
pub extern "C" fn init_bridge() {
|
162
|
-
Module::from_existing("
|
163
|
-
module.def_self("init_telemetry", init_telemetry);
|
164
|
-
|
219
|
+
Module::from_existing("Temporalio").get_nested_module("Bridge").define(|module| {
|
165
220
|
module.define_nested_class("Runtime", None).define(|klass| {
|
166
221
|
klass.def_self("init", init_runtime);
|
167
222
|
klass.def("run_callback_loop", run_callback_loop);
|
@@ -175,6 +230,10 @@ pub extern "C" fn init_bridge() {
|
|
175
230
|
module.define_nested_class("Worker", None).define(|klass| {
|
176
231
|
klass.def_self("create", create_worker);
|
177
232
|
klass.def("poll_activity_task", worker_poll_activity_task);
|
233
|
+
klass.def("complete_activity_task", worker_complete_activity_task);
|
234
|
+
klass.def("record_activity_heartbeat", worker_record_activity_heartbeat);
|
235
|
+
klass.def("initiate_shutdown", worker_initiate_shutdown);
|
236
|
+
klass.def("shutdown", worker_shutdown);
|
178
237
|
});
|
179
238
|
});
|
180
239
|
}
|
data/bridge/src/runtime.rs
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
use rutie::Thread;
|
2
2
|
use std::sync::Arc;
|
3
3
|
use std::sync::mpsc::{channel, Sender, Receiver};
|
4
|
+
use temporal_sdk_core::CoreRuntime;
|
5
|
+
use temporal_sdk_core_api::telemetry::TelemetryOptions;
|
4
6
|
use tokio::runtime::{Builder, Runtime as TokioRuntime};
|
5
7
|
|
6
8
|
pub type Callback = Box<dyn FnOnce() + Send + 'static>;
|
@@ -11,13 +13,14 @@ pub enum Command {
|
|
11
13
|
}
|
12
14
|
|
13
15
|
pub struct Runtime {
|
16
|
+
pub core_runtime: Arc<CoreRuntime>,
|
14
17
|
pub tokio_runtime: Arc<TokioRuntime>,
|
15
18
|
pub callback_tx: Sender<Command>,
|
16
19
|
callback_rx: Receiver<Command>,
|
17
20
|
}
|
18
21
|
|
19
22
|
impl Runtime {
|
20
|
-
pub fn new(thread_count: u8) -> Self {
|
23
|
+
pub fn new(thread_count: u8, telemetry_options: TelemetryOptions) -> Self {
|
21
24
|
let (tx, rx): (Sender<Command>, Receiver<Command>) = channel();
|
22
25
|
let tokio_runtime = Arc::new(
|
23
26
|
Builder::new_multi_thread()
|
@@ -27,8 +30,12 @@ impl Runtime {
|
|
27
30
|
.build()
|
28
31
|
.expect("Unable to start a runtime")
|
29
32
|
);
|
33
|
+
let core_runtime = Arc::new(
|
34
|
+
CoreRuntime::new(telemetry_options, Builder::new_multi_thread())
|
35
|
+
.expect("Failed to initialize Core telemetry")
|
36
|
+
);
|
30
37
|
|
31
|
-
Runtime { tokio_runtime, callback_tx: tx, callback_rx: rx }
|
38
|
+
Runtime { core_runtime, tokio_runtime, callback_tx: tx, callback_rx: rx }
|
32
39
|
}
|
33
40
|
|
34
41
|
// This function is expected to be called from a Ruby thread
|
data/bridge/src/worker.rs
CHANGED
@@ -4,7 +4,9 @@ use prost::Message;
|
|
4
4
|
use std::sync::Arc;
|
5
5
|
use std::sync::mpsc::Sender;
|
6
6
|
use temporal_sdk_core::api::{Worker as WorkerTrait};
|
7
|
+
use temporal_sdk_core_api::errors::{PollActivityError};
|
7
8
|
use temporal_sdk_core_api::worker::{WorkerConfigBuilder, WorkerConfigBuilderError};
|
9
|
+
use temporal_sdk_core_protos::coresdk::{ActivityHeartbeat, ActivityTaskCompletion};
|
8
10
|
use thiserror::Error;
|
9
11
|
use tokio::runtime::{Runtime as TokioRuntime};
|
10
12
|
|
@@ -13,14 +15,23 @@ pub enum WorkerError {
|
|
13
15
|
#[error(transparent)]
|
14
16
|
EncodeError(#[from] prost::EncodeError),
|
15
17
|
|
18
|
+
#[error(transparent)]
|
19
|
+
DecodeError(#[from] prost::DecodeError),
|
20
|
+
|
16
21
|
#[error(transparent)]
|
17
22
|
InvalidWorkerOptions(#[from] WorkerConfigBuilderError),
|
18
23
|
|
19
24
|
#[error(transparent)]
|
20
25
|
UnableToPollActivityTask(#[from] temporal_sdk_core::api::errors::PollActivityError),
|
21
26
|
|
27
|
+
#[error(transparent)]
|
28
|
+
UnableToCompleteActivityTask(#[from] temporal_sdk_core::api::errors::CompleteActivityError),
|
29
|
+
|
22
30
|
#[error("Unable to send a request. Channel is closed")]
|
23
31
|
ChannelClosed(),
|
32
|
+
|
33
|
+
#[error("Core worker is shutting down")]
|
34
|
+
Shutdown(),
|
24
35
|
}
|
25
36
|
|
26
37
|
pub type WorkerResult = Result<Vec<u8>, WorkerError>;
|
@@ -37,11 +48,12 @@ impl Worker {
|
|
37
48
|
let config = WorkerConfigBuilder::default()
|
38
49
|
.namespace(namespace)
|
39
50
|
.task_queue(task_queue)
|
51
|
+
.worker_build_id("test-worker-build") // TODO: replace this with an actual build id
|
40
52
|
.build()?;
|
41
53
|
|
42
54
|
let core_worker = runtime.tokio_runtime.block_on(async move {
|
43
|
-
temporal_sdk_core::init_worker(config, client.clone())
|
44
|
-
});
|
55
|
+
temporal_sdk_core::init_worker(&runtime.core_runtime, config, client.clone())
|
56
|
+
}).expect("Failed to initialize Core Worker");
|
45
57
|
|
46
58
|
Ok(Worker {
|
47
59
|
core_worker: Arc::new(core_worker),
|
@@ -62,6 +74,7 @@ impl Worker {
|
|
62
74
|
let bytes = task.encode_to_vec();
|
63
75
|
Box::new(move || callback(Ok(bytes)))
|
64
76
|
},
|
77
|
+
Err(PollActivityError::ShutDown) => Box::new(move || callback(Err(WorkerError::Shutdown()))),
|
65
78
|
Err(e) => Box::new(move || callback(Err(WorkerError::UnableToPollActivityTask(e))))
|
66
79
|
};
|
67
80
|
|
@@ -70,4 +83,42 @@ impl Worker {
|
|
70
83
|
|
71
84
|
Ok(())
|
72
85
|
}
|
86
|
+
|
87
|
+
pub fn complete_activity_task<F>(&self, bytes: Vec<u8>, callback: F) -> Result<(), WorkerError> where F: FnOnce(WorkerResult) + Send + 'static {
|
88
|
+
let core_worker = self.core_worker.clone();
|
89
|
+
let callback_tx = self.callback_tx.clone();
|
90
|
+
let proto = ActivityTaskCompletion::decode(&*bytes)?;
|
91
|
+
|
92
|
+
self.tokio_runtime.spawn(async move {
|
93
|
+
let result = core_worker.complete_activity_task(proto).await;
|
94
|
+
|
95
|
+
let callback: Callback = match result {
|
96
|
+
Ok(()) => Box::new(move || callback(Ok(vec!()))),
|
97
|
+
Err(e) => Box::new(move || callback(Err(WorkerError::UnableToCompleteActivityTask(e))))
|
98
|
+
};
|
99
|
+
|
100
|
+
callback_tx.send(Command::RunCallback(callback)).expect("Unable to send a callback");
|
101
|
+
});
|
102
|
+
|
103
|
+
Ok(())
|
104
|
+
}
|
105
|
+
|
106
|
+
pub fn record_activity_heartbeat(&self, bytes: Vec<u8>) -> Result<(), WorkerError> {
|
107
|
+
let proto = ActivityHeartbeat::decode(&*bytes)?;
|
108
|
+
self.core_worker.record_activity_heartbeat(proto);
|
109
|
+
|
110
|
+
Ok(())
|
111
|
+
}
|
112
|
+
|
113
|
+
pub fn initiate_shutdown(&self) {
|
114
|
+
self.core_worker.initiate_shutdown();
|
115
|
+
}
|
116
|
+
|
117
|
+
pub fn shutdown(&self) {
|
118
|
+
let core_worker = self.core_worker.clone();
|
119
|
+
|
120
|
+
self.tokio_runtime.block_on(async move {
|
121
|
+
core_worker.shutdown().await;
|
122
|
+
});
|
123
|
+
}
|
73
124
|
}
|
data/lib/bridge.so
CHANGED
Binary file
|
@@ -17,9 +17,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
17
17
|
optional :close_time, :message, 4, "google.protobuf.Timestamp"
|
18
18
|
end
|
19
19
|
add_message "temporal.api.batch.v1.BatchOperationTermination" do
|
20
|
-
optional :
|
21
|
-
optional :
|
22
|
-
optional :identity, :string, 3
|
20
|
+
optional :details, :message, 1, "temporal.api.common.v1.Payloads"
|
21
|
+
optional :identity, :string, 2
|
23
22
|
end
|
24
23
|
add_message "temporal.api.batch.v1.BatchOperationSignal" do
|
25
24
|
optional :signal, :string, 1
|
@@ -28,13 +27,15 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
28
27
|
optional :identity, :string, 4
|
29
28
|
end
|
30
29
|
add_message "temporal.api.batch.v1.BatchOperationCancellation" do
|
31
|
-
optional :
|
32
|
-
|
30
|
+
optional :identity, :string, 1
|
31
|
+
end
|
32
|
+
add_message "temporal.api.batch.v1.BatchOperationDeletion" do
|
33
|
+
optional :identity, :string, 1
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
module
|
38
|
+
module Temporalio
|
38
39
|
module Api
|
39
40
|
module Batch
|
40
41
|
module V1
|
@@ -42,6 +43,7 @@ module Temporal
|
|
42
43
|
BatchOperationTermination = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationTermination").msgclass
|
43
44
|
BatchOperationSignal = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationSignal").msgclass
|
44
45
|
BatchOperationCancellation = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationCancellation").msgclass
|
46
|
+
BatchOperationDeletion = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationDeletion").msgclass
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -7,9 +7,9 @@ require 'google/protobuf/duration_pb'
|
|
7
7
|
require 'dependencies/gogoproto/gogo_pb'
|
8
8
|
require 'temporal/api/enums/v1/workflow_pb'
|
9
9
|
require 'temporal/api/enums/v1/command_type_pb'
|
10
|
-
require 'temporal/api/enums/v1/update_pb'
|
11
10
|
require 'temporal/api/common/v1/message_pb'
|
12
11
|
require 'temporal/api/failure/v1/message_pb'
|
12
|
+
require 'temporal/api/interaction/v1/message_pb'
|
13
13
|
require 'temporal/api/taskqueue/v1/message_pb'
|
14
14
|
|
15
15
|
Google::Protobuf::DescriptorPool.generated_pool.build do
|
@@ -66,6 +66,9 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
66
66
|
add_message "temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributes" do
|
67
67
|
optional :search_attributes, :message, 1, "temporal.api.common.v1.SearchAttributes"
|
68
68
|
end
|
69
|
+
add_message "temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributes" do
|
70
|
+
optional :upserted_memo, :message, 1, "temporal.api.common.v1.Memo"
|
71
|
+
end
|
69
72
|
add_message "temporal.api.command.v1.RecordMarkerCommandAttributes" do
|
70
73
|
optional :marker_name, :string, 1
|
71
74
|
map :details, :string, :message, 2, "temporal.api.common.v1.Payloads"
|
@@ -107,15 +110,16 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
107
110
|
optional :search_attributes, :message, 16, "temporal.api.common.v1.SearchAttributes"
|
108
111
|
end
|
109
112
|
add_message "temporal.api.command.v1.AcceptWorkflowUpdateCommandAttributes" do
|
110
|
-
optional :
|
113
|
+
optional :meta, :message, 1, "temporal.api.interaction.v1.Meta"
|
114
|
+
optional :input, :message, 2, "temporal.api.interaction.v1.Input"
|
111
115
|
end
|
112
116
|
add_message "temporal.api.command.v1.CompleteWorkflowUpdateCommandAttributes" do
|
113
|
-
optional :
|
114
|
-
optional :
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
117
|
+
optional :meta, :message, 1, "temporal.api.interaction.v1.Meta"
|
118
|
+
optional :output, :message, 2, "temporal.api.interaction.v1.Output"
|
119
|
+
end
|
120
|
+
add_message "temporal.api.command.v1.RejectWorkflowUpdateCommandAttributes" do
|
121
|
+
optional :meta, :message, 1, "temporal.api.interaction.v1.Meta"
|
122
|
+
optional :failure, :message, 2, "temporal.api.failure.v1.Failure"
|
119
123
|
end
|
120
124
|
add_message "temporal.api.command.v1.Command" do
|
121
125
|
optional :command_type, :enum, 1, "temporal.api.enums.v1.CommandType"
|
@@ -135,12 +139,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
135
139
|
optional :upsert_workflow_search_attributes_command_attributes, :message, 14, "temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributes"
|
136
140
|
optional :accept_workflow_update_command_attributes, :message, 15, "temporal.api.command.v1.AcceptWorkflowUpdateCommandAttributes"
|
137
141
|
optional :complete_workflow_update_command_attributes, :message, 16, "temporal.api.command.v1.CompleteWorkflowUpdateCommandAttributes"
|
142
|
+
optional :modify_workflow_properties_command_attributes, :message, 17, "temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributes"
|
143
|
+
optional :reject_workflow_update_command_attributes, :message, 18, "temporal.api.command.v1.RejectWorkflowUpdateCommandAttributes"
|
138
144
|
end
|
139
145
|
end
|
140
146
|
end
|
141
147
|
end
|
142
148
|
|
143
|
-
module
|
149
|
+
module Temporalio
|
144
150
|
module Api
|
145
151
|
module Command
|
146
152
|
module V1
|
@@ -154,11 +160,13 @@ module Temporal
|
|
154
160
|
RequestCancelExternalWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributes").msgclass
|
155
161
|
SignalExternalWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributes").msgclass
|
156
162
|
UpsertWorkflowSearchAttributesCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributes").msgclass
|
163
|
+
ModifyWorkflowPropertiesCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributes").msgclass
|
157
164
|
RecordMarkerCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.RecordMarkerCommandAttributes").msgclass
|
158
165
|
ContinueAsNewWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributes").msgclass
|
159
166
|
StartChildWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributes").msgclass
|
160
167
|
AcceptWorkflowUpdateCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.AcceptWorkflowUpdateCommandAttributes").msgclass
|
161
168
|
CompleteWorkflowUpdateCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.CompleteWorkflowUpdateCommandAttributes").msgclass
|
169
|
+
RejectWorkflowUpdateCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.RejectWorkflowUpdateCommandAttributes").msgclass
|
162
170
|
Command = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.Command").msgclass
|
163
171
|
end
|
164
172
|
end
|