temporalio 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -23
  3. data/bridge/Cargo.lock +168 -59
  4. data/bridge/Cargo.toml +4 -2
  5. data/bridge/sdk-core/README.md +19 -6
  6. data/bridge/sdk-core/client/src/lib.rs +215 -39
  7. data/bridge/sdk-core/client/src/metrics.rs +17 -8
  8. data/bridge/sdk-core/client/src/raw.rs +4 -4
  9. data/bridge/sdk-core/client/src/retry.rs +32 -20
  10. data/bridge/sdk-core/core/Cargo.toml +22 -9
  11. data/bridge/sdk-core/core/src/abstractions.rs +203 -14
  12. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +76 -41
  13. data/bridge/sdk-core/core/src/core_tests/determinism.rs +165 -2
  14. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +204 -83
  15. data/bridge/sdk-core/core/src/core_tests/queries.rs +3 -4
  16. data/bridge/sdk-core/core/src/core_tests/workers.rs +1 -3
  17. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +397 -54
  18. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +106 -12
  19. data/bridge/sdk-core/core/src/internal_flags.rs +136 -0
  20. data/bridge/sdk-core/core/src/lib.rs +16 -9
  21. data/bridge/sdk-core/core/src/telemetry/log_export.rs +1 -1
  22. data/bridge/sdk-core/core/src/telemetry/metrics.rs +69 -35
  23. data/bridge/sdk-core/core/src/telemetry/mod.rs +29 -13
  24. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +17 -12
  25. data/bridge/sdk-core/core/src/test_help/mod.rs +62 -12
  26. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +112 -156
  27. data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +89 -0
  28. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +352 -122
  29. data/bridge/sdk-core/core/src/worker/activities.rs +233 -157
  30. data/bridge/sdk-core/core/src/worker/client/mocks.rs +22 -2
  31. data/bridge/sdk-core/core/src/worker/client.rs +18 -2
  32. data/bridge/sdk-core/core/src/worker/mod.rs +165 -58
  33. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +1 -3
  34. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +3 -5
  35. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +856 -277
  36. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +100 -43
  37. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +7 -7
  38. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +5 -4
  39. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +87 -27
  40. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +5 -4
  41. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +5 -4
  42. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +5 -4
  43. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +137 -62
  44. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +25 -17
  45. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +7 -6
  46. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +103 -152
  47. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +7 -7
  48. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +9 -9
  49. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +2 -2
  50. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +14 -7
  51. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +5 -16
  52. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +201 -121
  53. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +11 -14
  54. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +30 -15
  55. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +1026 -376
  56. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +460 -384
  57. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +40 -57
  58. data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +125 -0
  59. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +1 -4
  60. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +117 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +24 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +448 -718
  63. data/bridge/sdk-core/core-api/Cargo.toml +2 -1
  64. data/bridge/sdk-core/core-api/src/errors.rs +1 -34
  65. data/bridge/sdk-core/core-api/src/lib.rs +6 -2
  66. data/bridge/sdk-core/core-api/src/telemetry.rs +0 -6
  67. data/bridge/sdk-core/core-api/src/worker.rs +14 -1
  68. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +18 -15
  69. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +8 -3
  70. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  71. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +5 -17
  72. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +11 -0
  73. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +1 -6
  74. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +6 -6
  75. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +5 -0
  76. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +22 -6
  77. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +48 -19
  78. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +2 -0
  79. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +3 -0
  80. data/bridge/sdk-core/protos/api_upstream/temporal/api/{enums/v1/interaction_type.proto → protocol/v1/message.proto} +29 -11
  81. data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +63 -0
  82. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +111 -0
  83. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +59 -28
  84. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +2 -2
  85. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +1 -0
  86. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +1 -0
  87. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +1 -0
  88. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +1 -0
  89. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +1 -0
  90. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +1 -0
  91. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +7 -0
  92. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +1 -0
  93. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +6 -0
  94. data/bridge/sdk-core/sdk/Cargo.toml +3 -2
  95. data/bridge/sdk-core/sdk/src/lib.rs +87 -20
  96. data/bridge/sdk-core/sdk/src/workflow_future.rs +9 -8
  97. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +5 -2
  98. data/bridge/sdk-core/sdk-core-protos/build.rs +36 -1
  99. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +100 -87
  100. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +5 -1
  101. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +175 -57
  102. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +12 -2
  103. data/bridge/sdk-core/test-utils/Cargo.toml +3 -1
  104. data/bridge/sdk-core/test-utils/src/canned_histories.rs +106 -296
  105. data/bridge/sdk-core/test-utils/src/histfetch.rs +1 -1
  106. data/bridge/sdk-core/test-utils/src/lib.rs +82 -23
  107. data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +50 -0
  108. data/bridge/sdk-core/test-utils/src/workflows.rs +29 -0
  109. data/bridge/sdk-core/tests/fuzzy_workflow.rs +130 -0
  110. data/bridge/sdk-core/tests/{load_tests.rs → heavy_tests.rs} +125 -51
  111. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +25 -3
  112. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +5 -3
  113. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +218 -16
  114. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +4 -47
  115. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +5 -128
  116. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +83 -25
  117. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +93 -69
  118. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -0
  119. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +6 -13
  120. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +1 -0
  121. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +6 -2
  122. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -10
  123. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +72 -191
  124. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +1 -0
  125. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +7 -28
  126. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +12 -7
  127. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -0
  128. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +18 -14
  129. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +6 -20
  130. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +10 -21
  131. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +6 -4
  132. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +10 -11
  133. data/bridge/sdk-core/tests/main.rs +3 -13
  134. data/bridge/sdk-core/tests/runner.rs +75 -36
  135. data/bridge/sdk-core/tests/wf_input_replay.rs +32 -0
  136. data/bridge/src/connection.rs +41 -25
  137. data/bridge/src/lib.rs +269 -14
  138. data/bridge/src/runtime.rs +1 -1
  139. data/bridge/src/test_server.rs +153 -0
  140. data/bridge/src/worker.rs +89 -16
  141. data/lib/gen/temporal/api/command/v1/message_pb.rb +4 -18
  142. data/lib/gen/temporal/api/common/v1/message_pb.rb +4 -0
  143. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +1 -3
  144. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +3 -3
  145. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +2 -0
  146. data/lib/gen/temporal/api/enums/v1/update_pb.rb +6 -4
  147. data/lib/gen/temporal/api/history/v1/message_pb.rb +27 -19
  148. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +1 -0
  149. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +3 -0
  150. data/lib/gen/temporal/api/protocol/v1/message_pb.rb +30 -0
  151. data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +23 -0
  152. data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +49 -0
  153. data/lib/gen/temporal/api/testservice/v1/service_pb.rb +21 -0
  154. data/lib/gen/temporal/api/update/v1/message_pb.rb +72 -0
  155. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +26 -16
  156. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +13 -9
  157. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +10 -6
  158. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +13 -9
  159. data/lib/gen/temporal/sdk/core/common/common_pb.rb +7 -3
  160. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +9 -3
  161. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +7 -3
  162. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +27 -21
  163. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +28 -24
  164. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +12 -5
  165. data/lib/temporalio/activity/context.rb +13 -8
  166. data/lib/temporalio/activity/info.rb +1 -1
  167. data/lib/temporalio/bridge/connect_options.rb +15 -0
  168. data/lib/temporalio/bridge/retry_config.rb +24 -0
  169. data/lib/temporalio/bridge/tls_options.rb +19 -0
  170. data/lib/temporalio/client/implementation.rb +8 -8
  171. data/lib/temporalio/connection/retry_config.rb +44 -0
  172. data/lib/temporalio/connection/service.rb +20 -0
  173. data/lib/temporalio/connection/test_service.rb +92 -0
  174. data/lib/temporalio/connection/tls_options.rb +51 -0
  175. data/lib/temporalio/connection/workflow_service.rb +731 -0
  176. data/lib/temporalio/connection.rb +55 -720
  177. data/lib/temporalio/interceptor/activity_inbound.rb +22 -0
  178. data/lib/temporalio/interceptor/activity_outbound.rb +24 -0
  179. data/lib/temporalio/interceptor/chain.rb +5 -5
  180. data/lib/temporalio/interceptor/client.rb +8 -4
  181. data/lib/temporalio/interceptor.rb +22 -0
  182. data/lib/temporalio/retry_policy.rb +13 -3
  183. data/lib/temporalio/testing/time_skipping_handle.rb +32 -0
  184. data/lib/temporalio/testing/time_skipping_interceptor.rb +23 -0
  185. data/lib/temporalio/testing/workflow_environment.rb +112 -0
  186. data/lib/temporalio/testing.rb +175 -0
  187. data/lib/temporalio/version.rb +1 -1
  188. data/lib/temporalio/worker/activity_runner.rb +26 -4
  189. data/lib/temporalio/worker/activity_worker.rb +44 -18
  190. data/lib/temporalio/worker/sync_worker.rb +47 -11
  191. data/lib/temporalio/worker.rb +27 -21
  192. data/lib/temporalio/workflow/async.rb +46 -0
  193. data/lib/temporalio/workflow/future.rb +138 -0
  194. data/lib/temporalio/workflow/info.rb +76 -0
  195. data/temporalio.gemspec +4 -3
  196. metadata +67 -17
  197. data/bridge/sdk-core/Cargo.lock +0 -2606
  198. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +0 -87
  199. data/lib/bridge.so +0 -0
  200. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +0 -25
  201. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +0 -49
  202. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +0 -222
