temporalio 0.1.1 → 0.2.0

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 (585) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +4035 -0
  3. data/Cargo.toml +25 -0
  4. data/Gemfile +20 -0
  5. data/LICENSE +16 -15
  6. data/README.md +455 -195
  7. data/Rakefile +387 -0
  8. data/ext/Cargo.toml +25 -0
  9. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  10. data/lib/temporalio/activity/context.rb +82 -77
  11. data/lib/temporalio/activity/definition.rb +77 -0
  12. data/lib/temporalio/activity/info.rb +42 -46
  13. data/lib/temporalio/activity.rb +49 -65
  14. data/lib/temporalio/api/batch/v1/message.rb +31 -0
  15. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
  16. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  17. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  18. data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
  19. data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
  20. data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
  21. data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
  22. data/lib/temporalio/api/command/v1/message.rb +46 -0
  23. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  24. data/lib/temporalio/api/common/v1/message.rb +41 -0
  25. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  26. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  27. data/lib/temporalio/api/enums/v1/common.rb +26 -0
  28. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  29. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  30. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  31. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  32. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  33. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  34. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  35. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  36. data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
  37. data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
  38. data/lib/temporalio/api/export/v1/message.rb +24 -0
  39. data/lib/temporalio/api/failure/v1/message.rb +35 -0
  40. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  41. data/lib/temporalio/api/history/v1/message.rb +90 -0
  42. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  43. data/lib/temporalio/api/nexus/v1/message.rb +40 -0
  44. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  45. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  46. data/lib/temporalio/api/operatorservice.rb +3 -0
  47. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  48. data/lib/temporalio/api/query/v1/message.rb +27 -0
  49. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  50. data/lib/temporalio/api/schedule/v1/message.rb +42 -0
  51. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  52. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  53. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  54. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  55. data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
  56. data/lib/temporalio/api/update/v1/message.rb +33 -0
  57. data/lib/temporalio/api/version/v1/message.rb +26 -0
  58. data/lib/temporalio/api/workflow/v1/message.rb +43 -0
  59. data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
  60. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  61. data/lib/temporalio/api/workflowservice.rb +3 -0
  62. data/lib/temporalio/api.rb +13 -0
  63. data/lib/temporalio/cancellation.rb +150 -0
  64. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  65. data/lib/temporalio/client/async_activity_handle.rb +110 -0
  66. data/lib/temporalio/client/connection/cloud_service.rb +648 -0
  67. data/lib/temporalio/client/connection/operator_service.rb +249 -0
  68. data/lib/temporalio/client/connection/service.rb +41 -0
  69. data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
  70. data/lib/temporalio/client/connection.rb +270 -0
  71. data/lib/temporalio/client/interceptor.rb +316 -0
  72. data/lib/temporalio/client/workflow_execution.rb +103 -0
  73. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  74. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  75. data/lib/temporalio/client/workflow_handle.rb +380 -177
  76. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  77. data/lib/temporalio/client/workflow_update_handle.rb +67 -0
  78. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  79. data/lib/temporalio/client.rb +366 -93
  80. data/lib/temporalio/common_enums.rb +24 -0
  81. data/lib/temporalio/converters/data_converter.rb +102 -0
  82. data/lib/temporalio/converters/failure_converter.rb +200 -0
  83. data/lib/temporalio/converters/payload_codec.rb +26 -0
  84. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  85. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  86. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  87. data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
  88. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  89. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  90. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  91. data/lib/temporalio/converters/payload_converter.rb +73 -0
  92. data/lib/temporalio/converters.rb +9 -0
  93. data/lib/temporalio/error/failure.rb +119 -94
  94. data/lib/temporalio/error.rb +147 -0
  95. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  96. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
  97. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  98. data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
  99. data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
  100. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  101. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
  102. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
  103. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
  104. data/lib/temporalio/internal/bridge/api.rb +3 -0
  105. data/lib/temporalio/internal/bridge/client.rb +90 -0
  106. data/lib/temporalio/internal/bridge/runtime.rb +53 -0
  107. data/lib/temporalio/internal/bridge/testing.rb +46 -0
  108. data/lib/temporalio/internal/bridge/worker.rb +83 -0
  109. data/lib/temporalio/internal/bridge.rb +36 -0
  110. data/lib/temporalio/internal/client/implementation.rb +525 -0
  111. data/lib/temporalio/internal/proto_utils.rb +54 -0
  112. data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
  113. data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
  114. data/lib/temporalio/internal.rb +7 -0
  115. data/lib/temporalio/retry_policy.rb +39 -80
  116. data/lib/temporalio/runtime.rb +259 -13
  117. data/lib/temporalio/scoped_logger.rb +96 -0
  118. data/lib/temporalio/search_attributes.rb +300 -0
  119. data/lib/temporalio/testing/activity_environment.rb +132 -0
  120. data/lib/temporalio/testing/workflow_environment.rb +113 -88
  121. data/lib/temporalio/testing.rb +4 -169
  122. data/lib/temporalio/version.rb +3 -1
  123. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  124. data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
  125. data/lib/temporalio/worker/activity_executor.rb +55 -0
  126. data/lib/temporalio/worker/interceptor.rb +88 -0
  127. data/lib/temporalio/worker/tuner.rb +151 -0
  128. data/lib/temporalio/worker.rb +385 -163
  129. data/lib/temporalio/workflow_history.rb +22 -0
  130. data/lib/temporalio.rb +2 -7
  131. data/temporalio.gemspec +20 -39
  132. metadata +131 -712
  133. data/bridge/Cargo.lock +0 -2997
  134. data/bridge/Cargo.toml +0 -29
  135. data/bridge/sdk-core/ARCHITECTURE.md +0 -76
  136. data/bridge/sdk-core/Cargo.toml +0 -2
  137. data/bridge/sdk-core/LICENSE.txt +0 -23
  138. data/bridge/sdk-core/README.md +0 -117
  139. data/bridge/sdk-core/arch_docs/diagrams/README.md +0 -10
  140. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +0 -40
  141. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
  142. data/bridge/sdk-core/arch_docs/sticky_queues.md +0 -51
  143. data/bridge/sdk-core/client/Cargo.toml +0 -40
  144. data/bridge/sdk-core/client/LICENSE.txt +0 -23
  145. data/bridge/sdk-core/client/src/lib.rs +0 -1462
  146. data/bridge/sdk-core/client/src/metrics.rs +0 -174
  147. data/bridge/sdk-core/client/src/raw.rs +0 -932
  148. data/bridge/sdk-core/client/src/retry.rs +0 -763
  149. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +0 -185
  150. data/bridge/sdk-core/core/Cargo.toml +0 -129
  151. data/bridge/sdk-core/core/LICENSE.txt +0 -23
  152. data/bridge/sdk-core/core/benches/workflow_replay.rs +0 -76
  153. data/bridge/sdk-core/core/src/abstractions.rs +0 -355
  154. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +0 -1049
  155. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +0 -221
  156. data/bridge/sdk-core/core/src/core_tests/determinism.rs +0 -270
  157. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +0 -1046
  158. data/bridge/sdk-core/core/src/core_tests/mod.rs +0 -100
  159. data/bridge/sdk-core/core/src/core_tests/queries.rs +0 -893
  160. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +0 -65
  161. data/bridge/sdk-core/core/src/core_tests/workers.rs +0 -257
  162. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +0 -124
  163. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +0 -2433
  164. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +0 -609
  165. data/bridge/sdk-core/core/src/internal_flags.rs +0 -136
  166. data/bridge/sdk-core/core/src/lib.rs +0 -289
  167. data/bridge/sdk-core/core/src/pollers/mod.rs +0 -54
  168. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +0 -297
  169. data/bridge/sdk-core/core/src/protosext/mod.rs +0 -428
  170. data/bridge/sdk-core/core/src/replay/mod.rs +0 -215
  171. data/bridge/sdk-core/core/src/retry_logic.rs +0 -202
  172. data/bridge/sdk-core/core/src/telemetry/log_export.rs +0 -190
  173. data/bridge/sdk-core/core/src/telemetry/metrics.rs +0 -462
  174. data/bridge/sdk-core/core/src/telemetry/mod.rs +0 -423
  175. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +0 -83
  176. data/bridge/sdk-core/core/src/test_help/mod.rs +0 -939
  177. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +0 -536
  178. data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +0 -89
  179. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +0 -1278
  180. data/bridge/sdk-core/core/src/worker/activities.rs +0 -557
  181. data/bridge/sdk-core/core/src/worker/client/mocks.rs +0 -107
  182. data/bridge/sdk-core/core/src/worker/client.rs +0 -389
  183. data/bridge/sdk-core/core/src/worker/mod.rs +0 -677
  184. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +0 -35
  185. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +0 -99
  186. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +0 -1111
  187. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +0 -964
  188. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -294
  189. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -168
  190. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +0 -918
  191. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +0 -137
  192. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -158
  193. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +0 -130
  194. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +0 -1525
  195. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +0 -324
  196. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -179
  197. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -659
  198. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -439
  199. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +0 -435
  200. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +0 -175
  201. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +0 -249
  202. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +0 -85
  203. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +0 -1280
  204. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +0 -269
  205. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +0 -213
  206. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +0 -1305
  207. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +0 -1276
  208. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +0 -128
  209. data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +0 -125
  210. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +0 -85
  211. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +0 -117
  212. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +0 -24
  213. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +0 -715
  214. data/bridge/sdk-core/core-api/Cargo.toml +0 -33
  215. data/bridge/sdk-core/core-api/LICENSE.txt +0 -23
  216. data/bridge/sdk-core/core-api/src/errors.rs +0 -62
  217. data/bridge/sdk-core/core-api/src/lib.rs +0 -113
  218. data/bridge/sdk-core/core-api/src/telemetry.rs +0 -141
  219. data/bridge/sdk-core/core-api/src/worker.rs +0 -161
  220. data/bridge/sdk-core/etc/deps.svg +0 -162
  221. data/bridge/sdk-core/etc/dynamic-config.yaml +0 -2
  222. data/bridge/sdk-core/etc/otel-collector-config.yaml +0 -36
  223. data/bridge/sdk-core/etc/prometheus.yaml +0 -6
  224. data/bridge/sdk-core/etc/regen-depgraph.sh +0 -5
  225. data/bridge/sdk-core/fsm/Cargo.toml +0 -18
  226. data/bridge/sdk-core/fsm/LICENSE.txt +0 -23
  227. data/bridge/sdk-core/fsm/README.md +0 -3
  228. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +0 -27
  229. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +0 -23
  230. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +0 -650
  231. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +0 -8
  232. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +0 -18
  233. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +0 -12
  234. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +0 -41
  235. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +0 -14
  236. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +0 -11
  237. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +0 -32
  238. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +0 -31
  239. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +0 -46
  240. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +0 -29
  241. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +0 -12
  242. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +0 -32
  243. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +0 -18
  244. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +0 -5
  245. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +0 -11
  246. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +0 -5
  247. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +0 -11
  248. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +0 -5
  249. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +0 -14
  250. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +0 -23
  251. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +0 -254
  252. data/bridge/sdk-core/fsm/src/lib.rs +0 -2
  253. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  254. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  255. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  256. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  257. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  258. data/bridge/sdk-core/integ-with-otel.sh +0 -7
  259. data/bridge/sdk-core/protos/api_upstream/README.md +0 -9
  260. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +0 -40
  261. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -9
  262. data/bridge/sdk-core/protos/api_upstream/build/go.mod +0 -7
  263. data/bridge/sdk-core/protos/api_upstream/build/go.sum +0 -5
  264. data/bridge/sdk-core/protos/api_upstream/build/tools.go +0 -29
  265. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +0 -141
  266. data/bridge/sdk-core/protos/api_upstream/go.mod +0 -6
  267. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +0 -89
  268. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +0 -248
  269. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +0 -123
  270. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -47
  271. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -52
  272. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +0 -56
  273. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +0 -170
  274. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -123
  275. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -51
  276. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -50
  277. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -41
  278. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -60
  279. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -59
  280. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -56
  281. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +0 -122
  282. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -108
  283. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +0 -114
  284. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -56
  285. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +0 -787
  286. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +0 -99
  287. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -124
  288. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -80
  289. data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -57
  290. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +0 -61
  291. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -55
  292. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -379
  293. data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -63
  294. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +0 -108
  295. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +0 -111
  296. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +0 -59
  297. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +0 -146
  298. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +0 -1199
  299. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +0 -415
  300. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +0 -63
  301. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +0 -79
  302. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +0 -80
  303. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -78
  304. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +0 -16
  305. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +0 -31
  306. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +0 -31
  307. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +0 -270
  308. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +0 -305
  309. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -35
  310. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +0 -38
  311. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +0 -13
  312. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +0 -141
  313. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -63
  314. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -90
  315. data/bridge/sdk-core/rustfmt.toml +0 -1
  316. data/bridge/sdk-core/sdk/Cargo.toml +0 -48
  317. data/bridge/sdk-core/sdk/LICENSE.txt +0 -23
  318. data/bridge/sdk-core/sdk/src/activity_context.rs +0 -230
  319. data/bridge/sdk-core/sdk/src/app_data.rs +0 -37
  320. data/bridge/sdk-core/sdk/src/interceptors.rs +0 -50
  321. data/bridge/sdk-core/sdk/src/lib.rs +0 -861
  322. data/bridge/sdk-core/sdk/src/payload_converter.rs +0 -11
  323. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +0 -295
  324. data/bridge/sdk-core/sdk/src/workflow_context.rs +0 -694
  325. data/bridge/sdk-core/sdk/src/workflow_future.rs +0 -500
  326. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +0 -33
  327. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +0 -23
  328. data/bridge/sdk-core/sdk-core-protos/build.rs +0 -142
  329. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +0 -7
  330. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +0 -557
  331. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +0 -234
  332. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +0 -2088
  333. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +0 -48
  334. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +0 -14
  335. data/bridge/sdk-core/test-utils/Cargo.toml +0 -38
  336. data/bridge/sdk-core/test-utils/src/canned_histories.rs +0 -1389
  337. data/bridge/sdk-core/test-utils/src/histfetch.rs +0 -28
  338. data/bridge/sdk-core/test-utils/src/lib.rs +0 -709
  339. data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +0 -50
  340. data/bridge/sdk-core/test-utils/src/workflows.rs +0 -29
  341. data/bridge/sdk-core/tests/fuzzy_workflow.rs +0 -130
  342. data/bridge/sdk-core/tests/heavy_tests.rs +0 -265
  343. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +0 -36
  344. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +0 -150
  345. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +0 -223
  346. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +0 -239
  347. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -90
  348. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +0 -314
  349. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +0 -151
  350. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +0 -902
  351. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
  352. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +0 -60
  353. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +0 -51
  354. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +0 -51
  355. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +0 -64
  356. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +0 -47
  357. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +0 -669
  358. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +0 -54
  359. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +0 -92
  360. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +0 -228
  361. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +0 -94
  362. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +0 -171
  363. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +0 -85
  364. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +0 -120
  365. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +0 -77
  366. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +0 -596
  367. data/bridge/sdk-core/tests/main.rs +0 -103
  368. data/bridge/sdk-core/tests/runner.rs +0 -132
  369. data/bridge/sdk-core/tests/wf_input_replay.rs +0 -32
  370. data/bridge/src/connection.rs +0 -202
  371. data/bridge/src/lib.rs +0 -494
  372. data/bridge/src/runtime.rs +0 -54
  373. data/bridge/src/test_server.rs +0 -153
  374. data/bridge/src/worker.rs +0 -197
  375. data/ext/Rakefile +0 -9
  376. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +0 -14
  377. data/lib/gen/temporal/api/batch/v1/message_pb.rb +0 -50
  378. data/lib/gen/temporal/api/command/v1/message_pb.rb +0 -160
  379. data/lib/gen/temporal/api/common/v1/message_pb.rb +0 -73
  380. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +0 -33
  381. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +0 -37
  382. data/lib/gen/temporal/api/enums/v1/common_pb.rb +0 -42
  383. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +0 -68
  384. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +0 -79
  385. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +0 -37
  386. data/lib/gen/temporal/api/enums/v1/query_pb.rb +0 -31
  387. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +0 -24
  388. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +0 -28
  389. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +0 -30
  390. data/lib/gen/temporal/api/enums/v1/update_pb.rb +0 -25
  391. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +0 -89
  392. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +0 -84
  393. data/lib/gen/temporal/api/failure/v1/message_pb.rb +0 -83
  394. data/lib/gen/temporal/api/filter/v1/message_pb.rb +0 -40
  395. data/lib/gen/temporal/api/history/v1/message_pb.rb +0 -498
  396. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +0 -64
  397. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +0 -88
  398. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +0 -20
  399. data/lib/gen/temporal/api/protocol/v1/message_pb.rb +0 -30
  400. data/lib/gen/temporal/api/query/v1/message_pb.rb +0 -38
  401. data/lib/gen/temporal/api/replication/v1/message_pb.rb +0 -37
  402. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +0 -149
  403. data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +0 -23
  404. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +0 -73
  405. data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +0 -49
  406. data/lib/gen/temporal/api/testservice/v1/service_pb.rb +0 -21
  407. data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -72
  408. data/lib/gen/temporal/api/version/v1/message_pb.rb +0 -41
  409. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +0 -111
  410. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +0 -798
  411. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +0 -20
  412. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +0 -62
  413. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +0 -61
  414. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +0 -61
  415. data/lib/gen/temporal/sdk/core/common/common_pb.rb +0 -26
  416. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +0 -40
  417. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +0 -31
  418. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +0 -171
  419. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +0 -200
  420. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +0 -41
  421. data/lib/temporalio/bridge/connect_options.rb +0 -15
  422. data/lib/temporalio/bridge/error.rb +0 -8
  423. data/lib/temporalio/bridge/retry_config.rb +0 -24
  424. data/lib/temporalio/bridge/tls_options.rb +0 -19
  425. data/lib/temporalio/bridge.rb +0 -14
  426. data/lib/temporalio/client/implementation.rb +0 -340
  427. data/lib/temporalio/connection/retry_config.rb +0 -44
  428. data/lib/temporalio/connection/service.rb +0 -20
  429. data/lib/temporalio/connection/test_service.rb +0 -92
  430. data/lib/temporalio/connection/tls_options.rb +0 -51
  431. data/lib/temporalio/connection/workflow_service.rb +0 -731
  432. data/lib/temporalio/connection.rb +0 -86
  433. data/lib/temporalio/data_converter.rb +0 -191
  434. data/lib/temporalio/error/workflow_failure.rb +0 -19
  435. data/lib/temporalio/errors.rb +0 -40
  436. data/lib/temporalio/failure_converter/base.rb +0 -26
  437. data/lib/temporalio/failure_converter/basic.rb +0 -319
  438. data/lib/temporalio/failure_converter.rb +0 -7
  439. data/lib/temporalio/interceptor/activity_inbound.rb +0 -22
  440. data/lib/temporalio/interceptor/activity_outbound.rb +0 -24
  441. data/lib/temporalio/interceptor/chain.rb +0 -28
  442. data/lib/temporalio/interceptor/client.rb +0 -127
  443. data/lib/temporalio/interceptor.rb +0 -22
  444. data/lib/temporalio/payload_codec/base.rb +0 -32
  445. data/lib/temporalio/payload_converter/base.rb +0 -24
  446. data/lib/temporalio/payload_converter/bytes.rb +0 -27
  447. data/lib/temporalio/payload_converter/composite.rb +0 -49
  448. data/lib/temporalio/payload_converter/encoding_base.rb +0 -35
  449. data/lib/temporalio/payload_converter/json.rb +0 -26
  450. data/lib/temporalio/payload_converter/nil.rb +0 -26
  451. data/lib/temporalio/payload_converter.rb +0 -14
  452. data/lib/temporalio/retry_state.rb +0 -35
  453. data/lib/temporalio/testing/time_skipping_handle.rb +0 -32
  454. data/lib/temporalio/testing/time_skipping_interceptor.rb +0 -23
  455. data/lib/temporalio/timeout_type.rb +0 -29
  456. data/lib/temporalio/worker/activity_runner.rb +0 -114
  457. data/lib/temporalio/worker/activity_worker.rb +0 -164
  458. data/lib/temporalio/worker/reactor.rb +0 -46
  459. data/lib/temporalio/worker/runner.rb +0 -63
  460. data/lib/temporalio/worker/sync_worker.rb +0 -124
  461. data/lib/temporalio/worker/thread_pool_executor.rb +0 -51
  462. data/lib/temporalio/workflow/async.rb +0 -46
  463. data/lib/temporalio/workflow/execution_info.rb +0 -54
  464. data/lib/temporalio/workflow/execution_status.rb +0 -36
  465. data/lib/temporalio/workflow/future.rb +0 -138
  466. data/lib/temporalio/workflow/id_reuse_policy.rb +0 -36
  467. data/lib/temporalio/workflow/info.rb +0 -76
  468. data/lib/temporalio/workflow/query_reject_condition.rb +0 -33
  469. data/lib/thermite_patch.rb +0 -33
  470. data/sig/async.rbs +0 -17
  471. data/sig/protobuf.rbs +0 -16
  472. data/sig/protos/dependencies/gogoproto/gogo.rbs +0 -914
  473. data/sig/protos/google/protobuf/any.rbs +0 -157
  474. data/sig/protos/google/protobuf/descriptor.rbs +0 -2825
  475. data/sig/protos/google/protobuf/duration.rbs +0 -114
  476. data/sig/protos/google/protobuf/empty.rbs +0 -36
  477. data/sig/protos/google/protobuf/timestamp.rbs +0 -145
  478. data/sig/protos/google/protobuf/wrappers.rbs +0 -358
  479. data/sig/protos/temporal/api/batch/v1/message.rbs +0 -300
  480. data/sig/protos/temporal/api/command/v1/message.rbs +0 -1399
  481. data/sig/protos/temporal/api/common/v1/message.rbs +0 -528
  482. data/sig/protos/temporal/api/enums/v1/batch_operation.rbs +0 -79
  483. data/sig/protos/temporal/api/enums/v1/command_type.rbs +0 -68
  484. data/sig/protos/temporal/api/enums/v1/common.rbs +0 -118
  485. data/sig/protos/temporal/api/enums/v1/event_type.rbs +0 -264
  486. data/sig/protos/temporal/api/enums/v1/failed_cause.rbs +0 -277
  487. data/sig/protos/temporal/api/enums/v1/namespace.rbs +0 -108
  488. data/sig/protos/temporal/api/enums/v1/query.rbs +0 -81
  489. data/sig/protos/temporal/api/enums/v1/reset.rbs +0 -44
  490. data/sig/protos/temporal/api/enums/v1/schedule.rbs +0 -72
  491. data/sig/protos/temporal/api/enums/v1/task_queue.rbs +0 -92
  492. data/sig/protos/temporal/api/enums/v1/update.rbs +0 -64
  493. data/sig/protos/temporal/api/enums/v1/workflow.rbs +0 -371
  494. data/sig/protos/temporal/api/errordetails/v1/message.rbs +0 -551
  495. data/sig/protos/temporal/api/failure/v1/message.rbs +0 -581
  496. data/sig/protos/temporal/api/filter/v1/message.rbs +0 -171
  497. data/sig/protos/temporal/api/history/v1/message.rbs +0 -4609
  498. data/sig/protos/temporal/api/namespace/v1/message.rbs +0 -410
  499. data/sig/protos/temporal/api/operatorservice/v1/request_response.rbs +0 -643
  500. data/sig/protos/temporal/api/operatorservice/v1/service.rbs +0 -17
  501. data/sig/protos/temporal/api/protocol/v1/message.rbs +0 -84
  502. data/sig/protos/temporal/api/query/v1/message.rbs +0 -182
  503. data/sig/protos/temporal/api/replication/v1/message.rbs +0 -148
  504. data/sig/protos/temporal/api/schedule/v1/message.rbs +0 -1488
  505. data/sig/protos/temporal/api/sdk/v1/task_complete_metadata.rbs +0 -110
  506. data/sig/protos/temporal/api/taskqueue/v1/message.rbs +0 -486
  507. data/sig/protos/temporal/api/testservice/v1/request_response.rbs +0 -249
  508. data/sig/protos/temporal/api/testservice/v1/service.rbs +0 -15
  509. data/sig/protos/temporal/api/update/v1/message.rbs +0 -489
  510. data/sig/protos/temporal/api/version/v1/message.rbs +0 -184
  511. data/sig/protos/temporal/api/workflow/v1/message.rbs +0 -824
  512. data/sig/protos/temporal/api/workflowservice/v1/request_response.rbs +0 -7250
  513. data/sig/protos/temporal/api/workflowservice/v1/service.rbs +0 -22
  514. data/sig/protos/temporal/sdk/core/activity_result/activity_result.rbs +0 -380
  515. data/sig/protos/temporal/sdk/core/activity_task/activity_task.rbs +0 -386
  516. data/sig/protos/temporal/sdk/core/child_workflow/child_workflow.rbs +0 -323
  517. data/sig/protos/temporal/sdk/core/common/common.rbs +0 -62
  518. data/sig/protos/temporal/sdk/core/core_interface.rbs +0 -101
  519. data/sig/protos/temporal/sdk/core/external_data/external_data.rbs +0 -119
  520. data/sig/protos/temporal/sdk/core/workflow_activation/workflow_activation.rbs +0 -1473
  521. data/sig/protos/temporal/sdk/core/workflow_commands/workflow_commands.rbs +0 -1784
  522. data/sig/protos/temporal/sdk/core/workflow_completion/workflow_completion.rbs +0 -180
  523. data/sig/ruby.rbs +0 -12
  524. data/sig/temporalio/activity/context.rbs +0 -29
  525. data/sig/temporalio/activity/info.rbs +0 -43
  526. data/sig/temporalio/activity.rbs +0 -19
  527. data/sig/temporalio/bridge/connect_options.rbs +0 -19
  528. data/sig/temporalio/bridge/error.rbs +0 -8
  529. data/sig/temporalio/bridge/retry_config.rbs +0 -21
  530. data/sig/temporalio/bridge/tls_options.rbs +0 -17
  531. data/sig/temporalio/bridge.rbs +0 -71
  532. data/sig/temporalio/client/implementation.rbs +0 -38
  533. data/sig/temporalio/client/workflow_handle.rbs +0 -41
  534. data/sig/temporalio/client.rbs +0 -35
  535. data/sig/temporalio/connection/retry_config.rbs +0 -37
  536. data/sig/temporalio/connection/service.rbs +0 -14
  537. data/sig/temporalio/connection/test_service.rbs +0 -13
  538. data/sig/temporalio/connection/tls_options.rbs +0 -43
  539. data/sig/temporalio/connection/workflow_service.rbs +0 -48
  540. data/sig/temporalio/connection.rbs +0 -30
  541. data/sig/temporalio/data_converter.rbs +0 -35
  542. data/sig/temporalio/error/failure.rbs +0 -121
  543. data/sig/temporalio/error/workflow_failure.rbs +0 -9
  544. data/sig/temporalio/errors.rbs +0 -36
  545. data/sig/temporalio/failure_converter/base.rbs +0 -12
  546. data/sig/temporalio/failure_converter/basic.rbs +0 -86
  547. data/sig/temporalio/failure_converter.rbs +0 -5
  548. data/sig/temporalio/interceptor/activity_inbound.rbs +0 -21
  549. data/sig/temporalio/interceptor/activity_outbound.rbs +0 -10
  550. data/sig/temporalio/interceptor/chain.rbs +0 -24
  551. data/sig/temporalio/interceptor/client.rbs +0 -148
  552. data/sig/temporalio/interceptor.rbs +0 -6
  553. data/sig/temporalio/payload_codec/base.rbs +0 -12
  554. data/sig/temporalio/payload_converter/base.rbs +0 -12
  555. data/sig/temporalio/payload_converter/bytes.rbs +0 -9
  556. data/sig/temporalio/payload_converter/composite.rbs +0 -19
  557. data/sig/temporalio/payload_converter/encoding_base.rbs +0 -14
  558. data/sig/temporalio/payload_converter/json.rbs +0 -9
  559. data/sig/temporalio/payload_converter/nil.rbs +0 -9
  560. data/sig/temporalio/payload_converter.rbs +0 -5
  561. data/sig/temporalio/retry_policy.rbs +0 -25
  562. data/sig/temporalio/retry_state.rbs +0 -20
  563. data/sig/temporalio/runtime.rbs +0 -12
  564. data/sig/temporalio/testing/time_skipping_handle.rbs +0 -15
  565. data/sig/temporalio/testing/time_skipping_interceptor.rbs +0 -13
  566. data/sig/temporalio/testing/workflow_environment.rbs +0 -22
  567. data/sig/temporalio/testing.rbs +0 -35
  568. data/sig/temporalio/timeout_type.rbs +0 -15
  569. data/sig/temporalio/version.rbs +0 -3
  570. data/sig/temporalio/worker/activity_runner.rbs +0 -35
  571. data/sig/temporalio/worker/activity_worker.rbs +0 -44
  572. data/sig/temporalio/worker/reactor.rbs +0 -22
  573. data/sig/temporalio/worker/runner.rbs +0 -21
  574. data/sig/temporalio/worker/sync_worker.rbs +0 -23
  575. data/sig/temporalio/worker/thread_pool_executor.rbs +0 -23
  576. data/sig/temporalio/worker.rbs +0 -46
  577. data/sig/temporalio/workflow/async.rbs +0 -9
  578. data/sig/temporalio/workflow/execution_info.rbs +0 -55
  579. data/sig/temporalio/workflow/execution_status.rbs +0 -21
  580. data/sig/temporalio/workflow/future.rbs +0 -40
  581. data/sig/temporalio/workflow/id_reuse_policy.rbs +0 -15
  582. data/sig/temporalio/workflow/info.rbs +0 -55
  583. data/sig/temporalio/workflow/query_reject_condition.rbs +0 -14
  584. data/sig/temporalio.rbs +0 -2
  585. data/sig/thermite_patch.rbs +0 -15
