temporalio 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +175 -4
  3. data/bridge/Cargo.lock +44 -21
  4. data/bridge/Cargo.toml +1 -0
  5. data/bridge/sdk-core/Cargo.toml +1 -1
  6. data/bridge/sdk-core/README.md +1 -4
  7. data/bridge/sdk-core/client/Cargo.toml +1 -1
  8. data/bridge/sdk-core/client/src/lib.rs +12 -20
  9. data/bridge/sdk-core/client/src/raw.rs +9 -8
  10. data/bridge/sdk-core/client/src/retry.rs +100 -23
  11. data/bridge/sdk-core/core/Cargo.toml +7 -7
  12. data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
  13. data/bridge/sdk-core/core/src/abstractions.rs +22 -22
  14. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +146 -43
  15. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +419 -9
  16. data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -89
  17. data/bridge/sdk-core/core/src/core_tests/workers.rs +2 -2
  18. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
  19. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +47 -27
  20. data/bridge/sdk-core/core/src/lib.rs +139 -32
  21. data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
  22. data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
  23. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  24. data/bridge/sdk-core/core/src/telemetry/metrics.rs +184 -139
  25. data/bridge/sdk-core/core/src/telemetry/mod.rs +310 -315
  26. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +4 -3
  27. data/bridge/sdk-core/core/src/test_help/mod.rs +23 -9
  28. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +12 -6
  29. data/bridge/sdk-core/core/src/worker/activities.rs +40 -23
  30. data/bridge/sdk-core/core/src/worker/client/mocks.rs +1 -1
  31. data/bridge/sdk-core/core/src/worker/client.rs +30 -4
  32. data/bridge/sdk-core/core/src/worker/mod.rs +23 -19
  33. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +10 -19
  34. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +99 -25
  35. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -5
  36. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -5
  37. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +1 -5
  38. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +3 -5
  39. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +1 -5
  40. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +2 -6
  41. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +1 -5
  42. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +24 -22
  43. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +12 -38
  44. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
  45. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +1 -5
  46. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -5
  47. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -5
  48. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +8 -2
  49. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +1 -5
  50. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +1 -1
  51. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +233 -217
  52. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +1 -6
  53. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +4 -4
  54. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +13 -5
  55. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +86 -29
  56. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +2 -2
  57. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +56 -11
  58. data/bridge/sdk-core/core-api/Cargo.toml +4 -3
  59. data/bridge/sdk-core/core-api/src/lib.rs +1 -43
  60. data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
  61. data/bridge/sdk-core/core-api/src/worker.rs +13 -0
  62. data/bridge/sdk-core/etc/deps.svg +115 -140
  63. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  64. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
  65. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  66. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  67. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -3
  68. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  69. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  70. data/bridge/sdk-core/protos/api_upstream/{temporal/api/update/v1/message.proto → build/tools.go} +6 -23
  71. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  72. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
  73. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +20 -19
  74. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +2 -2
  75. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
  76. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -4
  77. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
  78. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +5 -3
  79. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +23 -2
  80. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/{cluster.proto → interaction_type.proto} +10 -11
  81. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
  82. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
  83. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
  84. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
  85. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
  86. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +2 -13
  87. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
  88. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
  89. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  90. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
  91. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +26 -19
  92. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
  93. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +2 -2
  94. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +21 -61
  95. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
  96. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
  97. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
  98. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
  99. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
  100. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
  101. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
  102. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -16
  103. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +17 -3
  104. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
  105. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +8 -1
  106. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
  107. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
  108. data/bridge/sdk-core/sdk/Cargo.toml +2 -2
  109. data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
  110. data/bridge/sdk-core/sdk/src/lib.rs +7 -5
  111. data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
  112. data/bridge/sdk-core/sdk/src/workflow_future.rs +3 -7
  113. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +1 -1
  114. data/bridge/sdk-core/sdk-core-protos/build.rs +0 -1
  115. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +65 -18
  116. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +22 -22
  117. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +104 -44
  118. data/bridge/sdk-core/test-utils/Cargo.toml +2 -1
  119. data/bridge/sdk-core/test-utils/src/lib.rs +81 -29
  120. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +5 -2
  121. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
  122. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -13
  123. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +167 -13
  124. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
  125. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +106 -20
  126. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +18 -8
  127. data/bridge/sdk-core/tests/main.rs +6 -4
  128. data/bridge/src/connection.rs +81 -62
  129. data/bridge/src/lib.rs +92 -33
  130. data/bridge/src/runtime.rs +9 -2
  131. data/bridge/src/worker.rs +53 -2
  132. data/lib/bridge.so +0 -0
  133. data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
  134. data/lib/gen/temporal/api/command/v1/message_pb.rb +17 -9
  135. data/lib/gen/temporal/api/common/v1/message_pb.rb +1 -1
  136. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
  137. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -1
  138. data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
  139. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +3 -2
  140. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +7 -1
  141. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
  142. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
  143. data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
  144. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
  145. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
  146. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
  147. data/lib/gen/temporal/api/enums/v1/update_pb.rb +1 -6
  148. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
  149. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
  150. data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
  151. data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
  152. data/lib/gen/temporal/api/history/v1/message_pb.rb +19 -18
  153. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
  154. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +1 -1
  155. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +11 -51
  156. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
  157. data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
  158. data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
  159. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
  160. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
  161. data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
  162. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
  163. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +27 -10
  164. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
  165. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +1 -0
  166. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +5 -1
  167. data/lib/temporalio/activity/context.rb +97 -0
  168. data/lib/temporalio/activity/info.rb +67 -0
  169. data/lib/temporalio/activity.rb +85 -0
  170. data/lib/temporalio/bridge/error.rb +8 -0
  171. data/lib/temporalio/bridge.rb +14 -0
  172. data/lib/{temporal → temporalio}/client/implementation.rb +49 -48
  173. data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
  174. data/lib/{temporal → temporalio}/client.rb +19 -32
  175. data/lib/{temporal → temporalio}/connection.rb +238 -223
  176. data/lib/{temporal → temporalio}/data_converter.rb +76 -35
  177. data/lib/{temporal → temporalio}/error/failure.rb +6 -6
  178. data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
  179. data/lib/{temporal → temporalio}/errors.rb +19 -1
  180. data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
  181. data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
  182. data/lib/temporalio/failure_converter.rb +7 -0
  183. data/lib/{temporal → temporalio}/interceptor/chain.rb +2 -1
  184. data/lib/{temporal → temporalio}/interceptor/client.rb +22 -1
  185. data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
  186. data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
  187. data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
  188. data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
  189. data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
  190. data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
  191. data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
  192. data/lib/temporalio/payload_converter.rb +14 -0
  193. data/lib/{temporal → temporalio}/retry_policy.rb +4 -4
  194. data/lib/{temporal → temporalio}/retry_state.rb +1 -1
  195. data/lib/temporalio/runtime.rb +25 -0
  196. data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
  197. data/lib/temporalio/version.rb +3 -0
  198. data/lib/temporalio/worker/activity_runner.rb +92 -0
  199. data/lib/temporalio/worker/activity_worker.rb +138 -0
  200. data/lib/temporalio/worker/reactor.rb +46 -0
  201. data/lib/temporalio/worker/runner.rb +63 -0
  202. data/lib/temporalio/worker/sync_worker.rb +88 -0
  203. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  204. data/lib/temporalio/worker.rb +198 -0
  205. data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
  206. data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
  207. data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
  208. data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
  209. data/lib/temporalio.rb +12 -3
  210. data/temporalio.gemspec +7 -3
  211. metadata +79 -56
  212. data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
  213. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
  214. data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
  215. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
  216. data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
  217. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
  218. data/bridge/sdk-core/core/src/log_export.rs +0 -62
  219. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
  220. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
  221. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
  222. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
  223. data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
  224. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
  225. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
  226. data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -26
  227. data/lib/temporal/bridge.rb +0 -14
  228. data/lib/temporal/failure_converter.rb +0 -8
  229. data/lib/temporal/payload_converter.rb +0 -14
  230. data/lib/temporal/runtime.rb +0 -22
  231. data/lib/temporal/version.rb +0 -3
  232. data/lib/temporal.rb +0 -8