@@ -21,7 +21,7 @@ use super::{
21
21
  workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
22
22
  OnEventWrapper, WFMachinesAdapter, WFMachinesError,
23
23
  };
24
- use crate::protosext::HistoryEventExt;
24
+ use crate::{protosext::HistoryEventExt, worker::workflow::machines::HistEventData};
25
25
  use rustfsm::{fsm, TransitionResult};
26
26
  use std::convert::TryFrom;
27
27
  use temporal_sdk_core_protos::{
@@ -201,15 +201,15 @@ impl TryFrom<CommandType> for PatchMachineEvents {
201
201
  }
202
202
  }
203
203
 
204
- impl TryFrom<HistoryEvent> for PatchMachineEvents {
204
+ impl TryFrom<HistEventData> for PatchMachineEvents {
205
205
  type Error = WFMachinesError;
206
206
 
207
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
207
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
208
+ let e = e.event;
208
209
  match e.get_patch_marker_details() {
209
210
  Some((id, _)) => Ok(Self::MarkerRecorded(id)),
210
211
  _ => Err(WFMachinesError::Nondeterminism(format!(
211
- "Change machine cannot handle this event: {}",
212
- e
212
+ "Change machine cannot handle this event: {e}"
213
213
  ))),
214
214
  }
215
215
  }
@@ -238,15 +238,14 @@ mod tests {
238
238
  common::v1::ActivityType,
239
239
  enums::v1::{CommandType, EventType},
240
240
  history::v1::{
241
- history_event, ActivityTaskCompletedEventAttributes,
242
- ActivityTaskScheduledEventAttributes, ActivityTaskStartedEventAttributes,
243
- TimerFiredEventAttributes,
241
+ ActivityTaskCompletedEventAttributes, ActivityTaskScheduledEventAttributes,
242
+ ActivityTaskStartedEventAttributes, TimerFiredEventAttributes,
244
243
  },
245
244
  },
246
245
  };