@@ -1,1049 +0,0 @@
1
- use crate::{
2
- advance_fut, job_assert, prost_dur,
3
- test_help::{
4
- build_fake_worker, build_mock_pollers, canned_histories, gen_assert_and_reply,
5
- mock_manual_poller, mock_poller, mock_poller_from_resps, mock_worker, poll_and_reply,
6
- single_hist_mock_sg, test_worker_cfg, MockPollCfg, MockWorkerInputs, MocksHolder,
7
- QueueResponse, ResponseType, WorkerExt, WorkflowCachingPolicy, TEST_Q,
8
- },
9
- worker::client::mocks::{mock_manual_workflow_client, mock_workflow_client},
10
- ActivityHeartbeat, Worker, WorkerConfigBuilder,
11
- };
12
- use futures::FutureExt;
13
- use itertools::Itertools;
14
- use std::{
15
- cell::RefCell,
16
- collections::{hash_map::Entry, HashMap, VecDeque},
17
- future,
18
- rc::Rc,
19
- sync::{
20
- atomic::{AtomicUsize, Ordering},
21
- Arc,
22
- },
23
- time::Duration,
24
- };
25
- use temporal_client::WorkflowOptions;
26
- use temporal_sdk::{ActivityOptions, WfContext};
27
- use temporal_sdk_core_api::{
28
- errors::{CompleteActivityError, PollActivityError},
29
- Worker as WorkerTrait,
30
- };
31
- use temporal_sdk_core_protos::{
32
- coresdk::{
33
- activity_result::{
34
- activity_execution_result, activity_resolution, ActivityExecutionResult,
35
- ActivityResolution, Success,
36
- },
37
- activity_task::{activity_task, ActivityTask},
38
- workflow_activation::{workflow_activation_job, ResolveActivity, WorkflowActivationJob},
39
- workflow_commands::{
40
- ActivityCancellationType, CompleteWorkflowExecution, RequestCancelActivity,
41
- ScheduleActivity,
42
- },
43
- workflow_completion::WorkflowActivationCompletion,
44
- ActivityTaskCompletion,
45
- },
46
- temporal::api::{
47
- command::v1::{command::Attributes, ScheduleActivityTaskCommandAttributes},
48
- enums::v1::EventType,
49
- history::v1::{
50
- history_event::Attributes as EventAttributes, ActivityTaskScheduledEventAttributes,
51
- },
52
- workflowservice::v1::{
53
- PollActivityTaskQueueResponse, RecordActivityTaskHeartbeatResponse,
54
- RespondActivityTaskCanceledResponse, RespondActivityTaskCompletedResponse,
55
- RespondActivityTaskFailedResponse, RespondWorkflowTaskCompletedResponse,
56
- },
57
- },
58
- TestHistoryBuilder, DEFAULT_WORKFLOW_TYPE,
59
- };
60
- use temporal_sdk_core_test_utils::{fanout_tasks, start_timer_cmd, TestWorker};
61
- use tokio::{sync::Barrier, time::sleep};
62
- use tokio_util::sync::CancellationToken;
63
-
64
- #[tokio::test]
65
- async fn max_activities_respected() {
66
- let _task_q = "q";
67
- let mut tasks = VecDeque::from(vec![
68
- PollActivityTaskQueueResponse {
69
- task_token: vec![1],
70
- activity_id: "act1".to_string(),
71
- ..Default::default()
72
- },
73
- PollActivityTaskQueueResponse {
74
- task_token: vec![2],
75
- activity_id: "act2".to_string(),
76
- ..Default::default()
77
- },
78
- PollActivityTaskQueueResponse {
79
- task_token: vec![3],
80
- activity_id: "act3".to_string(),
81
- ..Default::default()
82
- },
83
- ]);
84
- let mut mock_client = mock_workflow_client();
85
- mock_client
86
- .expect_poll_activity_task()
87
- .times(3)
88
- .returning(move |_, _| Ok(tasks.pop_front().unwrap()));
89
- mock_client
90
- .expect_complete_activity_task()
91
- .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
92
-
93
- let worker = Worker::new_test(
94
- test_worker_cfg()
95
- .max_outstanding_activities(2_usize)
96
- .build()
97
- .unwrap(),
98
- mock_client,
99
- );
100
-
101
- // We allow two outstanding activities, therefore first two polls should return right away
102
- let r1 = worker.poll_activity_task().await.unwrap();
103
- let _r2 = worker.poll_activity_task().await.unwrap();
104
- // Third poll should block until we complete one of the first two. To ensure this, manually
105
- // poll it a bunch to see it's not resolving.
106
- let poll_fut = worker.poll_activity_task();
107
- advance_fut!(poll_fut);
108
- worker
109
- .complete_activity_task(ActivityTaskCompletion {
110
- task_token: r1.task_token,
111
- result: Some(ActivityExecutionResult::ok(vec![1].into())),
112
- })
113
- .await
114
- .unwrap();
115
- poll_fut.await.unwrap();
116
- }
117
-
118
- #[tokio::test]
119
- async fn activity_not_found_returns_ok() {
120
- let mut mock_client = mock_workflow_client();
121
- // Mock won't even be called, since we weren't tracking activity
122
- mock_client.expect_complete_activity_task().times(0);
123
-
124
- let core = mock_worker(MocksHolder::from_client_with_activities(mock_client, []));
125
-
126
- core.complete_activity_task(ActivityTaskCompletion {
127
- task_token: vec![1],
128
- result: Some(ActivityExecutionResult::ok(vec![1].into())),
129
- })
130
- .await
131
- .unwrap();
132
- core.drain_activity_poller_and_shutdown().await;
133
- }
134
-
135
- #[tokio::test]
136
- async fn heartbeats_report_cancels_only_once() {
137
- let mut mock_client = mock_workflow_client();
138
- mock_client
139
- .expect_record_activity_heartbeat()
140
- .times(2)
141
- .returning(|_, _| {
142
- Ok(RecordActivityTaskHeartbeatResponse {
143
- cancel_requested: true,
144
- })
145
- });
146
- mock_client
147
- .expect_complete_activity_task()
148
- .times(1)
149
- .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
150
- mock_client
151
- .expect_cancel_activity_task()
152
- .times(1)
153
- .returning(|_, _| Ok(RespondActivityTaskCanceledResponse::default()));
154
-
155
- let core = mock_worker(MocksHolder::from_client_with_activities(
156
- mock_client,
157
- [
158
- PollActivityTaskQueueResponse {
159
- task_token: vec![1],
160
- activity_id: "act1".to_string(),
161
- heartbeat_timeout: Some(prost_dur!(from_millis(1))),
162
- ..Default::default()
163
- }
164
- .into(),
165
- PollActivityTaskQueueResponse {
166
- task_token: vec![2],
167
- activity_id: "act2".to_string(),
168
- heartbeat_timeout: Some(prost_dur!(from_millis(1))),
169
- ..Default::default()
170
- }
171
- .into(),
172
- ],
173
- ));
174
-
175
- let act = core.poll_activity_task().await.unwrap();
176
- core.record_activity_heartbeat(ActivityHeartbeat {
177
- task_token: act.task_token.clone(),
178
- details: vec![vec![1_u8, 2, 3].into()],
179
- });
180
- // We have to wait a beat for the heartbeat to be processed
181
- sleep(Duration::from_millis(10)).await;
182
- let act = core.poll_activity_task().await.unwrap();
183
- assert_matches!(
184
- &act,
185
- ActivityTask {
186
- task_token,
187
- variant: Some(activity_task::Variant::Cancel(_)),
188
- ..
189
- } => { task_token == &vec![1] }
190
- );
191
-
192
- // Verify if we try to record another heartbeat for this task we do not issue a double cancel
193
- // Allow heartbeat delay to elapse
194
- sleep(Duration::from_millis(10)).await;
195
- core.record_activity_heartbeat(ActivityHeartbeat {
196
- task_token: act.task_token.clone(),
197
- details: vec![vec![1_u8, 2, 3].into()],
198
- });
199
- // Wait delay again to flush heartbeat
200
- sleep(Duration::from_millis(10)).await;
201
- // Now complete it as cancelled
202
- core.complete_activity_task(ActivityTaskCompletion {
203
- task_token: act.task_token,
204
-
205
- result: Some(ActivityExecutionResult::cancel_from_details(None)),
206
- })
207
- .await
208
- .unwrap();
209
- // Since cancels always come before new tasks, if we get a new non-cancel task, we did not
210
- // double-issue cancels.
211
- let act = core.poll_activity_task().await.unwrap();
212
- assert_matches!(
213
- &act,
214
- ActivityTask {
215
- task_token,
216
- variant: Some(activity_task::Variant::Start(_)),
217
- ..
218
- } => { task_token == &[2] }
219
- );
220
- // Complete it so shutdown goes through
221
- core.complete_activity_task(ActivityTaskCompletion {
222
- task_token: act.task_token,
223
-
224
- result: Some(ActivityExecutionResult::ok(vec![1].into())),
225
- })
226
- .await
227
- .unwrap();
228
- core.drain_activity_poller_and_shutdown().await;
229
- }
230
-
231
- #[tokio::test]
232
- async fn activity_cancel_interrupts_poll() {
233
- let mut mock_poller = mock_manual_poller();
234
- let shutdown_token = CancellationToken::new();
235
- let shutdown_token_clone = shutdown_token.clone();
236
- let mut poll_resps = VecDeque::from(vec![
237
- async {
238
- Some(Ok(PollActivityTaskQueueResponse {
239
- task_token: vec![1],
240
- heartbeat_timeout: Some(prost_dur!(from_secs(1))),
241
- ..Default::default()
242
- }))
243
- }
244
- .boxed(),
245
- async {
246
- tokio::time::sleep(Duration::from_millis(500)).await;
247
- Some(Ok(Default::default()))
248
- }
249
- .boxed(),
250
- async move {
251
- shutdown_token.cancelled().await;
252
- None
253
- }
254
- .boxed(),
255
- ]);
256
- mock_poller
257
- .expect_poll()
258
- .times(3)
259
- .returning(move || poll_resps.pop_front().unwrap());
260
-
261
- let mut mock_client = mock_manual_workflow_client();
262
- mock_client
263
- .expect_record_activity_heartbeat()
264
- .times(1)
265
- .returning(|_, _| {
266
- async {
267
- Ok(RecordActivityTaskHeartbeatResponse {
268
- cancel_requested: true,
269
- })
270
- }
271
- .boxed()
272
- });
273
- mock_client
274
- .expect_complete_activity_task()
275
- .times(1)
276
- .returning(|_, _| async { Ok(RespondActivityTaskCompletedResponse::default()) }.boxed());
277
-
278
- let mw = MockWorkerInputs {
279
- act_poller: Some(Box::from(mock_poller)),
280
- ..Default::default()
281
- };
282
- let core = mock_worker(MocksHolder::from_mock_worker(mock_client, mw));
283
- let last_finisher = AtomicUsize::new(0);
284
- // Perform first poll to get the activity registered
285
- let act = core.poll_activity_task().await.unwrap();
286
- // Poll should block until heartbeat is sent, issuing the cancel, and interrupting the poll
287
- tokio::join! {
288
- async {
289
- core.record_activity_heartbeat(ActivityHeartbeat {
290
- task_token: act.task_token,
291
-
292
- details: vec![vec![1_u8, 2, 3].into()],
293
- });
294
- last_finisher.store(1, Ordering::SeqCst);
295
- },
296
- async {
297
- let act = core.poll_activity_task().await.unwrap();
298
- // Must complete this activity for shutdown to finish
299
- core.complete_activity_task(
300
- ActivityTaskCompletion {
301
- task_token: act.task_token,
302
-
303
- result: Some(ActivityExecutionResult::ok(vec![1].into())),
304
- }
305
- ).await.unwrap();
306
- last_finisher.store(2, Ordering::SeqCst);
307
- shutdown_token_clone.cancel();
308
- }
309
- };
310
- // So that we know we blocked
311
- assert_eq!(last_finisher.load(Ordering::Acquire), 2);
312
- core.drain_activity_poller_and_shutdown().await;
313
- }
314
-
315
- #[tokio::test]
316
- async fn activity_poll_timeout_retries() {
317
- let mock_client = mock_workflow_client();
318
- let mut calls = 0;
319
- let mut mock_act_poller = mock_poller();
320
- mock_act_poller.expect_poll().times(3).returning(move || {
321
- calls += 1;
322
- if calls <= 2 {
323
- Some(Ok(PollActivityTaskQueueResponse::default()))
324
- } else {
325
- Some(Ok(PollActivityTaskQueueResponse {
326
- task_token: b"hello!".to_vec(),
327
- ..Default::default()
328
- }))
329
- }
330
- });
331
- let mw = MockWorkerInputs {
332
- act_poller: Some(Box::from(mock_act_poller)),
333
- ..Default::default()
334
- };
335
- let core = mock_worker(MocksHolder::from_mock_worker(mock_client, mw));
336
- let r = core.poll_activity_task().await.unwrap();
337
- assert_matches!(r.task_token.as_slice(), b"hello!");
338
- }
339
-
340
- #[tokio::test]
341
- async fn many_concurrent_heartbeat_cancels() {
342
- // Run a whole bunch of activities in parallel, having the server return cancellations for
343
- // them after a few successful heartbeats
344
- const CONCURRENCY_NUM: usize = 5;
345
-
346
- let mut mock_client = mock_manual_workflow_client();
347
- let mut poll_resps = VecDeque::from(
348
- (0..CONCURRENCY_NUM)
349
- .map(|i| {
350
- async move {
351
- Ok(PollActivityTaskQueueResponse {
352
- task_token: i.to_be_bytes().to_vec(),
353
- heartbeat_timeout: Some(prost_dur!(from_millis(200))),
354
- ..Default::default()
355
- })
356
- }
357
- .boxed()
358
- })
359
- .collect::<Vec<_>>(),
360
- );
361
- poll_resps.push_back(
362
- async {
363
- future::pending::<()>().await;
364
- unreachable!()
365
- }
366
- .boxed(),
367
- );
368
- let mut calls_map = HashMap::<_, i32>::new();
369
- mock_client
370
- .expect_poll_activity_task()
371
- .returning(move |_, _| poll_resps.pop_front().unwrap());
372
- mock_client
373
- .expect_cancel_activity_task()
374
- .returning(move |_, _| async move { Ok(Default::default()) }.boxed());
375
- mock_client
376
- .expect_record_activity_heartbeat()
377
- .returning(move |tt, _| {
378
- let calls = match calls_map.entry(tt) {
379
- Entry::Occupied(mut e) => {
380
- *e.get_mut() += 1;
381
- *e.get()
382
- }
383
- Entry::Vacant(v) => *v.insert(1),
384
- };
385
- async move {
386
- if calls < 5 {
387
- Ok(RecordActivityTaskHeartbeatResponse {
388
- cancel_requested: false,
389
- })
390
- } else {
391
- Ok(RecordActivityTaskHeartbeatResponse {
392
- cancel_requested: true,
393
- })
394
- }
395
- }
396
- .boxed()
397
- });
398
-
399
- let worker = &Worker::new_test(
400
- test_worker_cfg()
401
- .max_outstanding_activities(CONCURRENCY_NUM)
402
- // Only 1 poll at a time to avoid over-polling and running out of responses
403
- .max_concurrent_at_polls(1_usize)
404
- .build()
405
- .unwrap(),
406
- mock_client,
407
- );
408
-
409
- // Poll all activities first so they are registered
410
- for _ in 0..CONCURRENCY_NUM {
411
- worker.poll_activity_task().await.unwrap();
412
- }
413
-
414
- // Spawn "activities"
415
- fanout_tasks(CONCURRENCY_NUM, |i| async move {
416
- let task_token = i.to_be_bytes().to_vec();
417
- for _ in 0..12 {
418
- worker.record_activity_heartbeat(ActivityHeartbeat {
419
- task_token: task_token.clone(),
420
- details: vec![],
421
- });
422
- sleep(Duration::from_millis(50)).await;
423
- }
424
- })
425
- .await;
426
-
427
- // Read all the cancellations and reply to them concurrently
428
- fanout_tasks(CONCURRENCY_NUM, |_| async move {
429
- let r = worker.poll_activity_task().await.unwrap();
430
- assert_matches!(
431
- r,
432
- ActivityTask {
433
- variant: Some(activity_task::Variant::Cancel(_)),
434
- ..
435
- }
436
- );
437
- worker
438
- .complete_activity_task(ActivityTaskCompletion {
439
- task_token: r.task_token.clone(),
440
- result: Some(ActivityExecutionResult::cancel_from_details(None)),
441
- })
442
- .await
443
- .unwrap();
444
- })
445
- .await;
446
-
447
- worker.drain_activity_poller_and_shutdown().await;
448
- }
449
-
450
- #[tokio::test]
451
- async fn activity_timeout_no_double_resolve() {
452
- let t = canned_histories::activity_double_resolve_repro();
453
- let core = build_fake_worker("fake_wf_id", t, [3]);
454
- let activity_id = 1;
455
-
456
- poll_and_reply(
457
- &core,
458
- WorkflowCachingPolicy::NonSticky,
459
- &[
460
- gen_assert_and_reply(
461
- &job_assert!(workflow_activation_job::Variant::StartWorkflow(_)),
462
- vec![ScheduleActivity {
463
- seq: activity_id,
464
- activity_id: activity_id.to_string(),
465
- cancellation_type: ActivityCancellationType::TryCancel as i32,
466
- ..Default::default()
467
- }
468
- .into()],
469
- ),
470
- gen_assert_and_reply(
471
- &job_assert!(workflow_activation_job::Variant::SignalWorkflow(_)),
472
- vec![
473
- RequestCancelActivity { seq: activity_id }.into(),
474
- start_timer_cmd(2, Duration::from_secs(1)),
475
- ],
476
- ),
477
- gen_assert_and_reply(
478
- &job_assert!(workflow_activation_job::Variant::ResolveActivity(
479
- ResolveActivity {
480
- result: Some(ActivityResolution {
481
- status: Some(activity_resolution::Status::Cancelled(..)),
482
- }),
483
- ..
484
- }
485
- )),
486
- vec![],
487
- ),
488
- gen_assert_and_reply(
489
- &job_assert!(
490
- workflow_activation_job::Variant::SignalWorkflow(_),
491
- workflow_activation_job::Variant::FireTimer(_)
492
- ),
493
- vec![CompleteWorkflowExecution { result: None }.into()],
494
- ),
495
- ],
496
- )
497
- .await;
498
-
499
- core.drain_pollers_and_shutdown().await;
500
- }
501
-
502
- #[tokio::test]
503
- async fn can_heartbeat_acts_during_shutdown() {
504
- let mut mock_client = mock_workflow_client();
505
- mock_client
506
- .expect_record_activity_heartbeat()
507
- .times(1)
508
- .returning(|_, _| {
509
- Ok(RecordActivityTaskHeartbeatResponse {
510
- cancel_requested: false,
511
- })
512
- });
513
- mock_client
514
- .expect_complete_activity_task()
515
- .times(1)
516
- .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
517
-
518
- let core = mock_worker(MocksHolder::from_client_with_activities(
519
- mock_client,
520
- [PollActivityTaskQueueResponse {
521
- task_token: vec![1],
522
- activity_id: "act1".to_string(),
523
- heartbeat_timeout: Some(prost_dur!(from_millis(1))),
524
- ..Default::default()
525
- }
526
- .into()],
527
- ));
528
-
529
- let act = core.poll_activity_task().await.unwrap();
530
- // Make sure shutdown has progressed before trying to record heartbeat / complete
531
- let shutdown_fut = core.shutdown();
532
- advance_fut!(shutdown_fut);
533
- core.record_activity_heartbeat(ActivityHeartbeat {
534
- task_token: act.task_token.clone(),
535
-
536
- details: vec![vec![1_u8, 2, 3].into()],
537
- });
538
- core.complete_activity_task(ActivityTaskCompletion {
539
- task_token: act.task_token,
540
-
541
- result: Some(ActivityExecutionResult::ok(vec![1].into())),
542
- })
543
- .await
544
- .unwrap();
545
- core.drain_activity_poller_and_shutdown().await;
546
- }
547
-
548
- /// Verifies that if a user has tried to record a heartbeat and then immediately after failed the
549
- /// activity, that we flush those details before reporting the failure completion.
550
- #[tokio::test]
551
- async fn complete_act_with_fail_flushes_heartbeat() {
552
- let last_hb = 50;
553
- let mut mock_client = mock_workflow_client();
554
- let last_seen_payload = Rc::new(RefCell::new(None));
555
- let lsp = last_seen_payload.clone();
556
- mock_client
557
- .expect_record_activity_heartbeat()
558
- // Two times b/c we always record the first heartbeat, and we'll flush the last
559
- .times(2)
560
- .returning_st(move |_, payload| {
561
- *lsp.borrow_mut() = payload;
562
- Ok(RecordActivityTaskHeartbeatResponse {
563
- cancel_requested: false,
564
- })
565
- });
566
- mock_client
567
- .expect_fail_activity_task()
568
- .times(1)
569
- .returning(|_, _| Ok(RespondActivityTaskFailedResponse::default()));
570
-
571
- let core = mock_worker(MocksHolder::from_client_with_activities(
572
- mock_client,
573
- [PollActivityTaskQueueResponse {
574
- task_token: vec![1],
575
- activity_id: "act1".to_string(),
576
- heartbeat_timeout: Some(prost_dur!(from_secs(10))),
577
- ..Default::default()
578
- }
579
- .into()],
580
- ));
581
-
582
- let act = core.poll_activity_task().await.unwrap();
583
- // Record a bunch of heartbeats
584
- for i in 1..=last_hb {
585
- core.record_activity_heartbeat(ActivityHeartbeat {
586
- task_token: act.task_token.clone(),
587
- details: vec![vec![i].into()],
588
- });
589
- }
590
- core.complete_activity_task(ActivityTaskCompletion {
591
- task_token: act.task_token.clone(),
592
- result: Some(ActivityExecutionResult::fail("Ahh".into())),
593
- })
594
- .await
595
- .unwrap();
596
- core.drain_activity_poller_and_shutdown().await;
597
-
598
- // Verify the last seen call to record a heartbeat had the last detail payload
599
- let last_seen_payload = &last_seen_payload.take().unwrap().payloads[0];
600
- assert_eq!(last_seen_payload.data, &[last_hb]);
601
- }
602
-
603
- #[tokio::test]
604
- async fn max_tq_acts_set_passed_to_poll_properly() {
605
- let rate = 9.28;
606
- let mut mock_client = mock_workflow_client();
607
- mock_client
608
- .expect_poll_activity_task()
609
- .returning(move |_, tps| {
610
- assert_eq!(tps, Some(rate));
611
- Ok(PollActivityTaskQueueResponse {
612
- task_token: vec![1],
613
- ..Default::default()
614
- })
615
- });
616
-
617
- let cfg = WorkerConfigBuilder::default()
618
- .namespace("enchi")
619
- .task_queue("cat")
620
- .max_concurrent_at_polls(1_usize)
621
- .worker_build_id("test_bin_id")
622
- .max_task_queue_activities_per_second(rate)
623
- .build()
624
- .unwrap();
625
- let worker = Worker::new_test(cfg, mock_client);
626
- worker.poll_activity_task().await.unwrap();
627
- }
628
-
629
- /// This test doesn't test the real worker config since [mock_worker] bypasses the worker
630
- /// constructor, [mock_worker] will not pass an activity poller to the worker when
631
- /// `no_remote_activities` is set to `true`.
632
- #[tokio::test]
633
- async fn no_eager_activities_requested_when_worker_options_disable_remote_activities() {
634
- let wfid = "fake_wf_id";
635
- let mut t = TestHistoryBuilder::default();
636
- t.add_by_type(EventType::WorkflowExecutionStarted);
637
- t.add_full_wf_task();
638
- let scheduled_event_id = t.add_activity_task_scheduled("act_id");
639
- let started_event_id = t.add_activity_task_started(scheduled_event_id);
640
- t.add_activity_task_completed(scheduled_event_id, started_event_id, b"hi".into());
641
- t.add_full_wf_task();
642
- t.add_workflow_execution_completed();
643
- let num_eager_requested = Arc::new(AtomicUsize::new(0));
644
- // Clone it to move into the callback below
645
- let num_eager_requested_clone = num_eager_requested.clone();
646
-
647
- let mut mock = mock_workflow_client();
648
- mock.expect_complete_workflow_task()
649
- .times(1)
650
- .returning(move |req| {
651
- // Store the number of eager activities requested to be checked below
652
- let count = req
653
- .commands
654
- .into_iter()
655
- .filter(|c| match c.attributes {
656
- Some(Attributes::ScheduleActivityTaskCommandAttributes(
657
- ScheduleActivityTaskCommandAttributes {
658
- request_eager_execution,
659
- ..
660
- },
661
- )) => request_eager_execution,
662
- _ => false,
663
- })
664
- .count();
665
- num_eager_requested_clone.store(count, Ordering::Relaxed);
666
- Ok(RespondWorkflowTaskCompletedResponse {
667
- workflow_task: None,
668
- activity_tasks: vec![],
669
- reset_history_event_id: 0,
670
- })
671
- });
672
- let mut mock = single_hist_mock_sg(wfid, t, [1], mock, true);
673
- let mut mock_poller = mock_manual_poller();
674
- mock_poller
675
- .expect_poll()
676
- .returning(|| futures::future::pending().boxed());
677
- mock.set_act_poller(Box::new(mock_poller));
678
- mock.worker_cfg(|wc| {
679
- wc.max_cached_workflows = 2;
680
- wc.no_remote_activities = true;
681
- });
682
- let core = mock_worker(mock);
683
-
684
- // Test start
685
- let wf_task = core.poll_workflow_activation().await.unwrap();
686
- let cmds = vec![ScheduleActivity {
687
- seq: 1,
688
- activity_id: "act_id".to_string(),
689
- task_queue: TEST_Q.to_string(),
690
- cancellation_type: ActivityCancellationType::TryCancel as i32,
691
- ..Default::default()
692
- }
693
- .into()];
694
-
695
- core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
696
- wf_task.run_id,
697
- cmds,
698
- ))
699
- .await
700
- .unwrap();
701
-
702
- core.drain_pollers_and_shutdown().await;
703
-
704
- assert_eq!(num_eager_requested.load(Ordering::Relaxed), 0);
705
- }
706
-
707
- /// This test verifies that activity tasks which come as replies to completing a WFT are properly
708
- /// delivered via polling.
709
- #[tokio::test]
710
- async fn activity_tasks_from_completion_are_delivered() {
711
- // Construct the history - one task with 5 activities, 4 on the same task queue, and 1 on a
712
- // different queue, 3 activities will be executed eagerly as specified by the
713
- // MAX_EAGER_ACTIVITY_RESERVATIONS_PER_WORKFLOW_TASK constant.
714
- let wfid = "fake_wf_id";
715
- let mut t = TestHistoryBuilder::default();
716
- t.add_by_type(EventType::WorkflowExecutionStarted);
717
- t.add_full_wf_task();
718
- let act_same_queue_scheduled_ids = (1..4)
719
- .map(|i| t.add_activity_task_scheduled(format!("act_id_{i}_same_queue")))
720
- .collect_vec();
721
- t.add_activity_task_scheduled("act_id_same_queue_not_eager");
722
- t.add_activity_task_scheduled("act_id_different_queue");
723
- for scheduled_event_id in act_same_queue_scheduled_ids {
724
- let started_event_id = t.add_activity_task_started(scheduled_event_id);
725
- t.add_activity_task_completed(scheduled_event_id, started_event_id, b"hi".into());
726
- }
727
- t.add_full_wf_task();
728
- t.add_workflow_execution_completed();
729
-
730
- let num_eager_requested = Arc::new(AtomicUsize::new(0));
731
- // Clone it to move into the callback below
732
- let num_eager_requested_clone = num_eager_requested.clone();
733
-
734
- let mut mock = mock_workflow_client();
735
- mock.expect_complete_workflow_task()
736
- .times(1)
737
- .returning(move |req| {
738
- // Store the number of eager activities requested to be checked below
739
- let count = req
740
- .commands
741
- .into_iter()
742
- .filter(|c| match c.attributes {
743
- Some(Attributes::ScheduleActivityTaskCommandAttributes(
744
- ScheduleActivityTaskCommandAttributes {
745
- request_eager_execution,
746
- ..
747
- },
748
- )) => request_eager_execution,
749
- _ => false,
750
- })
751
- .count();
752
- num_eager_requested_clone.store(count, Ordering::Relaxed);
753
- Ok(RespondWorkflowTaskCompletedResponse {
754
- workflow_task: None,
755
- activity_tasks: (1..4)
756
- .map(|i| PollActivityTaskQueueResponse {
757
- task_token: vec![i],
758
- activity_id: format!("act_id_{i}_same_queue"),
759
- ..Default::default()
760
- })
761
- .collect_vec(),
762
- reset_history_event_id: 0,
763
- })
764
- });
765
- mock.expect_complete_activity_task()
766
- .times(3)
767
- .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
768
- let mut mock = single_hist_mock_sg(wfid, t, [1], mock, true);
769
- let act_tasks: Vec<QueueResponse<PollActivityTaskQueueResponse>> = vec![];
770
- mock.set_act_poller(mock_poller_from_resps(act_tasks));
771
- mock.worker_cfg(|wc| wc.max_cached_workflows = 2);
772
- let core = mock_worker(mock);
773
-
774
- // Test start
775
- let wf_task = core.poll_workflow_activation().await.unwrap();
776
- let mut cmds = (1..4)
777
- .map(|seq| {
778
- ScheduleActivity {
779
- seq,
780
- activity_id: format!("act_id_{seq}_same_queue"),
781
- task_queue: TEST_Q.to_string(),
782
- cancellation_type: ActivityCancellationType::TryCancel as i32,
783
- ..Default::default()
784
- }
785
- .into()
786
- })
787
- .collect_vec();
788
- cmds.push(
789
- ScheduleActivity {
790
- seq: 4,
791
- activity_id: "act_id_same_queue_not_eager".to_string(),
792
- task_queue: TEST_Q.to_string(),
793
- cancellation_type: ActivityCancellationType::TryCancel as i32,
794
- ..Default::default()
795
- }
796
- .into(),
797
- );
798
- cmds.push(
799
- ScheduleActivity {
800
- seq: 5,
801
- activity_id: "act_id_different_queue".to_string(),
802
- task_queue: "different_queue".to_string(),
803
- cancellation_type: ActivityCancellationType::Abandon as i32,
804
- ..Default::default()
805
- }
806
- .into(),
807
- );
808
-
809
- core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
810
- wf_task.run_id,
811
- cmds,
812
- ))
813
- .await
814
- .unwrap();
815
-
816
- // We should see the 3 eager activities when we poll now
817
- for i in 1..4 {
818
- let act_task = core.poll_activity_task().await.unwrap();
819
- assert_eq!(act_task.task_token, vec![i]);
820
-
821
- core.complete_activity_task(ActivityTaskCompletion {
822
- task_token: act_task.task_token.clone(),
823
- result: Some(ActivityExecutionResult::ok("hi".into())),
824
- })
825
- .await
826
- .unwrap();
827
- }
828
-
829
- core.drain_activity_poller_and_shutdown().await;
830
-
831
- // Verify only a single eager activity was scheduled (the one on our worker's task queue)
832
- assert_eq!(num_eager_requested.load(Ordering::Relaxed), 3);
833
- }
834
-
835
- #[tokio::test]
836
- async fn activity_tasks_from_completion_reserve_slots() {
837
- let wf_id = "fake_wf_id";
838
- let mut t = TestHistoryBuilder::default();
839
- t.add_by_type(EventType::WorkflowExecutionStarted);
840
- t.add_full_wf_task();
841
- let schedid = t.add(EventAttributes::ActivityTaskScheduledEventAttributes(
842
- ActivityTaskScheduledEventAttributes {
843
- activity_id: "1".to_string(),
844
- activity_type: Some("act1".into()),
845
- ..Default::default()
846
- },
847
- ));
848
- let startid = t.add_activity_task_started(schedid);
849
- t.add_activity_task_completed(schedid, startid, b"hi".into());
850
- t.add_full_wf_task();
851
- let schedid = t.add(EventAttributes::ActivityTaskScheduledEventAttributes(
852
- ActivityTaskScheduledEventAttributes {
853
- activity_id: "2".to_string(),
854
- activity_type: Some("act2".into()),
855
- ..Default::default()
856
- },
857
- ));
858
- let startid = t.add_activity_task_started(schedid);
859
- t.add_activity_task_completed(schedid, startid, b"hi".into());
860
- t.add_full_wf_task();
861
- t.add_workflow_execution_completed();
862
-
863
- let mut mock = mock_workflow_client();
864
- // Set up two tasks to be returned via normal activity polling
865
- let act_tasks = VecDeque::from(vec![
866
- PollActivityTaskQueueResponse {
867
- task_token: vec![1],
868
- activity_id: "act1".to_string(),
869
- ..Default::default()
870
- }
871
- .into(),
872
- PollActivityTaskQueueResponse {
873
- task_token: vec![2],
874
- activity_id: "act2".to_string(),
875
- ..Default::default()
876
- }
877
- .into(),
878
- ]);
879
- mock.expect_complete_activity_task()
880
- .times(2)
881
- .returning(|_, _| Ok(RespondActivityTaskCompletedResponse::default()));
882
- let barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
883
- let mut mh = MockPollCfg::from_resp_batches(
884
- wf_id,
885
- t,
886
- [
887
- ResponseType::ToTaskNum(1),
888
- // We don't want the second task to be delivered until *after* the activity tasks
889
- // have been completed, so that the second activity schedule will have slots available
890
- ResponseType::UntilResolved(
891
- async {
892
- barr.wait().await;
893
- barr.wait().await;
894
- }
895
- .boxed(),
896
- 2,
897
- ),
898
- ResponseType::AllHistory,
899
- ],
900
- mock,
901
- );
902
- mh.completion_asserts = Some(Box::new(|wftc| {
903
- // Make sure when we see the completion with the schedule act command that it does
904
- // not have the eager execution flag set the first time, and does the second.
905
- if let Some(Attributes::ScheduleActivityTaskCommandAttributes(attrs)) =
906
- wftc.commands.get(0).and_then(|cmd| cmd.attributes.as_ref())
907
- {
908
- if attrs.activity_id == "1" {
909
- assert!(!attrs.request_eager_execution);
910
- } else {
911
- assert!(attrs.request_eager_execution);
912
- }
913
- }
914
- }));
915
- let mut mock = build_mock_pollers(mh);
916
- mock.worker_cfg(|cfg| {
917
- cfg.max_cached_workflows = 2;
918
- cfg.max_outstanding_activities = 2;
919
- });
920
- mock.set_act_poller(mock_poller_from_resps(act_tasks));
921
- let core = Arc::new(mock_worker(mock));
922
- let mut worker = TestWorker::new(core.clone(), TEST_Q.to_string());
923
-
924
- // First poll for activities twice, occupying both slots
925
- let at1 = core.poll_activity_task().await.unwrap();
926
- let at2 = core.poll_activity_task().await.unwrap();
927
- let workflow_complete_token = CancellationToken::new();
928
- let workflow_complete_token_clone = workflow_complete_token.clone();
929
-
930
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| {
931
- let complete_token = workflow_complete_token.clone();
932
- async move {
933
- ctx.activity(ActivityOptions {
934
- activity_type: "act1".to_string(),
935
- ..Default::default()
936
- })
937
- .await;
938
- ctx.activity(ActivityOptions {
939
- activity_type: "act2".to_string(),
940
- ..Default::default()
941
- })
942
- .await;
943
- complete_token.cancel();
944
- Ok(().into())
945
- }
946
- });
947
-
948
- worker
949
- .submit_wf(
950
- wf_id.to_owned(),
951
- DEFAULT_WORKFLOW_TYPE,
952
- vec![],
953
- WorkflowOptions::default(),
954
- )
955
- .await
956
- .unwrap();
957
- let act_completer = async {
958
- barr.wait().await;
959
- core.complete_activity_task(ActivityTaskCompletion {
960
- task_token: at1.task_token,
961
- result: Some(ActivityExecutionResult::ok("hi".into())),
962
- })
963
- .await
964
- .unwrap();
965
- core.complete_activity_task(ActivityTaskCompletion {
966
- task_token: at2.task_token,
967
- result: Some(ActivityExecutionResult::ok("hi".into())),
968
- })
969
- .await
970
- .unwrap();
971
- barr.wait().await;
972
- // Wait for workflow to complete in order for all eager activities to be requested before shutting down.
973
- // After shutdown, no eager activities slots can be allocated.
974
- workflow_complete_token_clone.cancelled().await;
975
- core.initiate_shutdown();
976
- // Even though this test requests eager activity tasks, none are returned in poll responses.
977
- let err = core.poll_activity_task().await.unwrap_err();
978
- assert_matches!(err, PollActivityError::ShutDown);
979
- };
980
- // This wf poll should *not* set the flag that it wants tasks back since both slots are
981
- // occupied
982
- let run_fut = async { worker.run_until_done().await.unwrap() };
983
- tokio::join!(run_fut, act_completer);
984
- }
985
-
986
- #[tokio::test]
987
- async fn retryable_net_error_exhaustion_is_nonfatal() {
988
- let mut mock_client = mock_workflow_client();
989
- mock_client
990
- .expect_complete_activity_task()
991
- .times(1)
992
- .returning(|_, _| Err(tonic::Status::internal("retryable error")));
993
-
994
- let core = mock_worker(MocksHolder::from_client_with_activities(
995
- mock_client,
996
- [PollActivityTaskQueueResponse {
997
- task_token: vec![1],
998
- activity_id: "act1".to_string(),
999
- heartbeat_timeout: Some(prost_dur!(from_secs(10))),
1000
- ..Default::default()
1001
- }
1002
- .into()],
1003
- ));
1004
-
1005
- let act = core.poll_activity_task().await.unwrap();
1006
- core.complete_activity_task(ActivityTaskCompletion {
1007
- task_token: act.task_token,
1008
- result: Some(ActivityExecutionResult::ok(vec![1].into())),
1009
- })
1010
- .await
1011
- .unwrap();
1012
- core.drain_activity_poller_and_shutdown().await;
1013
- }
1014
-
1015
- #[tokio::test]
1016
- async fn cant_complete_activity_with_unset_result_payload() {
1017
- let mut mock_client = mock_workflow_client();
1018
- mock_client
1019
- .expect_poll_activity_task()
1020
- .returning(move |_, _| {
1021
- Ok(PollActivityTaskQueueResponse {
1022
- task_token: vec![1],
1023
- ..Default::default()
1024
- })
1025
- });
1026
-
1027
- let cfg = WorkerConfigBuilder::default()
1028
- .namespace("enchi")
1029
- .task_queue("cat")
1030
- .worker_build_id("enchi_loves_salmon")
1031
- .build()
1032
- .unwrap();
1033
- let worker = Worker::new_test(cfg, mock_client);
1034
- let t = worker.poll_activity_task().await.unwrap();
1035
- let res = worker
1036
- .complete_activity_task(ActivityTaskCompletion {
1037
- task_token: t.task_token,
1038
- result: Some(ActivityExecutionResult {
1039
- status: Some(activity_execution_result::Status::Completed(Success {
1040
- result: None,
1041
- })),
1042
- }),
1043
- })
1044
- .await;
1045
- assert_matches!(
1046
- res,
1047
- Err(CompleteActivityError::MalformedActivityCompletion { .. })
1048
- )
1049
- }