@@ -12,7 +12,7 @@ use super::{
12
12
  patch_state_machine::has_change, signal_external_state_machine::new_external_signal,
13
13
  timer_state_machine::new_timer, upsert_search_attributes_state_machine::upsert_search_attrs,
14
14
  workflow_machines::local_acts::LocalActivityData,
15
- workflow_task_state_machine::WorkflowTaskMachine, MachineKind, Machines, NewMachineWithCommand,
15
+ workflow_task_state_machine::WorkflowTaskMachine, Machines, NewMachineWithCommand,
16
16
  TemporalStateMachine,
17
17
  };
18
18
  use crate::{
@@ -20,8 +20,9 @@ use crate::{
20
20
  telemetry::{metrics::MetricsContext, VecDisplayer},
21
21
  worker::{
22
22
  workflow::{
23
- CommandID, DrivenWorkflow, HistoryUpdate, LocalResolution, WFCommand, WorkflowFetcher,
24
- WorkflowStartedInfo,
23
+ machines::modify_workflow_properties_state_machine::modify_workflow_properties,
24
+ CommandID, DrivenWorkflow, HistoryUpdate, LocalResolution, OutgoingJob, WFCommand,
25
+ WorkflowFetcher, WorkflowStartedInfo,
25
26
  },
26
27
  ExecutingLAId, LocalActRequest, LocalActivityExecutionResult, LocalActivityResolution,
27
28
  },
@@ -38,6 +39,7 @@ use std::{
38
39
  use temporal_sdk_core_protos::{
39
40
  coresdk::{
40
41
  common::NamespacedWorkflowExecution,
42
+ workflow_activation,
41
43
  workflow_activation::{
42
44
  workflow_activation_job, NotifyHasPatch, UpdateRandomSeed, WorkflowActivation,
43
45
  },
@@ -153,9 +155,9 @@ struct ChangeInfo {
153
155
  #[derive(Debug, derive_more::Display)]
154
156
  #[must_use]
155
157
  #[allow(clippy::large_enum_variant)]
156
- pub enum MachineResponse {
158
+ pub(super) enum MachineResponse {
157
159
  #[display(fmt = "PushWFJob({})", "_0")]
158
- PushWFJob(workflow_activation_job::Variant),
160
+ PushWFJob(OutgoingJob),
159
161
 
160
162
  /// Pushes a new command into the list that will be sent to server once we respond with the
161
163
  /// workflow task completion
@@ -196,7 +198,7 @@ where
196
198
  T: Into<workflow_activation_job::Variant>,
197
199
  {
198
200
  fn from(v: T) -> Self {
199
- Self::PushWFJob(v.into())
201
+ Self::PushWFJob(v.into().into())
200
202
  }
201
203
  }
202
204
 
@@ -315,6 +317,148 @@ impl WorkflowMachines {
315
317
  self.drive_me.get_started_info()
316
318
  }
317
319
 
320
+ /// Fetches commands which are ready for processing from the state machines, generally to be
321
+ /// sent off to the server. They are not removed from the internal queue, that happens when
322
+ /// corresponding history events from the server are being handled.
323
+ pub(crate) fn get_commands(&self) -> Vec<ProtoCommand> {
324
+ self.commands
325
+ .iter()
326
+ .filter_map(|c| {
327
+ if !self.machine(c.machine).is_final_state() {
328
+ match &c.command {
329
+ MachineAssociatedCommand::Real(cmd) => Some((**cmd).clone()),
330
+ MachineAssociatedCommand::FakeLocalActivityMarker(_) => None,
331
+ }
332
+ } else {
333
+ None
334
+ }
335
+ })
336
+ .collect()
337
+ }
338
+
339
+ /// Returns the next activation that needs to be performed by the lang sdk. Things like unblock
340
+ /// timer, etc. This does *not* cause any advancement of the state machines, it merely drains
341
+ /// from the outgoing queue of activation jobs.
342
+ ///
343
+ /// The job list may be empty, in which case it is expected the caller handles what to do in a
344
+ /// "no work" situation. Possibly, it may know about some work the machines don't, like queries.
345
+ pub(crate) fn get_wf_activation(&mut self) -> WorkflowActivation {
346
+ let jobs = self.drive_me.drain_jobs();
347
+ WorkflowActivation {
348
+ timestamp: self.current_wf_time.map(Into::into),
349
+ is_replaying: self.replaying,
350
+ run_id: self.run_id.clone(),
351
+ history_length: self.last_processed_event as u32,
352
+ jobs,
353
+ }
354
+ }
355
+
356
+ pub(crate) fn has_pending_jobs(&self) -> bool {
357
+ !self.drive_me.peek_pending_jobs().is_empty()
358
+ }
359
+
360
+ pub(crate) fn has_pending_la_resolutions(&self) -> bool {
361
+ self.drive_me
362
+ .peek_pending_jobs()
363
+ .iter()
364
+ .any(|v| v.is_la_resolution)
365
+ }
366
+
367
+ /// Iterate the state machines, which consists of grabbing any pending outgoing commands from
368
+ /// the workflow code, handling them, and preparing them to be sent off to the server.
369
+ pub(crate) async fn iterate_machines(&mut self) -> Result<()> {
370
+ let results = self.drive_me.fetch_workflow_iteration_output().await;
371
+ self.handle_driven_results(results)?;
372
+ self.prepare_commands()?;
373
+ if self.workflow_is_finished() {
374
+ if let Some(rt) = self.total_runtime() {
375
+ self.metrics.wf_e2e_latency(rt);
376
+ }
377
+ }
378
+ Ok(())
379
+ }
380
+
381
+ /// Apply the next (unapplied) entire workflow task from history to these machines. Will replay
382
+ /// any events that need to be replayed until caught up to the newest WFT. May also fetch
383
+ /// history from server if needed.
384
+ pub(crate) async fn apply_next_wft_from_history(&mut self) -> Result<usize> {
385
+ // If we have already seen the terminal event for the entire workflow in a previous WFT,
386
+ // then we don't need to do anything here, and in fact we need to avoid re-applying the
387
+ // final WFT.
388
+ if self.have_seen_terminal_event {
389
+ return Ok(0);
390
+ }
391
+
392
+ let last_handled_wft_started_id = self.current_started_event_id;
393
+ let events = {
394
+ let mut evts = self
395
+ .last_history_from_server
396
+ .take_next_wft_sequence(last_handled_wft_started_id)
397
+ .await
398
+ .map_err(WFMachinesError::HistoryFetchingError)?;
399
+ // Do not re-process events we have already processed
400
+ evts.retain(|e| e.event_id > self.last_processed_event);
401
+ evts
402
+ };
403
+ let num_events_to_process = events.len();
404
+
405
+ // We're caught up on reply if there are no new events to process
406
+ if events.is_empty() {
407
+ self.replaying = false;
408
+ }
409
+ let replay_start = Instant::now();
410
+
411
+ if let Some(last_event) = events.last() {
412
+ if last_event.event_type == EventType::WorkflowTaskStarted as i32 {
413
+ self.next_started_event_id = last_event.event_id;
414
+ }
415
+ }
416
+
417
+ let mut history = events.into_iter().peekable();
418
+ while let Some(event) = history.next() {
419
+ if event.event_id != self.last_processed_event + 1 {
420
+ return Err(WFMachinesError::Fatal(format!(
421
+ "History is out of order. Last processed event: {}, event id: {}",
422
+ self.last_processed_event, event.event_id
423
+ )));
424
+ }
425
+ let next_event = history.peek();
426
+ let eid = event.event_id;
427
+ let etype = event.event_type();
428
+ self.handle_event(event, next_event.is_some())?;
429
+ self.last_processed_event = eid;
430
+ if etype == EventType::WorkflowTaskStarted && next_event.is_none() {
431
+ break;
432
+ }
433
+ }
434
+
435
+ // Scan through to the next WFT, searching for any patch / la markers, so that we can
436
+ // pre-resolve them.
437
+ for e in self.last_history_from_server.peek_next_wft_sequence() {
438
+ if let Some((patch_id, _)) = e.get_patch_marker_details() {
439
+ self.encountered_change_markers.insert(
440
+ patch_id.clone(),
441
+ ChangeInfo {
442
+ created_command: false,
443
+ },
444
+ );
445
+ // Found a patch marker
446
+ self.drive_me.send_job(
447
+ workflow_activation_job::Variant::NotifyHasPatch(NotifyHasPatch { patch_id })
448
+ .into(),
449
+ );
450
+ } else if e.is_local_activity_marker() {
451
+ self.local_activity_data.process_peekahead_marker(e)?;
452
+ }
453
+ }
454
+
455
+ if !self.replaying {
456
+ self.metrics.wf_task_replay_latency(replay_start.elapsed());
457
+ }
458
+
459
+ Ok(num_events_to_process)
460
+ }
461
+
318
462
  /// Handle a single event from the workflow history. `has_next_event` should be false if `event`
319
463
  /// is the last event in the history.
320
464
  ///
@@ -323,14 +467,8 @@ impl WorkflowMachines {
323
467
  /// event is applied to the machine, which may also return a nondeterminism error if the machine
324
468
  /// does not match the expected type. A fatal error may be returned if the machine is in an
325
469
  /// invalid state.
326
- #[instrument(level = "debug", skip(self, event), fields(event=%event))]
470
+ #[instrument(skip(self, event), fields(event=%event))]
327
471
  fn handle_event(&mut self, event: HistoryEvent, has_next_event: bool) -> Result<()> {
328
- if event.event_type() == EventType::Unspecified {
329
- return Err(WFMachinesError::Fatal(format!(
330
- "Event type is unspecified! This history is invalid. Event detail: {:?}",
331
- event
332
- )));
333
- }
334
472
  if event.is_final_wf_execution_event() {
335
473
  self.have_seen_terminal_event = true;
336
474
  }
@@ -348,11 +486,6 @@ impl WorkflowMachines {
348
486
  Ok(())
349
487
  };
350
488
  }
351
-
352
- if event.is_command_event() {
353
- self.handle_command_event(event)?;
354
- return Ok(());
355
- }
356
489
  if self.replaying
357
490
  && self.current_started_event_id
358
491
  >= self.last_history_from_server.previous_started_event_id
@@ -361,59 +494,50 @@ impl WorkflowMachines {
361
494
  // Replay is finished
362
495
  self.replaying = false;
363
496
  }
497
+ if event.event_type() == EventType::Unspecified || event.attributes.is_none() {
498
+ return if !event.worker_may_ignore {
499
+ Err(WFMachinesError::Fatal(format!(
500
+ "Event type is unspecified! This history is invalid. Event detail: {:?}",
501
+ event
502
+ )))
503
+ } else {
504
+ debug!("Event is ignorable");
505
+ Ok(())
506
+ };
507
+ }
364
508
 
365
- match event.get_initial_command_event_id() {
366
- Some(initial_cmd_id) => {
367
- // We remove the machine while we it handles events, then return it, to avoid
368
- // borrowing from ourself mutably.
369
- let maybe_machine = self.machines_by_event_id.remove(&initial_cmd_id);
370
- match maybe_machine {
371
- Some(sm) => {
372
- self.submachine_handle_event(sm, event, has_next_event)?;
373
- // Restore machine if not in it's final state
374
- if !self.machine(sm).is_final_state() {
375
- self.machines_by_event_id.insert(initial_cmd_id, sm);
376
- }
509
+ if event.is_command_event() {
510
+ self.handle_command_event(event)?;
511
+ return Ok(());
512
+ }
513
+
514
+ if let Some(initial_cmd_id) = event.get_initial_command_event_id() {
515
+ // We remove the machine while we it handles events, then return it, to avoid
516
+ // borrowing from ourself mutably.
517
+ let maybe_machine = self.machines_by_event_id.remove(&initial_cmd_id);
518
+ match maybe_machine {
519
+ Some(sm) => {
520
+ self.submachine_handle_event(sm, event, has_next_event)?;
521
+ // Restore machine if not in it's final state
522
+ if !self.machine(sm).is_final_state() {
523
+ self.machines_by_event_id.insert(initial_cmd_id, sm);
377
524
  }
378
- None => {
379
- return Err(WFMachinesError::Nondeterminism(format!(
380
- "During event handling, this event had an initial command ID but we \
525
+ }
526
+ None => {
527
+ return Err(WFMachinesError::Nondeterminism(format!(
528
+ "During event handling, this event had an initial command ID but we \
381
529
  could not find a matching command for it: {:?}",
382
- event
383
- )));
384
- }
530
+ event
531
+ )));
385
532
  }
386
533
  }
387
- None => self.handle_non_stateful_event(event, has_next_event)?,
534
+ } else {
535
+ self.handle_non_stateful_event(event, has_next_event)?;
388
536
  }
389
537
 
390
538
  Ok(())
391
539
  }
392
540
 
393
- /// Called when a workflow task started event has triggered. Ensures we are tracking the ID
394
- /// of the current started event as well as workflow time properly.
395
- fn task_started(&mut self, task_started_event_id: i64, time: SystemTime) -> Result<()> {
396
- self.current_started_event_id = task_started_event_id;
397
- self.wft_start_time = Some(time);
398
- self.set_current_time(time);
399
-
400
- // Notify local activity machines that we started a non-replay WFT, which will allow any
401
- // which were waiting for a marker to instead decide to execute the LA since it clearly
402
- // will not be resolved via marker.
403
- if !self.replaying {
404
- let mut resps = vec![];
405
- for (k, mach) in self.all_machines.iter_mut() {
406
- if let Machines::LocalActivityMachine(lam) = mach {
407
- resps.push((k, lam.encountered_non_replay_wft()?));
408
- }
409
- }
410
- for (mkey, resp_set) in resps {
411
- self.process_machine_responses(mkey, resp_set)?;
412
- }
413
- }
414
- Ok(())
415
- }
416
-
417
541
  /// A command event is an event which is generated from a command emitted as a result of
418
542
  /// performing a workflow task. Each command has a corresponding event. For example
419
543
  /// ScheduleActivityTaskCommand is recorded to the history as ActivityTaskScheduledEvent.
@@ -504,7 +628,7 @@ impl WorkflowMachines {
504
628
  attrs,
505
629
  )) = event.attributes
506
630
  {
507
- if let Some(st) = event.event_time {
631
+ if let Some(st) = event.event_time.clone() {
508
632
  let as_systime: SystemTime = st.try_into()?;
509
633
  self.workflow_start_time = Some(as_systime);
510
634
  // Set the workflow time to be the event time of the first event, so that
@@ -516,6 +640,7 @@ impl WorkflowMachines {
516
640
  self.drive_me.start(
517
641
  self.workflow_id.clone(),
518
642
  str_to_randomness_seed(&attrs.original_execution_run_id),
643
+ event.event_time.unwrap_or_default(),
519
644
  attrs,
520
645
  );
521
646
  } else {
@@ -536,7 +661,8 @@ impl WorkflowMachines {
536
661
  attrs,
537
662
  )) = event.attributes
538
663
  {
539
- self.drive_me.signal(attrs.into());
664
+ self.drive_me
665
+ .send_job(workflow_activation::SignalWorkflow::from(attrs).into());
540
666
  } else {
541
667
  // err
542
668
  }
@@ -548,7 +674,8 @@ impl WorkflowMachines {
548
674
  ),
549
675
  ) = event.attributes
550
676
  {
551
- self.drive_me.cancel(attrs.into());
677
+ self.drive_me
678
+ .send_job(workflow_activation::CancelWorkflow::from(attrs).into());
552
679
  } else {
553
680
  // err
554
681
  }
@@ -563,46 +690,6 @@ impl WorkflowMachines {
563
690
  Ok(())
564
691
  }
565
692
 
566
- /// Fetches commands which are ready for processing from the state machines, generally to be
567
- /// sent off to the server. They are not removed from the internal queue, that happens when
568
- /// corresponding history events from the server are being handled.
569
- pub(crate) fn get_commands(&self) -> Vec<ProtoCommand> {
570
- self.commands
571
- .iter()
572
- .filter_map(|c| {
573
- if !self.machine(c.machine).is_final_state() {
574
- match &c.command {
575
- MachineAssociatedCommand::Real(cmd) => Some((**cmd).clone()),
576
- MachineAssociatedCommand::FakeLocalActivityMarker(_) => None,
577
- }
578
- } else {
579
- None
580
- }
581
- })
582
- .collect()
583
- }
584
-
585
- /// Returns the next activation that needs to be performed by the lang sdk. Things like unblock
586
- /// timer, etc. This does *not* cause any advancement of the state machines, it merely drains
587
- /// from the outgoing queue of activation jobs.
588
- ///
589
- /// The job list may be empty, in which case it is expected the caller handles what to do in a
590
- /// "no work" situation. Possibly, it may know about some work the machines don't, like queries.
591
- pub(crate) fn get_wf_activation(&mut self) -> WorkflowActivation {
592
- let jobs = self.drive_me.drain_jobs();
593
- WorkflowActivation {
594
- timestamp: self.current_wf_time.map(Into::into),
595
- is_replaying: self.replaying,
596
- run_id: self.run_id.clone(),
597
- history_length: self.last_processed_event as u32,
598
- jobs,
599
- }
600
- }
601
-
602
- pub(crate) fn has_pending_jobs(&self) -> bool {
603
- !self.drive_me.peek_pending_jobs().is_empty()
604
- }
605
-
606
693
  fn set_current_time(&mut self, time: SystemTime) -> SystemTime {
607
694
  if self.current_wf_time.map_or(true, |t| t < time) {
608
695
  self.current_wf_time = Some(time);
@@ -611,102 +698,6 @@ impl WorkflowMachines {
611
698
  .expect("We have just ensured this is populated")
612
699
  }
613
700
 
614
- /// Iterate the state machines, which consists of grabbing any pending outgoing commands from
615
- /// the workflow code, handling them, and preparing them to be sent off to the server.
616
- pub(crate) async fn iterate_machines(&mut self) -> Result<()> {
617
- let results = self.drive_me.fetch_workflow_iteration_output().await;
618
- self.handle_driven_results(results)?;
619
- self.prepare_commands()?;
620
- if self.workflow_is_finished() {
621
- if let Some(rt) = self.total_runtime() {
622
- self.metrics.wf_e2e_latency(rt);
623
- }
624
- }
625
- Ok(())
626
- }
627
-
628
- /// Apply the next (unapplied) entire workflow task from history to these machines. Will replay
629
- /// any events that need to be replayed until caught up to the newest WFT. May also fetch
630
- /// history from server if needed.
631
- pub(crate) async fn apply_next_wft_from_history(&mut self) -> Result<usize> {
632
- // If we have already seen the terminal event for the entire workflow in a previous WFT,
633
- // then we don't need to do anything here, and in fact we need to avoid re-applying the
634
- // final WFT.
635
- if self.have_seen_terminal_event {
636
- return Ok(0);
637
- }
638
-
639
- let last_handled_wft_started_id = self.current_started_event_id;
640
- let events = {
641
- let mut evts = self
642
- .last_history_from_server
643
- .take_next_wft_sequence(last_handled_wft_started_id)
644
- .await
645
- .map_err(WFMachinesError::HistoryFetchingError)?;
646
- // Do not re-process events we have already processed
647
- evts.retain(|e| e.event_id > self.last_processed_event);
648
- evts
649
- };
650
- let num_events_to_process = events.len();
651
-
652
- // We're caught up on reply if there are no new events to process
653
- // TODO: Probably this is unneeded if we evict whenever history is from non-sticky queue
654
- if events.is_empty() {
655
- self.replaying = false;
656
- }
657
- let replay_start = Instant::now();
658
-
659
- if let Some(last_event) = events.last() {
660
- if last_event.event_type == EventType::WorkflowTaskStarted as i32 {
661
- self.next_started_event_id = last_event.event_id;
662
- }
663
- }
664
-
665
- let mut history = events.into_iter().peekable();
666
- while let Some(event) = history.next() {
667
- if event.event_id != self.last_processed_event + 1 {
668
- return Err(WFMachinesError::Fatal(format!(
669
- "History is out of order. Last processed event: {}, event id: {}",
670
- self.last_processed_event, event.event_id
671
- )));
672
- }
673
- let next_event = history.peek();
674
- let eid = event.event_id;
675
- let etype = event.event_type;
676
- self.handle_event(event, next_event.is_some())?;
677
- self.last_processed_event = eid;
678
- if etype == EventType::WorkflowTaskStarted as i32 && next_event.is_none() {
679
- break;
680
- }
681
- }
682
-
683
- // Scan through to the next WFT, searching for any patch markers, so that we can
684
- // pre-resolve them.
685
- for e in self.last_history_from_server.peek_next_wft_sequence() {
686
- if let Some((patch_id, _)) = e.get_patch_marker_details() {
687
- self.encountered_change_markers.insert(
688
- patch_id.clone(),
689
- ChangeInfo {
690
- created_command: false,
691
- },
692
- );
693
- // Found a patch marker
694
- self.drive_me
695
- .send_job(workflow_activation_job::Variant::NotifyHasPatch(
696
- NotifyHasPatch { patch_id },
697
- ));
698
- } else if e.is_local_activity_marker() {
699
- self.local_activity_data.process_peekahead_marker(e)?;
700
- }
701
- }
702
-
703
- if !self.replaying {
704
- self.metrics.wf_task_replay_latency(replay_start.elapsed());
705
- }
706
-
707
- Ok(num_events_to_process)
708
- }
709
-
710
701
  /// Wrapper for calling [TemporalStateMachine::handle_event] which appropriately takes action
711
702
  /// on the returned machine responses
712
703
  fn submachine_handle_event(
@@ -765,7 +756,7 @@ impl WorkflowMachines {
765
756
  ) -> Result<()> {
766
757
  let sm = self.machine(smk);
767
758
  if !machine_responses.is_empty() {
768
- debug!(responses = %machine_responses.display(), machine_name = %sm.kind(),
759
+ debug!(responses = %machine_responses.display(), machine_name = %sm.name(),
769
760
  "Machine produced responses");
770
761
  }
771
762
  self.process_machine_resps_impl(smk, machine_responses)
@@ -791,14 +782,12 @@ impl WorkflowMachines {
791
782
  self.task_started(task_started_event_id, time)?;
792
783
  }
793
784
  MachineResponse::UpdateRunIdOnWorkflowReset { run_id: new_run_id } => {
794
- // TODO: Should this also update self.run_id? Should we track orig/current
795
- // separately?
796
- self.drive_me
797
- .send_job(workflow_activation_job::Variant::UpdateRandomSeed(
798
- UpdateRandomSeed {
799
- randomness_seed: str_to_randomness_seed(&new_run_id),
800
- },
801
- ));
785
+ self.drive_me.send_job(
786
+ workflow_activation_job::Variant::UpdateRandomSeed(UpdateRandomSeed {
787
+ randomness_seed: str_to_randomness_seed(&new_run_id),
788
+ })
789
+ .into(),
790
+ );
802
791
  }
803
792
  MachineResponse::IssueNewCommand(c) => {
804
793
  self.current_wf_task_commands.push_back(CommandAndMachine {
@@ -860,7 +849,7 @@ impl WorkflowMachines {
860
849
  Duration::from_secs(0),
861
850
  removed_act.attempt,
862
851
  None,
863
- None,
852
+ removed_act.original_schedule_time,
864
853
  )?;
865
854
  self.process_machine_responses(smk, more_responses)?;
866
855
  } else {
@@ -888,6 +877,30 @@ impl WorkflowMachines {
888
877
  Ok(())
889
878
  }
890
879
 
880
+ /// Called when a workflow task started event has triggered. Ensures we are tracking the ID
881
+ /// of the current started event as well as workflow time properly.
882
+ fn task_started(&mut self, task_started_event_id: i64, time: SystemTime) -> Result<()> {
883
+ self.current_started_event_id = task_started_event_id;
884
+ self.wft_start_time = Some(time);
885
+ self.set_current_time(time);
886
+
887
+ // Notify local activity machines that we started a non-replay WFT, which will allow any
888
+ // which were waiting for a marker to instead decide to execute the LA since it clearly
889
+ // will not be resolved via marker.
890
+ if !self.replaying {
891
+ let mut resps = vec![];
892
+ for (k, mach) in self.all_machines.iter_mut() {
893
+ if let Machines::LocalActivityMachine(lam) = mach {
894
+ resps.push((k, lam.encountered_non_replay_wft()?));
895
+ }
896
+ }
897
+ for (mkey, resp_set) in resps {
898
+ self.process_machine_responses(mkey, resp_set)?;
899
+ }
900
+ }
901
+ Ok(())
902
+ }
903
+
891
904
  /// Handles results of the workflow activation, delegating work to the appropriate state
892
905
  /// machine. Returns a list of workflow jobs that should be queued in the pending activation for
893
906
  /// the next poll. This list will be populated only if state machine produced lang activations
@@ -1037,6 +1050,12 @@ impl WorkflowMachines {
1037
1050
  // Nothing to do here, queries are handled above the machine level
1038
1051
  unimplemented!("Query responses should not make it down into the machines")
1039
1052
  }
1053
+ WFCommand::ModifyWorkflowProperties(attrs) => {
1054
+ self.add_cmd_to_wf_task(
1055
+ modify_workflow_properties(attrs),
1056
+ CommandIdKind::NeverResolves,
1057
+ );
1058
+ }
1040
1059
  WFCommand::NoCommandsFromLang => (),
1041
1060
  }
1042
1061
  }
@@ -1143,10 +1162,7 @@ enum ChangeMarkerOutcome {
1143
1162
 
1144
1163
  /// Special handling for patch markers, when handling command events as in
1145
1164
  /// [WorkflowMachines::handle_command_event]
1146
- fn change_marker_handling(
1147
- event: &HistoryEvent,
1148
- mach: &dyn TemporalStateMachine,
1149
- ) -> Result<ChangeMarkerOutcome> {
1165
+ fn change_marker_handling(event: &HistoryEvent, mach: &Machines) -> Result<ChangeMarkerOutcome> {
1150
1166
  if !mach.matches_event(event) {
1151
1167
  // Version markers can be skipped in the event they are deprecated
1152
1168
  if let Some((patch_name, deprecated)) = event.get_patch_marker_details() {
@@ -1162,11 +1178,11 @@ fn change_marker_handling(
1162
1178
  patch_name
1163
1179
  )));
1164
1180
  }
1165
- // Version machines themselves may also not *have* matching markers, where non-deprecated
1181
+ // Patch machines themselves may also not *have* matching markers, where non-deprecated
1166
1182
  // calls take the old path, and deprecated calls assume history is produced by a new-code
1167
1183
  // worker.
1168
- if mach.kind() == MachineKind::Patch {
1169
- debug!("Skipping non-matching event against version machine");
1184
+ if matches!(mach, Machines::PatchMachine(_)) {
1185
+ debug!("Skipping non-matching event against patch machine");
1170
1186
  return Ok(ChangeMarkerOutcome::SkipCommand);
1171
1187
  }
1172
1188
  }
@@ -1,8 +1,7 @@
1
1
  #![allow(clippy::enum_variant_names)]
2
2
 
3
3
  use super::{
4
- workflow_machines::MachineResponse, Cancellable, EventInfo, MachineKind, WFMachinesAdapter,
5
- WFMachinesError,
4
+ workflow_machines::MachineResponse, Cancellable, EventInfo, WFMachinesAdapter, WFMachinesError,
6
5
  };
7
6
  use rustfsm::{fsm, TransitionResult};
8
7
  use std::{
@@ -101,10 +100,6 @@ impl WFMachinesAdapter for WorkflowTaskMachine {
101
100
  | EventType::WorkflowTaskFailed
102
101
  )
103
102
  }
104
-
105
- fn kind(&self) -> MachineKind {
106
- MachineKind::WorkflowTask
107
- }
108
103
  }
109
104
 
110
105
  impl TryFrom<HistoryEvent> for WorkflowTaskMachineEvents {
@@ -87,7 +87,7 @@ impl ManagedWFFunc {
87
87
  "runid".to_string(),
88
88
  hist,
89
89
  Box::new(driver).into(),
90
- Default::default(),
90
+ MetricsContext::no_op(),
91
91
  );
92
92
  let mgr = WorkflowManager::new_from_machines(state_machines);
93
93
  Self {
@@ -98,7 +98,7 @@ impl ManagedWFFunc {
98
98
  }
99
99
  }
100
100
 
101
- #[instrument(level = "debug", skip(self))]
101
+ #[instrument(skip(self))]
102
102
  pub(crate) async fn get_next_activation(&mut self) -> Result<WorkflowActivation> {
103
103
  let res = self.mgr.get_next_activation().await?;
104
104
  debug!("Managed wf next activation: {}", &res);
@@ -116,7 +116,7 @@ impl ManagedWFFunc {
116
116
  }
117
117
 
118
118
  /// Feed new history, as if received a new poll result. Returns new activation
119
- #[instrument(level = "debug", skip(self, update))]
119
+ #[instrument(skip(self, update))]
120
120
  pub(crate) async fn new_history(
121
121
  &mut self,
122
122
  update: HistoryUpdate,
@@ -174,7 +174,7 @@ impl ManagedWFFunc {
174
174
  self.future_handle.take().unwrap().await.unwrap()
175
175
  }
176
176
 
177
- #[instrument(level = "debug", skip(self, res))]
177
+ #[instrument(skip(self, res))]
178
178
  async fn push_activation_to_wf(&mut self, res: &WorkflowActivation) -> Result<()> {
179
179
  if res.jobs.is_empty() {
180
180
  // Nothing to do here