temporalio 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (469) 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 -38
  132. metadata +131 -596
  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 -23
@@ -1,763 +0,0 @@
1
- use crate::{
2
- ClientOptions, ListClosedFilters, ListOpenFilters, Namespace, RegisterNamespaceOptions, Result,
3
- RetryConfig, SignalWithStartOptions, StartTimeFilter, WorkflowClientTrait, WorkflowOptions,
4
- };
5
- use backoff::{backoff::Backoff, exponential::ExponentialBackoff, Clock, SystemClock};
6
- use futures_retry::{ErrorHandler, FutureRetry, RetryPolicy};
7
- use std::{fmt::Debug, future::Future, sync::Arc, time::Duration};
8
- use temporal_sdk_core_protos::{
9
- coresdk::workflow_commands::QueryResult,
10
- temporal::api::{
11
- common::v1::{Payload, Payloads},
12
- enums::v1::WorkflowTaskFailedCause,
13
- failure::v1::Failure,
14
- query::v1::WorkflowQuery,
15
- workflowservice::v1::*,
16
- },
17
- TaskToken,
18
- };
19
- use tonic::Code;
20
-
21
- /// List of gRPC error codes that client will retry.
22
- pub const RETRYABLE_ERROR_CODES: [Code; 7] = [
23
- Code::DataLoss,
24
- Code::Internal,
25
- Code::Unknown,
26
- Code::ResourceExhausted,
27
- Code::Aborted,
28
- Code::OutOfRange,
29
- Code::Unavailable,
30
- ];
31
- const LONG_POLL_FATAL_GRACE: Duration = Duration::from_secs(60);
32
- /// Must match the method name in [crate::raw::WorkflowService]
33
- const POLL_WORKFLOW_METH_NAME: &str = "poll_workflow_task_queue";
34
- /// Must match the method name in [crate::raw::WorkflowService]
35
- const POLL_ACTIVITY_METH_NAME: &str = "poll_activity_task_queue";
36
-
37
- /// A wrapper for a [WorkflowClientTrait] or [crate::WorkflowService] implementor which performs
38
- /// auto-retries
39
- #[derive(Debug, Clone)]
40
- pub struct RetryClient<SG> {
41
- client: SG,
42
- retry_config: Arc<RetryConfig>,
43
- }
44
-
45
- impl<SG> RetryClient<SG> {
46
- /// Use the provided retry config with the provided client
47
- pub fn new(client: SG, retry_config: RetryConfig) -> Self {
48
- Self {
49
- client,
50
- retry_config: Arc::new(retry_config),
51
- }
52
- }
53
- }
54
-
55
- impl<SG> RetryClient<SG> {
56
- /// Return the inner client type
57
- pub fn get_client(&self) -> &SG {
58
- &self.client
59
- }
60
-
61
- /// Return the inner client type mutably
62
- pub fn get_client_mut(&mut self) -> &mut SG {
63
- &mut self.client
64
- }
65
-
66
- /// Disable retry and return the inner client type
67
- pub fn into_inner(self) -> SG {
68
- self.client
69
- }
70
-
71
- /// Wraps a call to the underlying client with retry capability.
72
- ///
73
- /// This is the "old" path used by higher-level [WorkflowClientTrait] implementors
74
- pub(crate) async fn call_with_retry<R, F, Fut>(
75
- &self,
76
- factory: F,
77
- call_name: &'static str,
78
- ) -> Result<R>
79
- where
80
- F: Fn() -> Fut + Unpin,
81
- Fut: Future<Output = Result<R>>,
82
- {
83
- let rtc = self.get_retry_config(call_name);
84
- let res = Self::make_future_retry(rtc, factory, call_name).await;
85
- Ok(res.map_err(|(e, _attempt)| e)?.0)
86
- }
87
-
88
- pub(crate) fn get_retry_config(&self, call_name: &'static str) -> RetryConfig {
89
- match CallType::from_call_name(call_name) {
90
- CallType::Normal => (*self.retry_config).clone(),
91
- CallType::LongPoll => RetryConfig::poll_retry_policy(),
92
- }
93
- }
94
-
95
- pub(crate) fn make_future_retry<R, F, Fut>(
96
- rtc: RetryConfig,
97
- factory: F,
98
- call_name: &'static str,
99
- ) -> FutureRetry<F, TonicErrorHandler<SystemClock>>
100
- where
101
- F: FnMut() -> Fut + Unpin,
102
- Fut: Future<Output = Result<R>>,
103
- {
104
- FutureRetry::new(
105
- factory,
106
- TonicErrorHandler::new(rtc, RetryConfig::throttle_retry_policy(), call_name),
107
- )
108
- }
109
- }
110
-
111
- #[derive(Debug)]
112
- pub(crate) struct TonicErrorHandler<C: Clock> {
113
- backoff: ExponentialBackoff<C>,
114
- throttle_backoff: ExponentialBackoff<C>,
115
- max_retries: usize,
116
- call_type: CallType,
117
- call_name: &'static str,
118
- }
119
- impl TonicErrorHandler<SystemClock> {
120
- fn new(cfg: RetryConfig, throttle_cfg: RetryConfig, call_name: &'static str) -> Self {
121
- Self::new_with_clock(
122
- cfg,
123
- throttle_cfg,
124
- call_name,
125
- SystemClock::default(),
126
- SystemClock::default(),
127
- )
128
- }
129
- }
130
- impl<C> TonicErrorHandler<C>
131
- where
132
- C: Clock,
133
- {
134
- fn new_with_clock(
135
- cfg: RetryConfig,
136
- throttle_cfg: RetryConfig,
137
- call_name: &'static str,
138
- clock: C,
139
- throttle_clock: C,
140
- ) -> Self {
141
- Self {
142
- max_retries: cfg.max_retries,
143
- call_type: CallType::from_call_name(call_name),
144
- call_name,
145
- backoff: cfg.into_exp_backoff(clock),
146
- throttle_backoff: throttle_cfg.into_exp_backoff(throttle_clock),
147
- }
148
- }
149
- const fn should_log_retry_warning(&self, cur_attempt: usize) -> bool {
150
- // Warn on more than 5 retries for unlimited retrying
151
- if self.max_retries == 0 && cur_attempt > 5 {
152
- return true;
153
- }
154
- // Warn if the attempts are more than 50% of max retries
155
- if self.max_retries > 0 && cur_attempt * 2 >= self.max_retries {
156
- return true;
157
- }
158
- false
159
- }
160
- }
161
- #[doc(hidden)]
162
- #[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
163
- pub enum CallType {
164
- Normal,
165
- LongPoll,
166
- }
167
- impl CallType {
168
- fn from_call_name(call_name: &str) -> Self {
169
- match call_name {
170
- POLL_WORKFLOW_METH_NAME | POLL_ACTIVITY_METH_NAME => CallType::LongPoll,
171
- _ => CallType::Normal,
172
- }
173
- }
174
- }
175
-
176
- impl<C> ErrorHandler<tonic::Status> for TonicErrorHandler<C>
177
- where
178
- C: Clock,
179
- {
180
- type OutError = tonic::Status;
181
-
182
- fn handle(&mut self, current_attempt: usize, e: tonic::Status) -> RetryPolicy<tonic::Status> {
183
- // 0 max retries means unlimited retries
184
- if self.max_retries > 0 && current_attempt >= self.max_retries {
185
- return RetryPolicy::ForwardError(e);
186
- }
187
-
188
- let is_long_poll = self.call_type == CallType::LongPoll;
189
- // Long polls are OK with being cancelled or running into the timeout because there's
190
- // nothing to do but retry anyway
191
- let long_poll_allowed =
192
- is_long_poll && [Code::Cancelled, Code::DeadlineExceeded].contains(&e.code());
193
-
194
- if RETRYABLE_ERROR_CODES.contains(&e.code()) || long_poll_allowed {
195
- if current_attempt == 1 {
196
- debug!(error=?e, "gRPC call {} failed on first attempt", self.call_name);
197
- } else if self.should_log_retry_warning(current_attempt) {
198
- warn!(error=?e, "gRPC call {} retried {} times", self.call_name, current_attempt);
199
- }
200
-
201
- match self.backoff.next_backoff() {
202
- None => RetryPolicy::ForwardError(e), // None is returned when we've ran out of time
203
- Some(backoff) => {
204
- // We treat ResourceExhausted as a special case and backoff more
205
- // so we don't overload the server
206
- if e.code() == Code::ResourceExhausted {
207
- let extended_backoff =
208
- backoff.max(self.throttle_backoff.next_backoff().unwrap_or_default());
209
- RetryPolicy::WaitRetry(extended_backoff)
210
- } else {
211
- RetryPolicy::WaitRetry(backoff)
212
- }
213
- }
214
- }
215
- } else if is_long_poll && self.backoff.get_elapsed_time() <= LONG_POLL_FATAL_GRACE {
216
- // We permit "fatal" errors while long polling for a while, because some proxies return
217
- // stupid error codes while getting ready, among other weird infra issues
218
- RetryPolicy::WaitRetry(self.backoff.max_interval)
219
- } else {
220
- RetryPolicy::ForwardError(e)
221
- }
222
- }
223
- }
224
-
225
- macro_rules! retry_call {
226
- ($myself:ident, $call_name:ident) => { retry_call!($myself, $call_name,) };
227
- ($myself:ident, $call_name:ident, $($args:expr),*) => {{
228
- let call_name_str = stringify!($call_name);
229
- let fact = || { $myself.get_client().$call_name($($args,)*)};
230
- $myself.call_with_retry(fact, call_name_str).await
231
- }}
232
- }
233
-
234
- // Ideally, this would be auto-implemented for anything that implements the raw client, but that
235
- // breaks all our retry clients which use a mock since it's based on this trait currently. Ideally
236
- // we would create an automock for the WorkflowServiceClient copy-paste trait and use that, but
237
- // that's a huge pain. Maybe one day tonic will provide traits.
238
- #[async_trait::async_trait]
239
- impl<SG> WorkflowClientTrait for RetryClient<SG>
240
- where
241
- SG: WorkflowClientTrait + Send + Sync + 'static,
242
- {
243
- async fn start_workflow(
244
- &self,
245
- input: Vec<Payload>,
246
- task_queue: String,
247
- workflow_id: String,
248
- workflow_type: String,
249
- request_id: Option<String>,
250
- options: WorkflowOptions,
251
- ) -> Result<StartWorkflowExecutionResponse> {
252
- retry_call!(
253
- self,
254
- start_workflow,
255
- input.clone(),
256
- task_queue.clone(),
257
- workflow_id.clone(),
258
- workflow_type.clone(),
259
- request_id.clone(),
260
- options.clone()
261
- )
262
- }
263
-
264
- async fn reset_sticky_task_queue(
265
- &self,
266
- workflow_id: String,
267
- run_id: String,
268
- ) -> Result<ResetStickyTaskQueueResponse> {
269
- retry_call!(
270
- self,
271
- reset_sticky_task_queue,
272
- workflow_id.clone(),
273
- run_id.clone()
274
- )
275
- }
276
-
277
- async fn complete_activity_task(
278
- &self,
279
- task_token: TaskToken,
280
- result: Option<Payloads>,
281
- ) -> Result<RespondActivityTaskCompletedResponse> {
282
- retry_call!(
283
- self,
284
- complete_activity_task,
285
- task_token.clone(),
286
- result.clone()
287
- )
288
- }
289
-
290
- async fn record_activity_heartbeat(
291
- &self,
292
- task_token: TaskToken,
293
- details: Option<Payloads>,
294
- ) -> Result<RecordActivityTaskHeartbeatResponse> {
295
- retry_call!(
296
- self,
297
- record_activity_heartbeat,
298
- task_token.clone(),
299
- details.clone()
300
- )
301
- }
302
-
303
- async fn cancel_activity_task(
304
- &self,
305
- task_token: TaskToken,
306
- details: Option<Payloads>,
307
- ) -> Result<RespondActivityTaskCanceledResponse> {
308
- retry_call!(
309
- self,
310
- cancel_activity_task,
311
- task_token.clone(),
312
- details.clone()
313
- )
314
- }
315
-
316
- async fn fail_activity_task(
317
- &self,
318
- task_token: TaskToken,
319
- failure: Option<Failure>,
320
- ) -> Result<RespondActivityTaskFailedResponse> {
321
- retry_call!(
322
- self,
323
- fail_activity_task,
324
- task_token.clone(),
325
- failure.clone()
326
- )
327
- }
328
-
329
- async fn fail_workflow_task(
330
- &self,
331
- task_token: TaskToken,
332
- cause: WorkflowTaskFailedCause,
333
- failure: Option<Failure>,
334
- ) -> Result<RespondWorkflowTaskFailedResponse> {
335
- retry_call!(
336
- self,
337
- fail_workflow_task,
338
- task_token.clone(),
339
- cause,
340
- failure.clone()
341
- )
342
- }
343
-
344
- async fn signal_workflow_execution(
345
- &self,
346
- workflow_id: String,
347
- run_id: String,
348
- signal_name: String,
349
- payloads: Option<Payloads>,
350
- request_id: Option<String>,
351
- ) -> Result<SignalWorkflowExecutionResponse> {
352
- retry_call!(
353
- self,
354
- signal_workflow_execution,
355
- workflow_id.clone(),
356
- run_id.clone(),
357
- signal_name.clone(),
358
- payloads.clone(),
359
- request_id.clone()
360
- )
361
- }
362
-
363
- async fn signal_with_start_workflow_execution(
364
- &self,
365
- options: SignalWithStartOptions,
366
- workflow_options: WorkflowOptions,
367
- ) -> Result<SignalWithStartWorkflowExecutionResponse> {
368
- retry_call!(
369
- self,
370
- signal_with_start_workflow_execution,
371
- options.clone(),
372
- workflow_options.clone()
373
- )
374
- }
375
-
376
- async fn query_workflow_execution(
377
- &self,
378
- workflow_id: String,
379
- run_id: String,
380
- query: WorkflowQuery,
381
- ) -> Result<QueryWorkflowResponse> {
382
- retry_call!(
383
- self,
384
- query_workflow_execution,
385
- workflow_id.clone(),
386
- run_id.clone(),
387
- query.clone()
388
- )
389
- }
390
-
391
- async fn describe_workflow_execution(
392
- &self,
393
- workflow_id: String,
394
- run_id: Option<String>,
395
- ) -> Result<DescribeWorkflowExecutionResponse> {
396
- retry_call!(
397
- self,
398
- describe_workflow_execution,
399
- workflow_id.clone(),
400
- run_id.clone()
401
- )
402
- }
403
-
404
- async fn get_workflow_execution_history(
405
- &self,
406
- workflow_id: String,
407
- run_id: Option<String>,
408
- page_token: Vec<u8>,
409
- ) -> Result<GetWorkflowExecutionHistoryResponse> {
410
- retry_call!(
411
- self,
412
- get_workflow_execution_history,
413
- workflow_id.clone(),
414
- run_id.clone(),
415
- page_token.clone()
416
- )
417
- }
418
-
419
- async fn respond_legacy_query(
420
- &self,
421
- task_token: TaskToken,
422
- query_result: QueryResult,
423
- ) -> Result<RespondQueryTaskCompletedResponse> {
424
- retry_call!(
425
- self,
426
- respond_legacy_query,
427
- task_token.clone(),
428
- query_result.clone()
429
- )
430
- }
431
-
432
- async fn cancel_workflow_execution(
433
- &self,
434
- workflow_id: String,
435
- run_id: Option<String>,
436
- reason: String,
437
- request_id: Option<String>,
438
- ) -> Result<RequestCancelWorkflowExecutionResponse> {
439
- retry_call!(
440
- self,
441
- cancel_workflow_execution,
442
- workflow_id.clone(),
443
- run_id.clone(),
444
- reason.clone(),
445
- request_id.clone()
446
- )
447
- }
448
-
449
- async fn terminate_workflow_execution(
450
- &self,
451
- workflow_id: String,
452
- run_id: Option<String>,
453
- ) -> Result<TerminateWorkflowExecutionResponse> {
454
- retry_call!(
455
- self,
456
- terminate_workflow_execution,
457
- workflow_id.clone(),
458
- run_id.clone()
459
- )
460
- }
461
-
462
- async fn register_namespace(
463
- &self,
464
- options: RegisterNamespaceOptions,
465
- ) -> Result<RegisterNamespaceResponse> {
466
- retry_call!(self, register_namespace, options.clone())
467
- }
468
-
469
- async fn list_namespaces(&self) -> Result<ListNamespacesResponse> {
470
- retry_call!(self, list_namespaces,)
471
- }
472
-
473
- async fn describe_namespace(&self, namespace: Namespace) -> Result<DescribeNamespaceResponse> {
474
- retry_call!(self, describe_namespace, namespace.clone())
475
- }
476
-
477
- async fn list_open_workflow_executions(
478
- &self,
479
- maximum_page_size: i32,
480
- next_page_token: Vec<u8>,
481
- start_time_filter: Option<StartTimeFilter>,
482
- filters: Option<ListOpenFilters>,
483
- ) -> Result<ListOpenWorkflowExecutionsResponse> {
484
- retry_call!(
485
- self,
486
- list_open_workflow_executions,
487
- maximum_page_size,
488
- next_page_token.clone(),
489
- start_time_filter.clone(),
490
- filters.clone()
491
- )
492
- }
493
-
494
- async fn list_closed_workflow_executions(
495
- &self,
496
- maximum_page_size: i32,
497
- next_page_token: Vec<u8>,
498
- start_time_filter: Option<StartTimeFilter>,
499
- filters: Option<ListClosedFilters>,
500
- ) -> Result<ListClosedWorkflowExecutionsResponse> {
501
- retry_call!(
502
- self,
503
- list_closed_workflow_executions,
504
- maximum_page_size,
505
- next_page_token.clone(),
506
- start_time_filter.clone(),
507
- filters.clone()
508
- )
509
- }
510
-
511
- async fn list_workflow_executions(
512
- &self,
513
- page_size: i32,
514
- next_page_token: Vec<u8>,
515
- query: String,
516
- ) -> Result<ListWorkflowExecutionsResponse> {
517
- retry_call!(
518
- self,
519
- list_workflow_executions,
520
- page_size,
521
- next_page_token.clone(),
522
- query.clone()
523
- )
524
- }
525
-
526
- async fn list_archived_workflow_executions(
527
- &self,
528
- page_size: i32,
529
- next_page_token: Vec<u8>,
530
- query: String,
531
- ) -> Result<ListArchivedWorkflowExecutionsResponse> {
532
- retry_call!(
533
- self,
534
- list_archived_workflow_executions,
535
- page_size,
536
- next_page_token.clone(),
537
- query.clone()
538
- )
539
- }
540
-
541
- async fn get_search_attributes(&self) -> Result<GetSearchAttributesResponse> {
542
- retry_call!(self, get_search_attributes)
543
- }
544
-
545
- fn get_options(&self) -> &ClientOptions {
546
- self.client.get_options()
547
- }
548
-
549
- fn namespace(&self) -> &str {
550
- self.client.namespace()
551
- }
552
- }
553
-
554
- #[cfg(test)]
555
- mod tests {
556
- use super::*;
557
- use crate::MockWorkflowClientTrait;
558
- use assert_matches::assert_matches;
559
- use backoff::Clock;
560
- use std::{ops::Add, time::Instant};
561
- use tonic::Status;
562
-
563
- /// Predefined retry configs with low durations to make unit tests faster
564
- const TEST_RETRY_CONFIG: RetryConfig = RetryConfig {
565
- initial_interval: Duration::from_millis(1),
566
- randomization_factor: 0.0,
567
- multiplier: 1.1,
568
- max_interval: Duration::from_millis(2),
569
- max_elapsed_time: None,
570
- max_retries: 10,
571
- };
572
-
573
- #[tokio::test]
574
- async fn non_retryable_errors() {
575
- for code in [
576
- Code::InvalidArgument,
577
- Code::NotFound,
578
- Code::AlreadyExists,
579
- Code::PermissionDenied,
580
- Code::FailedPrecondition,
581
- Code::Cancelled,
582
- Code::DeadlineExceeded,
583
- Code::Unauthenticated,
584
- Code::Unimplemented,
585
- ] {
586
- let mut mock_client = MockWorkflowClientTrait::new();
587
- mock_client
588
- .expect_cancel_activity_task()
589
- .returning(move |_, _| Err(Status::new(code, "non-retryable failure")))
590
- .times(1);
591
- let retry_client = RetryClient::new(mock_client, TEST_RETRY_CONFIG);
592
- let result = retry_client
593
- .cancel_activity_task(vec![1].into(), None)
594
- .await;
595
- // Expecting an error after a single attempt, since there was a non-retryable error.
596
- assert!(result.is_err());
597
- }
598
- }
599
-
600
- struct FixedClock(Instant);
601
- impl Clock for FixedClock {
602
- fn now(&self) -> Instant {
603
- self.0
604
- }
605
- }
606
-
607
- #[tokio::test]
608
- async fn long_poll_non_retryable_errors() {
609
- for code in [
610
- Code::InvalidArgument,
611
- Code::NotFound,
612
- Code::AlreadyExists,
613
- Code::PermissionDenied,
614
- Code::FailedPrecondition,
615
- Code::Unauthenticated,
616
- Code::Unimplemented,
617
- ] {
618
- for call_name in [POLL_WORKFLOW_METH_NAME, POLL_ACTIVITY_METH_NAME] {
619
- let mut err_handler = TonicErrorHandler {
620
- max_retries: TEST_RETRY_CONFIG.max_retries,
621
- call_type: CallType::LongPoll,
622
- call_name,
623
- backoff: TEST_RETRY_CONFIG.into_exp_backoff(FixedClock(Instant::now())),
624
- throttle_backoff: TEST_RETRY_CONFIG
625
- .into_exp_backoff(FixedClock(Instant::now())),
626
- };
627
- let result = err_handler.handle(1, Status::new(code, "Ahh"));
628
- assert_matches!(result, RetryPolicy::WaitRetry(_));
629
- err_handler.backoff.clock.0 = err_handler
630
- .backoff
631
- .clock
632
- .0
633
- .add(LONG_POLL_FATAL_GRACE + Duration::from_secs(1));
634
- let result = err_handler.handle(2, Status::new(code, "Ahh"));
635
- assert_matches!(result, RetryPolicy::ForwardError(_));
636
- }
637
- }
638
- }
639
-
640
- #[tokio::test]
641
- async fn long_poll_retryable_errors_never_fatal() {
642
- for code in RETRYABLE_ERROR_CODES {
643
- for call_name in [POLL_WORKFLOW_METH_NAME, POLL_ACTIVITY_METH_NAME] {
644
- let mut err_handler = TonicErrorHandler {
645
- max_retries: TEST_RETRY_CONFIG.max_retries,
646
- call_type: CallType::LongPoll,
647
- call_name,
648
- backoff: TEST_RETRY_CONFIG.into_exp_backoff(FixedClock(Instant::now())),
649
- throttle_backoff: TEST_RETRY_CONFIG
650
- .into_exp_backoff(FixedClock(Instant::now())),
651
- };
652
- let result = err_handler.handle(1, Status::new(code, "Ahh"));
653
- assert_matches!(result, RetryPolicy::WaitRetry(_));
654
- err_handler.backoff.clock.0 = err_handler
655
- .backoff
656
- .clock
657
- .0
658
- .add(LONG_POLL_FATAL_GRACE + Duration::from_secs(1));
659
- let result = err_handler.handle(2, Status::new(code, "Ahh"));
660
- assert_matches!(result, RetryPolicy::WaitRetry(_));
661
- }
662
- }
663
- }
664
-
665
- #[tokio::test]
666
- async fn retryable_errors() {
667
- // Take out retry exhausted since it gets a special policy which would make this take ages
668
- for code in RETRYABLE_ERROR_CODES
669
- .iter()
670
- .copied()
671
- .filter(|p| p != &Code::ResourceExhausted)
672
- {
673
- let mut mock_client = MockWorkflowClientTrait::new();
674
- mock_client
675
- .expect_cancel_activity_task()
676
- .returning(move |_, _| Err(Status::new(code, "retryable failure")))
677
- .times(3);
678
- mock_client
679
- .expect_cancel_activity_task()
680
- .returning(|_, _| Ok(Default::default()))
681
- .times(1);
682
-
683
- let retry_client = RetryClient::new(mock_client, TEST_RETRY_CONFIG);
684
- let result = retry_client
685
- .cancel_activity_task(vec![1].into(), None)
686
- .await;
687
- // Expecting successful response after retries
688
- assert!(result.is_ok());
689
- }
690
- }
691
-
692
- #[tokio::test]
693
- async fn retry_resource_exhausted() {
694
- let mut err_handler = TonicErrorHandler {
695
- max_retries: TEST_RETRY_CONFIG.max_retries,
696
- call_type: CallType::Normal,
697
- call_name: POLL_WORKFLOW_METH_NAME,
698
- backoff: TEST_RETRY_CONFIG.into_exp_backoff(FixedClock(Instant::now())),
699
- throttle_backoff: RetryConfig {
700
- initial_interval: Duration::from_millis(2),
701
- randomization_factor: 0.0,
702
- multiplier: 4.0,
703
- max_interval: Duration::from_millis(10),
704
- max_elapsed_time: None,
705
- max_retries: 10,
706
- }
707
- .into_exp_backoff(FixedClock(Instant::now())),
708
- };
709
- let result = err_handler.handle(1, Status::new(Code::ResourceExhausted, "leave me alone"));
710
- match result {
711
- RetryPolicy::WaitRetry(duration) => assert_eq!(duration, Duration::from_millis(2)),
712
- _ => panic!(),
713
- }
714
- err_handler.backoff.clock.0 = err_handler.backoff.clock.0.add(Duration::from_millis(10));
715
- err_handler.throttle_backoff.clock.0 = err_handler
716
- .throttle_backoff
717
- .clock
718
- .0
719
- .add(Duration::from_millis(10));
720
- let result = err_handler.handle(2, Status::new(Code::ResourceExhausted, "leave me alone"));
721
- match result {
722
- RetryPolicy::WaitRetry(duration) => assert_eq!(duration, Duration::from_millis(8)),
723
- _ => panic!(),
724
- }
725
- }
726
-
727
- #[tokio::test]
728
- async fn long_poll_retries_forever() {
729
- // A bit odd, but we don't need a real client to test the retry client passes through the
730
- // correct retry config
731
- let fake_retry = RetryClient::new((), TEST_RETRY_CONFIG);
732
- for i in 1..=50 {
733
- for call in [POLL_WORKFLOW_METH_NAME, POLL_ACTIVITY_METH_NAME] {
734
- let mut err_handler = TonicErrorHandler::new(
735
- fake_retry.get_retry_config(call),
736
- fake_retry.get_retry_config(call),
737
- call,
738
- );
739
- let result = err_handler.handle(i, Status::new(Code::Unknown, "Ahh"));
740
- assert_matches!(result, RetryPolicy::WaitRetry(_));
741
- }
742
- }
743
- }
744
-
745
- #[tokio::test]
746
- async fn long_poll_retries_deadline_exceeded() {
747
- let fake_retry = RetryClient::new((), TEST_RETRY_CONFIG);
748
- // For some reason we will get cancelled in these situations occasionally (always?) too
749
- for code in [Code::Cancelled, Code::DeadlineExceeded] {
750
- for call in [POLL_WORKFLOW_METH_NAME, POLL_ACTIVITY_METH_NAME] {
751
- let mut err_handler = TonicErrorHandler::new(
752
- fake_retry.get_retry_config(call),
753
- fake_retry.get_retry_config(call),
754
- call,
755
- );
756
- for i in 1..=5 {
757
- let result = err_handler.handle(i, Status::new(code, "retryable failure"));
758
- assert_matches!(result, RetryPolicy::WaitRetry(_));
759
- }
760
- }
761
- }
762
- }
763
- }