temporalio 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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]