247
246
 
248
247
  const MY_PATCH_ID: &str = "test_patch_id";
249
- #[derive(Eq, PartialEq, Copy, Clone)]
248
+ #[derive(Eq, PartialEq, Copy, Clone, Debug)]
250
249
  enum MarkerType {
251
250
  Deprecated,
252
251
  NotDeprecated,
@@ -267,7 +266,11 @@ mod tests {
267
266
  /// EVENT_TYPE_WORKFLOW_TASK_STARTED
268
267
  /// EVENT_TYPE_WORKFLOW_TASK_COMPLETED
269
268
  /// EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED
270
- fn patch_marker_single_activity(marker_type: MarkerType) -> TestHistoryBuilder {
269
+ fn patch_marker_single_activity(
270
+ marker_type: MarkerType,
271
+ version: usize,
272
+ replay: bool,
273
+ ) -> TestHistoryBuilder {
271
274
  let mut t = TestHistoryBuilder::default();
272
275
  t.add_by_type(EventType::WorkflowExecutionStarted);
273
276
  t.add_full_wf_task();
@@ -277,41 +280,41 @@ mod tests {
277
280
  MarkerType::NoMarker => {}
278
281
  };
279
282
 
280
- let scheduled_event_id = t.add_get_event_id(
281
- EventType::ActivityTaskScheduled,
282
- Some(
283
- history_event::Attributes::ActivityTaskScheduledEventAttributes(
284
- ActivityTaskScheduledEventAttributes {
285
- activity_id: "0".to_string(),
286
- activity_type: Some(ActivityType {
287
- name: "".to_string(),
288
- }),
289
- ..Default::default()
290
- },
291
- ),
292
- ),
293
- );
294
- let started_event_id = t.add_get_event_id(
295
- EventType::ActivityTaskStarted,
296
- Some(
297
- history_event::Attributes::ActivityTaskStartedEventAttributes(
298
- ActivityTaskStartedEventAttributes {
299
- scheduled_event_id,
300
- ..Default::default()
301
- },
302
- ),
303
- ),
304
- );
305
- t.add(
306
- EventType::ActivityTaskCompleted,
307
- history_event::Attributes::ActivityTaskCompletedEventAttributes(
308
- ActivityTaskCompletedEventAttributes {
309
- scheduled_event_id,
310
- started_event_id,
311
- ..Default::default()
312
- },
313
- ),
314
- );
283
+ let activity_id = if replay {
284
+ match (marker_type, version) {
285
+ (_, 1) => "no_change",
286
+ (MarkerType::NotDeprecated, 2) => "had_change",
287
+ (MarkerType::Deprecated, 2) => "had_change",
288
+ (MarkerType::NoMarker, 2) => "no_change",
289
+ (_, 3) => "had_change",
290
+ (_, 4) => "had_change",
291
+ v => panic!("Nonsense marker / version combo {v:?}"),
292
+ }
293
+ } else {
294
+ // If the workflow isn't replaying (we're creating history here for a workflow which
295
+ // wasn't replaying at the time of scheduling the activity, and has done that, and now
296
+ // we're feeding back the history it would have produced) then it always has the change,
297
+ // except in v1.
298
+ if version > 1 {
299
+ "had_change"
300
+ } else {
301
+ "no_change"
302
+ }
303
+ };
304
+
305
+ let scheduled_event_id = t.add(ActivityTaskScheduledEventAttributes {
306
+ activity_id: activity_id.to_string(),
307
+ ..Default::default()
308
+ });
309
+ let started_event_id = t.add(ActivityTaskStartedEventAttributes {
310
+ scheduled_event_id,
311
+ ..Default::default()
312
+ });
313
+ t.add(ActivityTaskCompletedEventAttributes {
314
+ scheduled_event_id,
315
+ started_event_id,
316
+ ..Default::default()
317
+ });
315
318
  t.add_full_wf_task();
316
319
  t.add_workflow_execution_completed();
317
320
  t
@@ -384,7 +387,7 @@ mod tests {
384
387
  Ok(().into())
385
388
  });
386
389
 
387
- let t = patch_marker_single_activity(marker_type);
390
+ let t = patch_marker_single_activity(marker_type, workflow_version, replaying);
388
391
  let histinfo = if replaying {
389
392
  t.get_full_history_info()
390
393
  } else {
@@ -422,7 +425,7 @@ mod tests {
422
425
  } else {
423
426
  // Feed more history
424
427
  wfm.new_history(
425
- patch_marker_single_activity(marker_type)
428
+ patch_marker_single_activity(marker_type, wf_version, replaying)
426
429
  .get_full_history_info()
427
430
  .unwrap()
428
431
  .into(),
@@ -516,7 +519,7 @@ mod tests {
516
519
  // and the history should have the has-change timer. v3 of course always has the change
517
520
  // regardless.
518
521
  wfm.new_history(
519
- patch_marker_single_activity(marker_type)
522
+ patch_marker_single_activity(marker_type, wf_version, replaying)
520
523
  .get_full_history_info()
521
524
  .unwrap()
522
525
  .into(),
@@ -565,118 +568,66 @@ mod tests {
565
568
  t.add_full_wf_task();
566
569
  if have_marker_in_hist {
567
570
  t.add_has_change_marker(MY_PATCH_ID, false);
568
- let scheduled_event_id = t.add_get_event_id(
569
- EventType::ActivityTaskScheduled,
570
- Some(
571
- history_event::Attributes::ActivityTaskScheduledEventAttributes(
572
- ActivityTaskScheduledEventAttributes {
573
- activity_id: "1".to_owned(),
574
- activity_type: Some(ActivityType {
575
- name: "".to_string(),
576
- }),
577
- ..Default::default()
578
- },
579
- ),
580
- ),
581
- );
582
- let started_event_id = t.add_get_event_id(
583
- EventType::ActivityTaskStarted,
584
- Some(
585
- history_event::Attributes::ActivityTaskStartedEventAttributes(
586
- ActivityTaskStartedEventAttributes {
587
- scheduled_event_id,
588
- ..Default::default()
589
- },
590
- ),
591
- ),
592
- );
593
- t.add(
594
- EventType::ActivityTaskCompleted,
595
- history_event::Attributes::ActivityTaskCompletedEventAttributes(
596
- ActivityTaskCompletedEventAttributes {
597
- scheduled_event_id,
598
- started_event_id,
599
- // TODO result: Some(Payloads { payloads: vec![Payload{ metadata: Default::default(), data: vec![] }] }),
600
- ..Default::default()
601
- },
602
- ),
603
- );
604
- t.add_full_wf_task();
605
- let timer_started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
606
- t.add(
607
- EventType::TimerFired,
608
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
609
- started_event_id: timer_started_event_id,
610
- timer_id: "1".to_owned(),
571
+ let scheduled_event_id = t.add(ActivityTaskScheduledEventAttributes {
572
+ activity_id: "1".to_owned(),
573
+ activity_type: Some(ActivityType {
574
+ name: "".to_string(),
611
575
  }),
612
- );
576
+ ..Default::default()
577
+ });
578
+ let started_event_id = t.add(ActivityTaskStartedEventAttributes {
579
+ scheduled_event_id,
580
+ ..Default::default()
581
+ });
582
+ t.add(ActivityTaskCompletedEventAttributes {
583
+ scheduled_event_id,
584
+ started_event_id,
585
+ ..Default::default()
586
+ });
587
+ t.add_full_wf_task();
588
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
589
+ t.add(TimerFiredEventAttributes {
590
+ started_event_id: timer_started_event_id,
591
+ timer_id: "1".to_owned(),
592
+ });
613
593
  } else {
614
- let started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
615
- t.add(
616
- EventType::TimerFired,
617
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
618
- started_event_id,
619
- timer_id: "1".to_owned(),
620
- }),
621
- );
594
+ let started_event_id = t.add_by_type(EventType::TimerStarted);
595
+ t.add(TimerFiredEventAttributes {
596
+ started_event_id,
597
+ timer_id: "1".to_owned(),
598
+ });
622
599
  t.add_full_wf_task();
623
- let timer_started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
624
- t.add(
625
- EventType::TimerFired,
626
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
627
- started_event_id: timer_started_event_id,
628
- timer_id: "2".to_owned(),
629
- }),
630
- );
600
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
601
+ t.add(TimerFiredEventAttributes {
602
+ started_event_id: timer_started_event_id,
603
+ timer_id: "2".to_owned(),
604
+ });
631
605
  }
632
606
  t.add_full_wf_task();
633
607
 
634
608
  if have_marker_in_hist {
635
- let scheduled_event_id = t.add_get_event_id(
636
- EventType::ActivityTaskScheduled,
637
- Some(
638
- history_event::Attributes::ActivityTaskScheduledEventAttributes(
639
- ActivityTaskScheduledEventAttributes {
640
- activity_id: "2".to_string(),
641
- activity_type: Some(ActivityType {
642
- name: "".to_string(),
643
- }),
644
- ..Default::default()
645
- },
646
- ),
647
- ),
648
- );
649
- let started_event_id = t.add_get_event_id(
650
- EventType::ActivityTaskStarted,
651
- Some(
652
- history_event::Attributes::ActivityTaskStartedEventAttributes(
653
- ActivityTaskStartedEventAttributes {
654
- scheduled_event_id,
655
- ..Default::default()
656
- },
657
- ),
658
- ),
659
- );
660
- t.add(
661
- EventType::ActivityTaskCompleted,
662
- history_event::Attributes::ActivityTaskCompletedEventAttributes(
663
- ActivityTaskCompletedEventAttributes {
664
- scheduled_event_id,
665
- started_event_id,
666
- // TODO result: Some(Payloads { payloads: vec![Payload{ metadata: Default::default(), data: vec![] }] }),
667
- ..Default::default()
668
- },
669
- ),
670
- );
671
- } else {
672
- let started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
673
- t.add(
674
- EventType::TimerFired,
675
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
676
- started_event_id,
677
- timer_id: "3".to_owned(),
609
+ let scheduled_event_id = t.add(ActivityTaskScheduledEventAttributes {
610
+ activity_id: "2".to_string(),
611
+ activity_type: Some(ActivityType {
612
+ name: "".to_string(),
678
613
  }),
679
- );
614
+ ..Default::default()
615
+ });
616
+ let started_event_id = t.add(ActivityTaskStartedEventAttributes {
617
+ scheduled_event_id,
618
+ ..Default::default()
619
+ });
620
+ t.add(ActivityTaskCompletedEventAttributes {
621
+ scheduled_event_id,
622
+ started_event_id,
623
+ ..Default::default()
624
+ });
625
+ } else {
626
+ let started_event_id = t.add_by_type(EventType::TimerStarted);
627
+ t.add(TimerFiredEventAttributes {
628
+ started_event_id,
629
+ timer_id: "3".to_owned(),
630
+ });
680
631
  }
681
632
  t.add_full_wf_task();
682
633
  t.add_workflow_execution_completed();
@@ -2,6 +2,7 @@ use super::{
2
2
  workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
3
3
  OnEventWrapper, WFMachinesAdapter, WFMachinesError,
4
4
  };
5
+ use crate::worker::workflow::machines::HistEventData;
5
6
  use rustfsm::{fsm, MachineError, TransitionResult};
6
7
  use std::convert::TryFrom;
7
8
  use temporal_sdk_core_protos::{
@@ -183,10 +184,11 @@ impl TryFrom<CommandType> for SignalExternalMachineEvents {
183
184
  })
184
185
  }
185
186
  }
186
- impl TryFrom<HistoryEvent> for SignalExternalMachineEvents {
187
+ impl TryFrom<HistEventData> for SignalExternalMachineEvents {
187
188
  type Error = WFMachinesError;
188
189
 
189
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
190
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
191
+ let e = e.event;
190
192
  Ok(match e.event_type() {
191
193
  EventType::ExternalWorkflowExecutionSignaled => Self::ExternalWorkflowExecutionSignaled,
192
194
  EventType::SignalExternalWorkflowExecutionInitiated => {
@@ -202,15 +204,13 @@ impl TryFrom<HistoryEvent> for SignalExternalMachineEvents {
202
204
  Self::SignalExternalWorkflowExecutionFailed(attrs.cause())
203
205
  } else {
204
206
  return Err(WFMachinesError::Fatal(format!(
205
- "Signal workflow failed attributes were unset: {}",
206
- e
207
+ "Signal workflow failed attributes were unset: {e}"
207
208
  )));
208
209
  }
209
210
  }
210
211
  _ => {
211
212
  return Err(WFMachinesError::Nondeterminism(format!(
212
- "Signal external WF machine does not handle this event: {}",
213
- e
213
+ "Signal external WF machine does not handle this event: {e}"
214
214
  )))
215
215
  }
216
216
  })
@@ -242,7 +242,7 @@ impl WFMachinesAdapter for SignalExternalMachine {
242
242
  seq: self.shared_state.seq,
243
243
  // TODO: Create new failure type upstream for this
244
244
  failure: Some(Failure {
245
- message: format!("Unable to signal external workflow because {}", reason),
245
+ message: format!("Unable to signal external workflow because {reason}"),
246
246
  failure_info: Some(FailureInfo::ApplicationFailureInfo(
247
247
  ApplicationFailureInfo {
248
248
  r#type: f.to_string(),
@@ -1,9 +1,10 @@
1
1
  #![allow(clippy::large_enum_variant)]
2
2
 
3
3
  use super::{
4
- workflow_machines::{MachineResponse, WFMachinesError},
5
- Cancellable, EventInfo, NewMachineWithCommand, OnEventWrapper, WFMachinesAdapter,
4
+ workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
5
+ OnEventWrapper, WFMachinesAdapter,
6
6
  };
7
+ use crate::worker::workflow::{machines::HistEventData, WFMachinesError};
7
8
  use rustfsm::{fsm, MachineError, StateMachine, TransitionResult};
8
9
  use std::convert::TryFrom;
9
10
  use temporal_sdk_core_protos::{
@@ -93,10 +94,11 @@ impl TimerMachine {
93
94
  }
94
95
  }
95
96
 
96
- impl TryFrom<HistoryEvent> for TimerMachineEvents {
97
+ impl TryFrom<HistEventData> for TimerMachineEvents {
97
98
  type Error = WFMachinesError;
98
99
 
99
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
100
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
101
+ let e = e.event;
100
102
  Ok(match e.event_type() {
101
103
  EventType::TimerStarted => Self::TimerStarted(e.event_id),
102
104
  EventType::TimerCanceled => Self::TimerCanceled,
@@ -107,15 +109,13 @@ impl TryFrom<HistoryEvent> for TimerMachineEvents {
107
109
  Self::TimerFired(attrs)
108
110
  } else {
109
111
  return Err(WFMachinesError::Fatal(format!(
110
- "Timer fired attribs were unset: {}",
111
- e
112
+ "Timer fired attribs were unset: {e}"
112
113
  )));
113
114
  }
114
115
  }
115
116
  _ => {
116
117
  return Err(WFMachinesError::Nondeterminism(format!(
117
- "Timer machine does not handle this event: {}",
118
- e
118
+ "Timer machine does not handle this event: {e}"
119
119
  )))
120
120
  }
121
121
  })
@@ -256,7 +256,7 @@ impl Cancellable for TimerMachine {
256
256
  vec![MachineResponse::IssueNewCommand(cmd)]
257
257
  }
258
258
  None => vec![],
259
- x => panic!("Invalid cancel event response {:?}", x),
259
+ x => panic!("Invalid cancel event response {x:?}"),
260
260
  },
261
261
  )
262
262
  }
@@ -144,7 +144,7 @@ mod machine_coverage_report {
144
144
  m @ "ModifyWorkflowPropertiesMachine" => {
145
145
  cover_transitions(m, &mut modify_wf_props, coverage)
146
146
  }
147
- m => panic!("Unknown machine {}", m),
147
+ m => panic!("Unknown machine {m}"),
148
148
  }
149
149
  }
150
150
  }
@@ -168,7 +168,7 @@ mod machine_coverage_report {
168
168
  let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
169
169
  d.push("machine_coverage");
170
170
  std::fs::create_dir_all(&d).unwrap();
171
- d.push(format!("{}_Coverage.puml", machine));
171
+ d.push(format!("{machine}_Coverage.puml"));
172
172
  let mut file = File::create(d).unwrap();
173
173
  file.write_all(viz.as_bytes()).unwrap();
174
174
  }
@@ -1,8 +1,8 @@
1
- use super::{
2
- workflow_machines::{MachineResponse, WFMachinesError},
3
- NewMachineWithCommand,
1
+ use super::{workflow_machines::MachineResponse, NewMachineWithCommand};
2
+ use crate::worker::workflow::{
3
+ machines::{Cancellable, EventInfo, HistEventData, WFMachinesAdapter},
4
+ WFMachinesError,
4
5
  };
5
- use crate::worker::workflow::machines::{Cancellable, EventInfo, WFMachinesAdapter};
6
6
  use rustfsm::{fsm, TransitionResult};
7
7
  use temporal_sdk_core_protos::{
8
8
  coresdk::workflow_commands::UpsertWorkflowSearchAttributes,
@@ -109,10 +109,11 @@ impl Cancellable for UpsertSearchAttributesMachine {}
109
109
  // Converts the generic history event with type EventType::UpsertWorkflowSearchAttributes into the
110
110
  // UpsertSearchAttributesMachine-specific event type
111
111
  // UpsertSearchAttributesMachineEvents::CommandRecorded.
112
- impl TryFrom<HistoryEvent> for UpsertSearchAttributesMachineEvents {
112
+ impl TryFrom<HistEventData> for UpsertSearchAttributesMachineEvents {
113
113
  type Error = WFMachinesError;
114
114
 
115
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
115
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
116
+ let e = e.event;
116
117
  match e.event_type() {
117
118
  EventType::UpsertWorkflowSearchAttributes => {
118
119
  Ok(UpsertSearchAttributesMachineEvents::CommandRecorded)
@@ -229,7 +230,13 @@ mod tests {
229
230
  ..Default::default()
230
231
  };
231
232
  assert!(sm.matches_event(&recorded_history_event));
232
- let cmd_recorded_sm_event = recorded_history_event.try_into().unwrap();
233
+ let cmd_recorded_sm_event = HistEventData {
234
+ event: recorded_history_event,
235
+ replaying: false,
236
+ current_task_is_last_in_history: true,
237
+ }
238
+ .try_into()
239
+ .unwrap();
233
240
 
234
241
  OnEventWrapper::on_event_mut(&mut sm, cmd_scheduled_sm_event)
235
242
  .expect("CommandScheduled should transition Created -> CommandIssued");
@@ -1,15 +1,13 @@
1
- use super::super::{local_activity_state_machine::ResolveDat, WFMachinesError};
1
+ use super::super::local_activity_state_machine::ResolveDat;
2
2
  use crate::{
3
- protosext::{HistoryEventExt, ValidScheduleLA},
3
+ protosext::{CompleteLocalActivityData, ValidScheduleLA},
4
4
  worker::{ExecutingLAId, LocalActRequest, NewLocalAct},
5
5
  };
6
6
  use std::{
7
7
  collections::{HashMap, HashSet},
8
8
  time::SystemTime,
9
9
  };
10
- use temporal_sdk_core_protos::temporal::api::{
11
- common::v1::WorkflowExecution, history::v1::HistoryEvent,
12
- };
10
+ use temporal_sdk_core_protos::temporal::api::common::v1::WorkflowExecution;
13
11
 
14
12
  #[derive(Default)]
15
13
  pub(super) struct LocalActivityData {
@@ -70,17 +68,8 @@ impl LocalActivityData {
70
68
  self.executing.len() + self.new_requests.len()
71
69
  }
72
70
 
73
- pub(super) fn process_peekahead_marker(&mut self, e: &HistoryEvent) -> super::Result<()> {
74
- if let Some(la_dat) = e.clone().into_local_activity_marker_details() {
75
- self.preresolutions
76
- .insert(la_dat.marker_dat.seq, la_dat.into());
77
- } else {
78
- return Err(WFMachinesError::Fatal(format!(
79
- "Local activity marker was unparsable: {:?}",
80
- e
81
- )));
82
- }
83
- Ok(())
71
+ pub(super) fn insert_peeked_marker(&mut self, dat: CompleteLocalActivityData) {
72
+ self.preresolutions.insert(dat.marker_dat.seq, dat.into());
84
73
  }
85
74
 
86
75
  pub(super) fn take_preresolution(&mut self, seq: u32) -> Option<ResolveDat> {