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
@@ -10,6 +10,7 @@ use crate::{
10
10
  ActivityHeartbeat, Worker, WorkerConfigBuilder,
11
11
  };
12
12
  use futures::FutureExt;
13
+ use itertools::Itertools;
13
14
  use std::{
14
15
  cell::RefCell,
15
16
  collections::{hash_map::Entry, HashMap, VecDeque},
@@ -23,7 +24,6 @@ use std::{
23
24
  use temporal_client::WorkflowOptions;
24
25
  use temporal_sdk::{ActivityOptions, WfContext};
25
26
  use temporal_sdk_core_api::{errors::CompleteActivityError, Worker as WorkerTrait};
26
- use temporal_sdk_core_protos::temporal::api::command::v1::ScheduleActivityTaskCommandAttributes;
27
27
  use temporal_sdk_core_protos::{
28
28
  coresdk::{
29
29
  activity_result::{
@@ -40,7 +40,7 @@ use temporal_sdk_core_protos::{
40
40
  ActivityTaskCompletion,
41
41
  },
42
42
  temporal::api::{
43
- command::v1::command::Attributes,
43
+ command::v1::{command::Attributes, ScheduleActivityTaskCommandAttributes},
44
44
  enums::v1::EventType,
45
45
  workflowservice::v1::{
46
46
  PollActivityTaskQueueResponse, RecordActivityTaskHeartbeatResponse,
@@ -437,7 +437,7 @@ async fn many_concurrent_heartbeat_cancels() {
437
437
  #[tokio::test]
438
438
  async fn activity_timeout_no_double_resolve() {
439
439
  let t = canned_histories::activity_double_resolve_repro();
440
- let core = build_fake_worker("fake_wf_id", t, &[3]);
440
+ let core = build_fake_worker("fake_wf_id", t, [3]);
441
441
  let activity_id = 1;
442
442
 
443
443
  poll_and_reply(
@@ -613,24 +613,105 @@ async fn max_tq_acts_set_passed_to_poll_properly() {
613
613
  worker.poll_activity_task().await.unwrap();
614
614
  }
615
615
 
616
+ /// This test doesn't test the real worker config since [mock_worker] bypasses the worker
617
+ /// constructor, [mock_worker] will not pass an activity poller to the worker when
618
+ /// `no_remote_activities` is set to `true`.
619
+ #[tokio::test]
620
+ async fn no_eager_activities_requested_when_worker_options_disable_remote_activities() {
621
+ let wfid = "fake_wf_id";
622
+ let mut t = TestHistoryBuilder::default();
623
+ t.add_by_type(EventType::WorkflowExecutionStarted);
624
+ t.add_full_wf_task();
625
+ let scheduled_event_id = t.add_activity_task_scheduled("act_id");
626
+ let started_event_id = t.add_activity_task_started(scheduled_event_id);
627
+ t.add_activity_task_completed(scheduled_event_id, started_event_id, b"hi".into());
628
+ t.add_full_wf_task();
629
+ t.add_workflow_execution_completed();
630
+ let num_eager_requested = Arc::new(AtomicUsize::new(0));
631
+ // Clone it to move into the callback below
632
+ let num_eager_requested_clone = num_eager_requested.clone();
633
+
634
+ let mut mock = mock_workflow_client();
635
+ mock.expect_complete_workflow_task()
636
+ .times(1)
637
+ .returning(move |req| {
638
+ // Store the number of eager activities requested to be checked below
639
+ let count = req
640
+ .commands
641
+ .into_iter()
642
+ .filter(|c| match c.attributes {
643
+ Some(Attributes::ScheduleActivityTaskCommandAttributes(
644
+ ScheduleActivityTaskCommandAttributes {
645
+ request_eager_execution,
646
+ ..
647
+ },
648
+ )) => request_eager_execution,
649
+ _ => false,
650
+ })
651
+ .count();
652
+ num_eager_requested_clone.store(count, Ordering::Relaxed);
653
+ Ok(RespondWorkflowTaskCompletedResponse {
654
+ workflow_task: None,
655
+ activity_tasks: vec![],
656
+ reset_history_event_id: 0,
657
+ })
658
+ });
659
+ let mut mock = single_hist_mock_sg(wfid, t, [1], mock, true);
660
+ let mut mock_poller = mock_manual_poller();
661
+ mock_poller
662
+ .expect_poll()
663
+ .returning(|| futures::future::pending().boxed());
664
+ mock.set_act_poller(Box::new(mock_poller));
665
+ mock.worker_cfg(|wc| {
666
+ wc.max_cached_workflows = 2;
667
+ wc.no_remote_activities = true;
668
+ });
669
+ let core = mock_worker(mock);
670
+
671
+ // Test start
672
+ let wf_task = core.poll_workflow_activation().await.unwrap();
673
+ let cmds = vec![ScheduleActivity {
674
+ seq: 1,
675
+ activity_id: "act_id".to_string(),
676
+ task_queue: TEST_Q.to_string(),
677
+ cancellation_type: ActivityCancellationType::TryCancel as i32,
678
+ ..Default::default()
679
+ }
680
+ .into()];
681
+
682
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
683
+ wf_task.run_id,
684
+ cmds,
685
+ ))
686
+ .await
687
+ .unwrap();
688
+
689
+ core.shutdown().await;
690
+
691
+ assert_eq!(num_eager_requested.load(Ordering::Relaxed), 0);
692
+ }
693
+
616
694
  /// This test verifies that activity tasks which come as replies to completing a WFT are properly
617
695
  /// delivered via polling.
618
696
  #[tokio::test]
619
697
  async fn activity_tasks_from_completion_are_delivered() {
698
+ // Construct the history - one task with 5 activities, 4 on the same task queue, and 1 on a
699
+ // different queue, 3 activities will be executed eagerly as specified by the
700
+ // MAX_EAGER_ACTIVITY_RESERVATIONS_PER_WORKFLOW_TASK constant.
620
701
  let wfid = "fake_wf_id";
621
702
  let mut t = TestHistoryBuilder::default();
622
703
  t.add_by_type(EventType::WorkflowExecutionStarted);
623
704
  t.add_full_wf_task();
624
- let act_same_queue_sched_id = t.add_activity_task_scheduled("act_id_same_queue");
625
- let act_different_queue_sched_id = t.add_activity_task_scheduled("act_id_different_queue");
626
- let act_same_queue_start_id = t.add_activity_task_started(act_same_queue_sched_id);
627
- t.add_activity_task_completed(
628
- act_same_queue_sched_id,
629
- act_same_queue_start_id,
630
- b"hi".into(),
631
- );
705
+ let act_same_queue_scheduled_ids = (1..4)
706
+ .map(|i| t.add_activity_task_scheduled(format!("act_id_{}_same_queue", i)))
707
+ .collect_vec();
708
+ t.add_activity_task_scheduled("act_id_same_queue_not_eager");
709
+ t.add_activity_task_scheduled("act_id_different_queue");
710
+ for scheduled_event_id in act_same_queue_scheduled_ids {
711
+ let started_event_id = t.add_activity_task_started(scheduled_event_id);
712
+ t.add_activity_task_completed(scheduled_event_id, started_event_id, b"hi".into());
713
+ }
632
714
  t.add_full_wf_task();
633
- t.add_activity_task_cancel_requested(act_different_queue_sched_id);
634
715
  t.add_workflow_execution_completed();
635
716
 
636
717
  let num_eager_requested = Arc::new(AtomicUsize::new(0));
@@ -658,15 +739,18 @@ async fn activity_tasks_from_completion_are_delivered() {
658
739
  num_eager_requested_clone.store(count, Ordering::Relaxed);
659
740
  Ok(RespondWorkflowTaskCompletedResponse {
660
741
  workflow_task: None,
661
- activity_tasks: vec![PollActivityTaskQueueResponse {
662
- task_token: vec![1],
663
- activity_id: "act_id_same_queue".to_string(),
664
- ..Default::default()
665
- }],
742
+ activity_tasks: (1..4)
743
+ .map(|i| PollActivityTaskQueueResponse {
744
+ task_token: vec![i],
745
+ activity_id: format!("act_id_{}_same_queue", i),
746
+ ..Default::default()
747
+ })
748
+ .collect_vec(),
749
+ reset_history_event_id: 0,
666
750
  })
667
751
  });
668
752
  mock.expect_complete_activity_task()
669
- .times(1)
753
+ .times(3)
670
754
  .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
671
755
  let mut mock = single_hist_mock_sg(wfid, t, [1], mock, true);
672
756
  let mut mock_poller = mock_manual_poller();
@@ -677,46 +761,65 @@ async fn activity_tasks_from_completion_are_delivered() {
677
761
  mock.worker_cfg(|wc| wc.max_cached_workflows = 2);
678
762
  let core = mock_worker(mock);
679
763
 
764
+ // Test start
680
765
  let wf_task = core.poll_workflow_activation().await.unwrap();
681
- core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
682
- wf_task.run_id,
683
- vec![
766
+ let mut cmds = (1..4)
767
+ .map(|seq| {
684
768
  ScheduleActivity {
685
- seq: 1,
686
- activity_id: "act_id_same_queue".to_string(),
769
+ seq,
770
+ activity_id: format!("act_id_{}_same_queue", seq),
687
771
  task_queue: TEST_Q.to_string(),
688
772
  cancellation_type: ActivityCancellationType::TryCancel as i32,
689
773
  ..Default::default()
690
774
  }
691
- .into(),
692
- ScheduleActivity {
693
- seq: 2,
694
- activity_id: "act_id_different_queue".to_string(),
695
- task_queue: "different_queue".to_string(),
696
- cancellation_type: ActivityCancellationType::Abandon as i32,
697
- ..Default::default()
698
- }
699
- .into(),
700
- ],
775
+ .into()
776
+ })
777
+ .collect_vec();
778
+ cmds.push(
779
+ ScheduleActivity {
780
+ seq: 4,
781
+ activity_id: "act_id_same_queue_not_eager".to_string(),
782
+ task_queue: TEST_Q.to_string(),
783
+ cancellation_type: ActivityCancellationType::TryCancel as i32,
784
+ ..Default::default()
785
+ }
786
+ .into(),
787
+ );
788
+ cmds.push(
789
+ ScheduleActivity {
790
+ seq: 5,
791
+ activity_id: "act_id_different_queue".to_string(),
792
+ task_queue: "different_queue".to_string(),
793
+ cancellation_type: ActivityCancellationType::Abandon as i32,
794
+ ..Default::default()
795
+ }
796
+ .into(),
797
+ );
798
+
799
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
800
+ wf_task.run_id,
801
+ cmds,
701
802
  ))
702
803
  .await
703
804
  .unwrap();
704
805
 
705
- // We should see the activity when we poll now
706
- let act_task = core.poll_activity_task().await.unwrap();
707
- assert_eq!(act_task.task_token, vec![1]);
806
+ // We should see the 3 eager activities when we poll now
807
+ for i in 1..4 {
808
+ let act_task = core.poll_activity_task().await.unwrap();
809
+ assert_eq!(act_task.task_token, vec![i]);
708
810
 
709
- core.complete_activity_task(ActivityTaskCompletion {
710
- task_token: act_task.task_token.clone(),
711
- result: Some(ActivityExecutionResult::ok("hi".into())),
712
- })
713
- .await
714
- .unwrap();
811
+ core.complete_activity_task(ActivityTaskCompletion {
812
+ task_token: act_task.task_token.clone(),
813
+ result: Some(ActivityExecutionResult::ok("hi".into())),
814
+ })
815
+ .await
816
+ .unwrap();
817
+ }
715
818
 
716
819
  core.shutdown().await;
717
820
 
718
821
  // Verify only a single eager activity was scheduled (the one on our worker's task queue)
719
- assert_eq!(num_eager_requested.load(Ordering::Relaxed), 1);
822
+ assert_eq!(num_eager_requested.load(Ordering::Relaxed), 3);
720
823
  }
721
824
 
722
825
  #[tokio::test]