@rivetkit/engine 1.0.0 → 2.2.1-pr.4600.b74ff3b

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 (1038) hide show
  1. package/CLAUDE.md +38 -0
  2. package/artifacts/config-schema.json +1140 -0
  3. package/artifacts/errors/actor.kv_storage_quota_exceeded.json +5 -0
  4. package/artifacts/errors/actor.no_runner_config_configured.json +5 -0
  5. package/artifacts/errors/guard.actor_runner_failed.json +5 -0
  6. package/artifacts/errors/guard.invalid_request.json +5 -0
  7. package/artifacts/errors/guard.invalid_request_body.json +5 -0
  8. package/artifacts/errors/guard.invalid_response_body.json +5 -0
  9. package/artifacts/errors/guard.missing_query_parameter.json +5 -0
  10. package/artifacts/errors/guard.query_ambiguous_runner_configs.json +5 -0
  11. package/artifacts/errors/guard.query_duplicate_param.json +5 -0
  12. package/artifacts/errors/guard.query_empty_actor_name.json +5 -0
  13. package/artifacts/errors/guard.query_get_disallowed_params.json +5 -0
  14. package/artifacts/errors/guard.query_invalid_base64_input.json +5 -0
  15. package/artifacts/errors/guard.query_invalid_cbor_input.json +5 -0
  16. package/artifacts/errors/guard.query_invalid_params.json +5 -0
  17. package/artifacts/errors/guard.query_invalid_percent_encoding.json +5 -0
  18. package/artifacts/errors/guard.query_missing_runner_name.json +5 -0
  19. package/artifacts/errors/guard.query_no_runner_configs.json +5 -0
  20. package/artifacts/errors/guard.query_param_missing_equals.json +5 -0
  21. package/artifacts/errors/guard.query_path_token_syntax.json +5 -0
  22. package/artifacts/errors/guard.query_unknown_param.json +5 -0
  23. package/artifacts/errors/guard.request_body_too_large.json +5 -0
  24. package/artifacts/errors/guard.response_body_too_large.json +5 -0
  25. package/artifacts/errors/serverless_runner_pool.failed_to_fetch_metadata.json +5 -0
  26. package/artifacts/errors/serverless_runner_pool.not_found.json +5 -0
  27. package/artifacts/errors/{api.rate_limited.json → test.api_rate_limited.json} +2 -2
  28. package/artifacts/errors/{namespace.invalid_name.json → test.namespace_invalid_name.json} +2 -2
  29. package/artifacts/errors/ws.going_away.json +5 -0
  30. package/artifacts/openapi.json +458 -6
  31. package/docker/builder-base/linux-gnu.Dockerfile +21 -0
  32. package/docker/builder-base/linux-musl.Dockerfile +53 -0
  33. package/docker/builder-base/osxcross.Dockerfile +42 -0
  34. package/docker/builder-base/windows-mingw.Dockerfile +41 -0
  35. package/docker/builder-base/windows-msvc.Dockerfile +25 -0
  36. package/docker/dev/docker-compose.yml +43 -18
  37. package/docker/dev/grafana/dashboards/api.json +1077 -1239
  38. package/docker/dev/grafana/dashboards/cache.json +911 -1074
  39. package/docker/dev/grafana/dashboards/epoxy.json +1606 -0
  40. package/docker/dev/grafana/dashboards/futures.json +242 -229
  41. package/docker/dev/grafana/dashboards/gasoline.json +2663 -2476
  42. package/docker/dev/grafana/dashboards/guard.json +1433 -1273
  43. package/docker/dev/grafana/dashboards/operation.json +871 -0
  44. package/docker/dev/grafana/dashboards/pegboard.json +1274 -0
  45. package/docker/dev/grafana/dashboards/tokio.json +930 -1004
  46. package/docker/dev/grafana/dashboards/traces.json +35 -13
  47. package/docker/dev/grafana/provisioning/datasources/datasources.yaml +8 -0
  48. package/docker/{dev-multinode/otel-collector-server → dev/otel-collector}/config.yaml +18 -13
  49. package/docker/dev/prometheus/prometheus.yml +4 -0
  50. package/docker/dev/rivet-engine/config.jsonc +9 -16
  51. package/docker/dev-host/docker-compose.yml +38 -16
  52. package/docker/dev-host/grafana/dashboards/api.json +1077 -1239
  53. package/docker/dev-host/grafana/dashboards/cache.json +911 -1074
  54. package/docker/dev-host/grafana/dashboards/epoxy.json +1606 -0
  55. package/docker/dev-host/grafana/dashboards/futures.json +242 -229
  56. package/docker/dev-host/grafana/dashboards/gasoline.json +2663 -2476
  57. package/docker/dev-host/grafana/dashboards/guard.json +1433 -1273
  58. package/docker/dev-host/grafana/dashboards/operation.json +871 -0
  59. package/docker/dev-host/grafana/dashboards/pegboard.json +1274 -0
  60. package/docker/dev-host/grafana/dashboards/tokio.json +930 -1004
  61. package/docker/dev-host/grafana/dashboards/traces.json +35 -13
  62. package/docker/dev-host/grafana/provisioning/datasources/datasources.yaml +8 -0
  63. package/docker/dev-host/{otel-collector-server → otel-collector}/config.yaml +18 -13
  64. package/docker/dev-host/prometheus/prometheus.yml +4 -0
  65. package/docker/dev-host/rivet-engine/config.jsonc +9 -16
  66. package/docker/dev-multidc/core/grafana/dashboards/api.json +1077 -1239
  67. package/docker/dev-multidc/core/grafana/dashboards/cache.json +911 -1074
  68. package/docker/dev-multidc/core/grafana/dashboards/epoxy.json +1606 -0
  69. package/docker/dev-multidc/core/grafana/dashboards/futures.json +242 -229
  70. package/docker/dev-multidc/core/grafana/dashboards/gasoline.json +2663 -2476
  71. package/docker/dev-multidc/core/grafana/dashboards/guard.json +1433 -1273
  72. package/docker/dev-multidc/core/grafana/dashboards/operation.json +871 -0
  73. package/docker/dev-multidc/core/grafana/dashboards/pegboard.json +1274 -0
  74. package/docker/dev-multidc/core/grafana/dashboards/tokio.json +930 -1004
  75. package/docker/dev-multidc/core/grafana/dashboards/traces.json +35 -13
  76. package/docker/dev-multidc/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  77. package/docker/dev-multidc/core/prometheus/prometheus.yml +4 -0
  78. package/docker/dev-multidc/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +18 -13
  79. package/docker/dev-multidc/datacenters/dc-a/rivet-engine/config.jsonc +23 -22
  80. package/docker/{dev-multidc-multinode/datacenters/dc-b/otel-collector-server → dev-multidc/datacenters/dc-b/otel-collector}/config.yaml +18 -13
  81. package/docker/dev-multidc/datacenters/dc-b/rivet-engine/config.jsonc +23 -22
  82. package/docker/dev-multidc/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +18 -13
  83. package/docker/dev-multidc/datacenters/dc-c/rivet-engine/config.jsonc +23 -22
  84. package/docker/dev-multidc/docker-compose.yml +71 -64
  85. package/docker/dev-multidc-multinode/core/grafana/dashboards/api.json +1077 -1239
  86. package/docker/dev-multidc-multinode/core/grafana/dashboards/cache.json +911 -1074
  87. package/docker/dev-multidc-multinode/core/grafana/dashboards/epoxy.json +1606 -0
  88. package/docker/dev-multidc-multinode/core/grafana/dashboards/futures.json +242 -229
  89. package/docker/dev-multidc-multinode/core/grafana/dashboards/gasoline.json +2663 -2476
  90. package/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json +1433 -1273
  91. package/docker/dev-multidc-multinode/core/grafana/dashboards/operation.json +871 -0
  92. package/docker/dev-multidc-multinode/core/grafana/dashboards/pegboard.json +1274 -0
  93. package/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json +930 -1004
  94. package/docker/dev-multidc-multinode/core/grafana/dashboards/traces.json +35 -13
  95. package/docker/dev-multidc-multinode/core/grafana/provisioning/datasources/datasources.yaml +8 -0
  96. package/docker/dev-multidc-multinode/core/prometheus/prometheus.yml +4 -0
  97. package/docker/dev-multidc-multinode/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +28 -13
  98. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/0/config.jsonc +23 -22
  99. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/1/config.jsonc +23 -22
  100. package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/2/config.jsonc +23 -22
  101. package/docker/{dev-multidc/datacenters/dc-b/otel-collector-server → dev-multidc-multinode/datacenters/dc-b/otel-collector}/config.yaml +28 -13
  102. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/0/config.jsonc +23 -22
  103. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/1/config.jsonc +23 -22
  104. package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/2/config.jsonc +23 -22
  105. package/docker/dev-multidc-multinode/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +28 -13
  106. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/0/config.jsonc +23 -22
  107. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/1/config.jsonc +23 -22
  108. package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/2/config.jsonc +23 -22
  109. package/docker/dev-multidc-multinode/docker-compose.yml +113 -88
  110. package/docker/dev-multinode/docker-compose.yml +57 -26
  111. package/docker/dev-multinode/grafana/dashboards/api.json +1077 -1239
  112. package/docker/dev-multinode/grafana/dashboards/cache.json +911 -1074
  113. package/docker/dev-multinode/grafana/dashboards/epoxy.json +1606 -0
  114. package/docker/dev-multinode/grafana/dashboards/futures.json +242 -229
  115. package/docker/dev-multinode/grafana/dashboards/gasoline.json +2663 -2476
  116. package/docker/dev-multinode/grafana/dashboards/guard.json +1433 -1273
  117. package/docker/dev-multinode/grafana/dashboards/operation.json +871 -0
  118. package/docker/dev-multinode/grafana/dashboards/pegboard.json +1274 -0
  119. package/docker/dev-multinode/grafana/dashboards/tokio.json +930 -1004
  120. package/docker/dev-multinode/grafana/dashboards/traces.json +35 -13
  121. package/docker/dev-multinode/grafana/provisioning/datasources/datasources.yaml +8 -0
  122. package/docker/{dev/otel-collector-server → dev-multinode/otel-collector}/config.yaml +28 -13
  123. package/docker/dev-multinode/prometheus/prometheus.yml +4 -0
  124. package/docker/dev-multinode/rivet-engine/0/config.jsonc +9 -16
  125. package/docker/dev-multinode/rivet-engine/1/config.jsonc +9 -16
  126. package/docker/dev-multinode/rivet-engine/2/config.jsonc +9 -16
  127. package/docker/engine/linux-aarch64.Dockerfile +9 -49
  128. package/docker/engine/linux-x86_64.Dockerfile +7 -57
  129. package/docker/engine/macos-aarch64.Dockerfile +8 -54
  130. package/docker/engine/macos-x86_64.Dockerfile +9 -55
  131. package/docker/engine/windows.Dockerfile +5 -53
  132. package/docker/template/grafana-dashboards/api.json +1077 -1239
  133. package/docker/template/grafana-dashboards/cache.json +911 -1074
  134. package/docker/template/grafana-dashboards/epoxy.json +1606 -0
  135. package/docker/template/grafana-dashboards/futures.json +242 -229
  136. package/docker/template/grafana-dashboards/gasoline.json +2663 -2476
  137. package/docker/template/grafana-dashboards/guard.json +1433 -1273
  138. package/docker/template/grafana-dashboards/operation.json +871 -0
  139. package/docker/template/grafana-dashboards/pegboard.json +1274 -0
  140. package/docker/template/grafana-dashboards/tokio.json +930 -1004
  141. package/docker/template/grafana-dashboards/traces.json +35 -13
  142. package/docker/template/node_modules/.bin/js-yaml +4 -4
  143. package/docker/template/node_modules/.bin/tsc +4 -4
  144. package/docker/template/node_modules/.bin/tsserver +4 -4
  145. package/docker/template/node_modules/.bin/tsx +4 -4
  146. package/docker/template/src/docker-compose.ts +42 -29
  147. package/docker/template/src/main.ts +4 -4
  148. package/docker/template/src/services/core/grafana.ts +14 -1
  149. package/docker/template/src/services/core/prometheus.ts +20 -0
  150. package/docker/template/src/services/edge/{otel-collector-server.ts → otel-collector.ts} +55 -24
  151. package/docker/template/src/services/edge/rivet-engine.ts +4 -16
  152. package/docker/template/src/services/edge/runner.ts +2 -3
  153. package/docker/universal/Dockerfile +5 -3
  154. package/package.json +2 -5
  155. package/packages/api-builder/src/global_context.rs +1 -1
  156. package/packages/api-builder/src/metrics.rs +28 -24
  157. package/packages/api-builder/src/middleware.rs +30 -48
  158. package/packages/api-builder/src/router.rs +13 -1
  159. package/packages/api-peer/Cargo.toml +7 -9
  160. package/packages/api-peer/src/actors/delete.rs +56 -57
  161. package/packages/api-peer/src/actors/get_or_create.rs +139 -0
  162. package/packages/api-peer/src/actors/kv_get.rs +40 -28
  163. package/packages/api-peer/src/actors/list.rs +31 -14
  164. package/packages/api-peer/src/actors/list_names.rs +6 -6
  165. package/packages/api-peer/src/actors/mod.rs +3 -0
  166. package/packages/api-peer/src/actors/reschedule.rs +55 -0
  167. package/packages/api-peer/src/actors/sleep.rs +55 -0
  168. package/packages/api-peer/src/envoys.rs +57 -0
  169. package/packages/api-peer/src/internal.rs +441 -24
  170. package/packages/api-peer/src/lib.rs +2 -1
  171. package/packages/api-peer/src/namespaces.rs +24 -9
  172. package/packages/api-peer/src/router.rs +31 -7
  173. package/packages/api-peer/src/runner_configs.rs +66 -19
  174. package/packages/api-peer/src/runners.rs +30 -32
  175. package/packages/api-public/Cargo.toml +2 -0
  176. package/packages/api-public/src/actors/create.rs +8 -17
  177. package/packages/api-public/src/actors/delete.rs +11 -35
  178. package/packages/api-public/src/actors/get_or_create.rs +23 -95
  179. package/packages/api-public/src/actors/kv_get.rs +12 -29
  180. package/packages/api-public/src/actors/list.rs +56 -78
  181. package/packages/api-public/src/actors/list_names.rs +15 -14
  182. package/packages/api-public/src/actors/mod.rs +2 -0
  183. package/packages/api-public/src/actors/reschedule.rs +65 -0
  184. package/packages/api-public/src/actors/sleep.rs +64 -0
  185. package/packages/api-public/src/actors/utils.rs +12 -60
  186. package/packages/api-public/src/ctx.rs +14 -6
  187. package/packages/api-public/src/datacenters.rs +5 -5
  188. package/packages/api-public/src/envoys.rs +57 -0
  189. package/packages/api-public/src/errors.rs +0 -7
  190. package/packages/api-public/src/health.rs +51 -44
  191. package/packages/api-public/src/lib.rs +2 -1
  192. package/packages/api-public/src/metadata.rs +44 -14
  193. package/packages/api-public/src/namespaces.rs +11 -11
  194. package/packages/api-public/src/router.rs +22 -5
  195. package/packages/api-public/src/runner_configs/delete.rs +13 -10
  196. package/packages/api-public/src/runner_configs/list.rs +5 -2
  197. package/packages/api-public/src/runner_configs/refresh_metadata.rs +1 -1
  198. package/packages/api-public/src/runner_configs/serverless_health_check.rs +2 -2
  199. package/packages/api-public/src/runner_configs/upsert.rs +12 -9
  200. package/packages/api-public/src/runner_configs/utils.rs +35 -175
  201. package/packages/api-public/src/runners.rs +17 -45
  202. package/packages/{dump-openapi → api-public-openapi-gen}/Cargo.toml +1 -1
  203. package/packages/api-types/src/actors/create.rs +1 -0
  204. package/packages/api-types/src/actors/delete.rs +20 -0
  205. package/packages/api-types/src/actors/get_or_create.rs +30 -0
  206. package/packages/api-types/src/actors/kv_get.rs +25 -0
  207. package/packages/api-types/src/actors/list.rs +8 -1
  208. package/packages/api-types/src/actors/mod.rs +5 -0
  209. package/packages/api-types/src/actors/reschedule.rs +26 -0
  210. package/packages/api-types/src/actors/sleep.rs +26 -0
  211. package/packages/api-types/src/datacenters/list.rs +2 -2
  212. package/packages/api-types/src/envoys/list.rs +24 -0
  213. package/packages/api-types/src/envoys/mod.rs +1 -0
  214. package/packages/api-types/src/lib.rs +1 -0
  215. package/packages/api-types/src/namespaces/list.rs +4 -0
  216. package/packages/api-types/src/namespaces/runner_configs.rs +23 -2
  217. package/packages/api-types/src/runner_configs/list.rs +6 -1
  218. package/packages/api-types/src/runner_configs/mod.rs +12 -0
  219. package/packages/api-types/src/runners/list.rs +4 -0
  220. package/packages/api-types/src/runners/list_names.rs +21 -0
  221. package/packages/api-types/src/runners/mod.rs +1 -0
  222. package/packages/api-util/src/lib.rs +44 -21
  223. package/packages/bootstrap/Cargo.toml +7 -4
  224. package/packages/bootstrap/src/backfill.rs +53 -0
  225. package/packages/bootstrap/src/lib.rs +43 -7
  226. package/packages/cache/Cargo.toml +3 -1
  227. package/packages/cache/src/driver.rs +43 -151
  228. package/packages/cache/src/getter_ctx.rs +48 -70
  229. package/packages/cache/src/inner.rs +28 -18
  230. package/packages/cache/src/key.rs +17 -3
  231. package/packages/cache/src/lib.rs +0 -2
  232. package/packages/cache/src/metrics.rs +43 -31
  233. package/packages/cache/src/req_config.rs +219 -156
  234. package/packages/cache/tests/fetch.rs +91 -0
  235. package/packages/cache/tests/in_flight.rs +361 -0
  236. package/packages/cache/tests/ttl.rs +314 -0
  237. package/packages/cache-purge/src/lib.rs +1 -1
  238. package/packages/config/Cargo.toml +1 -0
  239. package/packages/config/src/config/cache.rs +10 -3
  240. package/packages/config/src/config/clickhouse.rs +0 -30
  241. package/packages/config/src/config/{db.rs → db/mod.rs} +3 -18
  242. package/packages/config/src/config/db/postgres.rs +59 -0
  243. package/packages/config/src/config/guard.rs +19 -0
  244. package/packages/config/src/config/metrics.rs +22 -0
  245. package/packages/config/src/config/mod.rs +44 -10
  246. package/packages/config/src/config/pegboard.rs +242 -16
  247. package/packages/config/src/config/pubsub.rs +11 -0
  248. package/packages/config/src/config/runtime.rs +58 -0
  249. package/packages/config/src/config/telemetry.rs +1 -0
  250. package/packages/config/src/config/topology.rs +78 -19
  251. package/packages/config/src/defaults.rs +3 -0
  252. package/packages/config/src/lib.rs +10 -1
  253. package/packages/config-schema-gen/Cargo.toml +11 -0
  254. package/packages/config-schema-gen/build.rs +26 -0
  255. package/packages/config-schema-gen/src/lib.rs +2 -0
  256. package/packages/engine/Cargo.toml +11 -2
  257. package/packages/engine/src/commands/db/mod.rs +0 -10
  258. package/packages/engine/src/commands/epoxy.rs +395 -0
  259. package/packages/engine/src/commands/mod.rs +1 -1
  260. package/packages/engine/src/commands/start.rs +43 -63
  261. package/packages/engine/src/commands/udb/cli.rs +148 -4
  262. package/packages/engine/src/commands/wf/mod.rs +83 -12
  263. package/packages/engine/src/commands/wf/signal.rs +38 -0
  264. package/packages/engine/src/lib.rs +6 -3
  265. package/packages/engine/src/main.rs +1 -1
  266. package/packages/engine/src/run_config.rs +6 -7
  267. package/packages/engine/src/util/db.rs +1 -25
  268. package/packages/engine/src/util/wf/mod.rs +39 -5
  269. package/packages/engine/tests/common/actors.rs +50 -332
  270. package/packages/engine/tests/common/api/mod.rs +7 -0
  271. package/packages/engine/tests/common/api/peer.rs +364 -0
  272. package/packages/engine/tests/common/api/public.rs +473 -0
  273. package/packages/engine/tests/common/ctx.rs +15 -3
  274. package/packages/engine/tests/common/mod.rs +8 -5
  275. package/packages/engine/tests/common/test_envoy.rs +87 -0
  276. package/packages/engine/tests/common/test_helpers.rs +218 -130
  277. package/packages/engine/tests/common/test_runner.rs +273 -0
  278. package/packages/engine/tests/envoy/actors_lifecycle.rs +1277 -0
  279. package/packages/engine/tests/envoy/mod.rs +1 -0
  280. package/packages/engine/tests/mod.rs +3 -0
  281. package/packages/engine/tests/runner/actors_alarm.rs +1453 -0
  282. package/packages/engine/tests/runner/actors_kv_crud.rs +996 -0
  283. package/packages/engine/tests/runner/actors_kv_delete_range.rs +126 -0
  284. package/packages/engine/tests/runner/actors_kv_drop.rs +255 -0
  285. package/packages/engine/tests/runner/actors_kv_list.rs +1061 -0
  286. package/packages/engine/tests/runner/actors_kv_misc.rs +882 -0
  287. package/packages/engine/tests/runner/actors_lifecycle.rs +1284 -0
  288. package/packages/engine/tests/runner/actors_scheduling_errors.rs +1005 -0
  289. package/packages/engine/tests/runner/api_actors_create.rs +422 -0
  290. package/packages/engine/tests/runner/api_actors_delete.rs +487 -0
  291. package/packages/engine/tests/runner/api_actors_get_or_create.rs +634 -0
  292. package/packages/engine/tests/runner/api_actors_list.rs +1771 -0
  293. package/packages/engine/tests/runner/api_actors_list_names.rs +691 -0
  294. package/packages/engine/tests/runner/api_namespaces_create.rs +428 -0
  295. package/packages/engine/tests/runner/api_namespaces_list.rs +760 -0
  296. package/packages/engine/tests/runner/api_runner_configs_list.rs +646 -0
  297. package/packages/engine/tests/runner/api_runner_configs_upsert.rs +651 -0
  298. package/packages/engine/tests/runner/api_runners_list.rs +166 -0
  299. package/packages/engine/tests/runner/api_runners_list_names.rs +386 -0
  300. package/packages/engine/tests/runner/mod.rs +20 -0
  301. package/packages/engine/tests/runner/runner_drain_on_version.rs +620 -0
  302. package/packages/env/Cargo.toml +0 -4
  303. package/packages/env/src/lib.rs +0 -18
  304. package/packages/epoxy/Cargo.toml +3 -2
  305. package/packages/epoxy/README.md +554 -93
  306. package/packages/epoxy/src/consts.rs +4 -36
  307. package/packages/epoxy/src/http_client.rs +59 -26
  308. package/packages/epoxy/src/http_routes.rs +73 -10
  309. package/packages/epoxy/src/keys/keys.rs +260 -11
  310. package/packages/epoxy/src/keys/mod.rs +11 -1
  311. package/packages/epoxy/src/keys/replica.rs +5 -260
  312. package/packages/epoxy/src/lib.rs +2 -1
  313. package/packages/epoxy/src/metrics.rs +118 -0
  314. package/packages/epoxy/src/ops/kv/get_local.rs +15 -24
  315. package/packages/epoxy/src/ops/kv/get_optimistic.rs +102 -64
  316. package/packages/epoxy/src/ops/kv/mod.rs +1 -0
  317. package/packages/epoxy/src/ops/kv/purge_local.rs +18 -9
  318. package/packages/epoxy/src/ops/kv/read_value.rs +92 -0
  319. package/packages/epoxy/src/ops/mod.rs +0 -1
  320. package/packages/epoxy/src/ops/propose.rs +1079 -194
  321. package/packages/epoxy/src/replica/ballot.rs +162 -102
  322. package/packages/epoxy/src/replica/changelog.rs +147 -0
  323. package/packages/epoxy/src/replica/commit_kv.rs +69 -66
  324. package/packages/epoxy/src/replica/message_request.rs +33 -48
  325. package/packages/epoxy/src/replica/messages/accept.rs +82 -41
  326. package/packages/epoxy/src/replica/messages/commit.rs +21 -33
  327. package/packages/epoxy/src/replica/messages/mod.rs +0 -8
  328. package/packages/epoxy/src/replica/messages/prepare.rs +68 -69
  329. package/packages/epoxy/src/replica/mod.rs +1 -6
  330. package/packages/epoxy/src/replica/update_config.rs +3 -1
  331. package/packages/epoxy/src/types.rs +30 -54
  332. package/packages/epoxy/src/utils.rs +149 -16
  333. package/packages/epoxy/src/workflows/backfill.rs +233 -0
  334. package/packages/epoxy/src/workflows/coordinator/mod.rs +33 -7
  335. package/packages/epoxy/src/workflows/coordinator/reconfigure.rs +44 -0
  336. package/packages/epoxy/src/workflows/coordinator/replica_status_change.rs +4 -3
  337. package/packages/epoxy/src/workflows/mod.rs +1 -1
  338. package/packages/epoxy/src/workflows/replica/mod.rs +4 -6
  339. package/packages/epoxy/src/workflows/replica/setup.rs +130 -771
  340. package/packages/epoxy/tests/backfill.rs +65 -0
  341. package/packages/epoxy/tests/backfill_snapshot.rs +233 -0
  342. package/packages/epoxy/tests/common/mod.rs +77 -21
  343. package/packages/epoxy/tests/common/utils.rs +366 -10
  344. package/packages/epoxy/tests/consensus_regressions.rs +285 -0
  345. package/packages/epoxy/tests/kv.rs +128 -167
  346. package/packages/epoxy/tests/kv_get_optimistic.rs +257 -157
  347. package/packages/epoxy/tests/migration.rs +75 -0
  348. package/packages/epoxy/tests/proposal.rs +133 -28
  349. package/packages/epoxy/tests/reconfigure.rs +92 -474
  350. package/packages/error/tests/basic.rs +8 -8
  351. package/packages/gasoline/Cargo.toml +1 -0
  352. package/packages/gasoline/src/builder/common/message.rs +19 -47
  353. package/packages/gasoline/src/builder/common/signal.rs +37 -21
  354. package/packages/gasoline/src/builder/common/workflow.rs +19 -15
  355. package/packages/gasoline/src/builder/workflow/lupe.rs +295 -0
  356. package/packages/gasoline/src/builder/workflow/message.rs +24 -47
  357. package/packages/gasoline/src/builder/workflow/mod.rs +1 -0
  358. package/packages/gasoline/src/builder/workflow/signal.rs +68 -22
  359. package/packages/gasoline/src/builder/workflow/sub_workflow.rs +6 -15
  360. package/packages/gasoline/src/ctx/activity.rs +46 -6
  361. package/packages/gasoline/src/ctx/common.rs +26 -23
  362. package/packages/gasoline/src/ctx/listen.rs +33 -50
  363. package/packages/gasoline/src/ctx/message.rs +76 -64
  364. package/packages/gasoline/src/ctx/operation.rs +15 -5
  365. package/packages/gasoline/src/ctx/standalone.rs +32 -4
  366. package/packages/gasoline/src/ctx/test.rs +31 -6
  367. package/packages/gasoline/src/ctx/versioned_workflow.rs +33 -7
  368. package/packages/gasoline/src/ctx/workflow.rs +194 -384
  369. package/packages/gasoline/src/db/debug.rs +49 -9
  370. package/packages/gasoline/src/db/kv/debug.rs +905 -15
  371. package/packages/gasoline/src/db/kv/keys/history.rs +434 -9
  372. package/packages/gasoline/src/db/kv/keys/metric.rs +70 -47
  373. package/packages/gasoline/src/db/kv/keys/signal.rs +19 -3
  374. package/packages/gasoline/src/db/kv/keys/workflow.rs +349 -3
  375. package/packages/gasoline/src/db/kv/mod.rs +975 -514
  376. package/packages/gasoline/src/db/kv/system.rs +155 -18
  377. package/packages/gasoline/src/db/mod.rs +29 -7
  378. package/packages/gasoline/src/error.rs +26 -21
  379. package/packages/gasoline/src/executable.rs +3 -1
  380. package/packages/gasoline/src/history/cursor.rs +436 -336
  381. package/packages/gasoline/src/history/event.rs +24 -15
  382. package/packages/gasoline/src/listen.rs +2 -14
  383. package/packages/gasoline/src/message.rs +1 -1
  384. package/packages/gasoline/src/metrics.rs +260 -143
  385. package/packages/gasoline/src/prelude.rs +1 -1
  386. package/packages/gasoline/src/registry.rs +6 -2
  387. package/packages/gasoline/src/signal.rs +34 -31
  388. package/packages/gasoline/src/utils/mod.rs +1 -18
  389. package/packages/gasoline/src/utils/topic.rs +35 -0
  390. package/packages/gasoline/src/worker.rs +71 -14
  391. package/packages/gasoline/src/workflow.rs +13 -0
  392. package/packages/gasoline/tests/workflows/eviction_test.rs +2 -2
  393. package/packages/gasoline-macros/src/lib.rs +74 -12
  394. package/packages/gasoline-runtime/Cargo.toml +18 -0
  395. package/packages/gasoline-runtime/src/lib.rs +12 -0
  396. package/packages/gasoline-runtime/src/workflows/mod.rs +1 -0
  397. package/packages/gasoline-runtime/src/workflows/pruner.rs +55 -0
  398. package/packages/guard/Cargo.toml +16 -8
  399. package/packages/guard/src/cache/mod.rs +63 -43
  400. package/packages/guard/src/cache/pegboard_gateway.rs +144 -0
  401. package/packages/guard/src/errors.rs +105 -0
  402. package/packages/guard/src/lib.rs +5 -15
  403. package/packages/guard/src/metrics.rs +12 -0
  404. package/packages/guard/src/routing/actor_path.rs +409 -0
  405. package/packages/guard/src/routing/api_public.rs +6 -14
  406. package/packages/guard/src/routing/envoy.rs +98 -0
  407. package/packages/guard/src/routing/mod.rs +152 -206
  408. package/packages/guard/src/routing/pegboard_gateway/mod.rs +572 -0
  409. package/packages/guard/src/routing/pegboard_gateway/resolve_actor_query.rs +236 -0
  410. package/packages/guard/src/routing/runner.rs +24 -54
  411. package/packages/guard/src/routing/ws_health.rs +61 -0
  412. package/packages/guard/src/shared_state.rs +11 -2
  413. package/packages/guard/tests/parse_actor_path.rs +418 -165
  414. package/packages/guard-core/Cargo.toml +3 -10
  415. package/packages/guard-core/src/custom_serve.rs +4 -10
  416. package/packages/guard-core/src/errors.rs +20 -4
  417. package/packages/guard-core/src/lib.rs +6 -4
  418. package/packages/guard-core/src/metrics.rs +66 -53
  419. package/packages/guard-core/src/proxy_service.rs +618 -1520
  420. package/packages/guard-core/src/request_context.rs +149 -169
  421. package/packages/guard-core/src/response_body.rs +65 -0
  422. package/packages/guard-core/src/route.rs +76 -0
  423. package/packages/guard-core/src/server.rs +60 -26
  424. package/packages/guard-core/src/task_group.rs +4 -0
  425. package/packages/guard-core/src/utils.rs +296 -0
  426. package/packages/guard-core/src/websocket_handle.rs +3 -3
  427. package/packages/guard-core/tests/common/mod.rs +0 -1
  428. package/packages/guard-core/tests/custom_serve.rs +4 -6
  429. package/packages/guard-core/tests/simple_websocket.rs +19 -19
  430. package/packages/guard-core/tests/streaming_response.rs +4 -9
  431. package/packages/metrics/Cargo.toml +3 -2
  432. package/packages/metrics/src/buckets.rs +5 -11
  433. package/packages/metrics/src/lib.rs +6 -3
  434. package/packages/metrics/src/providers.rs +2 -42
  435. package/packages/metrics/src/registry.rs +7 -0
  436. package/packages/metrics/src/server.rs +57 -0
  437. package/packages/namespace/Cargo.toml +0 -3
  438. package/packages/namespace/src/keys/metric.rs +301 -0
  439. package/packages/namespace/src/keys/mod.rs +1 -1
  440. package/packages/namespace/src/ops/get_global.rs +7 -4
  441. package/packages/namespace/src/ops/get_local.rs +32 -16
  442. package/packages/namespace/src/ops/mod.rs +0 -1
  443. package/packages/namespace/src/ops/resolve_for_name_global.rs +7 -4
  444. package/packages/namespace/src/ops/resolve_for_name_local.rs +39 -19
  445. package/packages/namespace/src/workflows/namespace.rs +3 -3
  446. package/packages/pegboard/Cargo.toml +22 -0
  447. package/packages/pegboard/src/actor_kv/entry.rs +47 -0
  448. package/packages/pegboard/src/actor_kv/metrics.rs +19 -0
  449. package/packages/pegboard/src/actor_kv/mod.rs +530 -0
  450. package/packages/pegboard/src/actor_kv/preload.rs +363 -0
  451. package/packages/{actor-kv/src → pegboard/src/actor_kv}/utils.rs +36 -35
  452. package/packages/pegboard/src/errors.rs +39 -5
  453. package/packages/pegboard/src/keys/actor.rs +285 -2
  454. package/packages/{actor-kv/src/entry.rs → pegboard/src/keys/actor_kv.rs} +73 -39
  455. package/packages/pegboard/src/keys/backfill.rs +49 -0
  456. package/packages/pegboard/src/keys/envoy.rs +1070 -0
  457. package/packages/pegboard/src/keys/epoxy/ns.rs +1 -1
  458. package/packages/pegboard/src/keys/mod.rs +4 -6
  459. package/packages/pegboard/src/keys/ns.rs +493 -14
  460. package/packages/pegboard/src/keys/runner.rs +281 -0
  461. package/packages/{namespace → pegboard}/src/keys/runner_config.rs +53 -0
  462. package/packages/pegboard/src/lib.rs +15 -2
  463. package/packages/pegboard/src/metrics.rs +57 -16
  464. package/packages/pegboard/src/ops/actor/create.rs +123 -53
  465. package/packages/pegboard/src/ops/actor/get.rs +14 -45
  466. package/packages/pegboard/src/ops/actor/get_for_gateway.rs +16 -0
  467. package/packages/pegboard/src/ops/actor/get_for_key.rs +3 -0
  468. package/packages/pegboard/src/ops/actor/get_for_kv.rs +43 -0
  469. package/packages/pegboard/src/ops/actor/get_for_runner.rs +99 -0
  470. package/packages/pegboard/src/ops/actor/get_reservation_for_key.rs +1 -0
  471. package/packages/pegboard/src/ops/actor/list_for_ns.rs +10 -38
  472. package/packages/pegboard/src/ops/actor/list_names.rs +3 -3
  473. package/packages/pegboard/src/ops/actor/mod.rs +3 -1
  474. package/packages/pegboard/src/ops/actor/util.rs +263 -0
  475. package/packages/pegboard/src/ops/envoy/drain.rs +101 -0
  476. package/packages/pegboard/src/ops/envoy/evict_actors.rs +54 -0
  477. package/packages/pegboard/src/ops/envoy/expire.rs +92 -0
  478. package/packages/pegboard/src/ops/envoy/get.rs +135 -0
  479. package/packages/pegboard/src/ops/envoy/list.rs +131 -0
  480. package/packages/pegboard/src/ops/envoy/mod.rs +6 -0
  481. package/packages/pegboard/src/ops/envoy/update_ping.rs +92 -0
  482. package/packages/pegboard/src/ops/mod.rs +3 -0
  483. package/packages/pegboard/src/ops/runner/drain.rs +110 -0
  484. package/packages/pegboard/src/ops/runner/list_names.rs +3 -3
  485. package/packages/pegboard/src/ops/runner/list_runner_config_enabled_dcs.rs +199 -0
  486. package/packages/pegboard/src/ops/runner/list_runner_config_epoxy_replica_ids.rs +51 -0
  487. package/packages/pegboard/src/ops/runner/mod.rs +3 -1
  488. package/packages/pegboard/src/ops/runner/update_alloc_idx.rs +17 -5
  489. package/packages/{namespace → pegboard}/src/ops/runner_config/delete.rs +18 -9
  490. package/packages/pegboard/src/ops/runner_config/ensure_normal_if_missing.rs +62 -0
  491. package/packages/{namespace → pegboard}/src/ops/runner_config/get.rs +15 -5
  492. package/packages/pegboard/src/ops/runner_config/get_error.rs +146 -0
  493. package/packages/{namespace → pegboard}/src/ops/runner_config/list.rs +13 -12
  494. package/packages/pegboard/src/ops/runner_config/mod.rs +7 -0
  495. package/packages/pegboard/src/ops/runner_config/refresh_metadata.rs +124 -0
  496. package/packages/pegboard/src/ops/runner_config/upsert.rs +206 -0
  497. package/packages/pegboard/src/ops/serverless_metadata/fetch.rs +223 -0
  498. package/packages/pegboard/src/ops/serverless_metadata/mod.rs +1 -0
  499. package/packages/pegboard/src/pubsub_subjects.rs +52 -0
  500. package/packages/pegboard/src/utils.rs +36 -2
  501. package/packages/pegboard/src/workflows/actor/destroy.rs +135 -99
  502. package/packages/pegboard/src/workflows/actor/keys.rs +59 -5
  503. package/packages/pegboard/src/workflows/actor/metrics.rs +345 -0
  504. package/packages/pegboard/src/workflows/actor/mod.rs +848 -204
  505. package/packages/pegboard/src/workflows/actor/runtime.rs +785 -212
  506. package/packages/pegboard/src/workflows/actor/setup.rs +61 -0
  507. package/packages/pegboard/src/workflows/actor2/keys.rs +337 -0
  508. package/packages/pegboard/src/workflows/actor2/metrics.rs +334 -0
  509. package/packages/pegboard/src/workflows/actor2/mod.rs +1251 -0
  510. package/packages/pegboard/src/workflows/actor2/runtime.rs +1005 -0
  511. package/packages/pegboard/src/workflows/actor_runner_name_selector_backfill.rs +266 -0
  512. package/packages/pegboard/src/workflows/metrics_aggregator.rs +282 -0
  513. package/packages/pegboard/src/workflows/mod.rs +8 -0
  514. package/packages/pegboard/src/workflows/runner.rs +62 -56
  515. package/packages/pegboard/src/workflows/runner2.rs +978 -0
  516. package/packages/pegboard/src/workflows/runner_pool.rs +298 -0
  517. package/packages/pegboard/src/workflows/runner_pool_error_tracker.rs +173 -0
  518. package/packages/pegboard/src/workflows/runner_pool_metadata_poller.rs +237 -0
  519. package/packages/pegboard/src/workflows/serverless/backfill.rs +120 -0
  520. package/packages/pegboard/src/workflows/serverless/conn.rs +702 -0
  521. package/packages/pegboard/src/workflows/serverless/mod.rs +3 -0
  522. package/packages/pegboard/src/workflows/serverless/receiver.rs +87 -0
  523. package/packages/pegboard/tests/actor_v1_pre_migration.rs +77 -0
  524. package/packages/{actor-kv/tests/list_edge_cases.rs → pegboard/tests/kv_list_edge_cases.rs} +74 -59
  525. package/packages/{actor-kv → pegboard}/tests/kv_operations.rs +77 -48
  526. package/packages/pegboard-envoy/Cargo.toml +43 -0
  527. package/packages/pegboard-envoy/src/actor_event_demuxer.rs +165 -0
  528. package/packages/pegboard-envoy/src/conn.rs +417 -0
  529. package/packages/pegboard-envoy/src/errors.rs +38 -0
  530. package/packages/pegboard-envoy/src/lib.rs +250 -0
  531. package/packages/pegboard-envoy/src/metrics.rs +44 -0
  532. package/packages/pegboard-envoy/src/ping_task.rs +61 -0
  533. package/packages/pegboard-envoy/src/tunnel_to_ws_task.rs +183 -0
  534. package/packages/pegboard-envoy/src/utils.rs +68 -0
  535. package/packages/pegboard-envoy/src/ws_to_tunnel_task.rs +536 -0
  536. package/packages/pegboard-envoy/tests/support/ws_to_tunnel_task.rs +82 -0
  537. package/packages/pegboard-gateway/Cargo.toml +2 -0
  538. package/packages/pegboard-gateway/src/keepalive_task.rs +1 -1
  539. package/packages/pegboard-gateway/src/lib.rs +506 -128
  540. package/packages/pegboard-gateway/src/metrics.rs +7 -11
  541. package/packages/pegboard-gateway/src/metrics_task.rs +80 -0
  542. package/packages/pegboard-gateway/src/ping_task.rs +9 -2
  543. package/packages/pegboard-gateway/src/shared_state.rs +110 -74
  544. package/packages/pegboard-gateway/src/tunnel_to_ws_task.rs +21 -7
  545. package/packages/pegboard-gateway/src/ws_to_tunnel_task.rs +12 -6
  546. package/packages/pegboard-gateway2/Cargo.toml +37 -0
  547. package/packages/pegboard-gateway2/src/keepalive_task.rs +61 -0
  548. package/packages/pegboard-gateway2/src/lib.rs +1044 -0
  549. package/packages/pegboard-gateway2/src/metrics.rs +10 -0
  550. package/packages/pegboard-gateway2/src/metrics_task.rs +80 -0
  551. package/packages/pegboard-gateway2/src/ping_task.rs +30 -0
  552. package/packages/pegboard-gateway2/src/shared_state.rs +601 -0
  553. package/packages/pegboard-gateway2/src/tunnel_to_ws_task.rs +99 -0
  554. package/packages/pegboard-gateway2/src/ws_to_tunnel_task.rs +71 -0
  555. package/packages/{pegboard-serverless → pegboard-outbound}/Cargo.toml +9 -9
  556. package/packages/pegboard-outbound/src/lib.rs +487 -0
  557. package/packages/pegboard-outbound/src/metrics.rs +17 -0
  558. package/packages/pegboard-runner/Cargo.toml +11 -5
  559. package/packages/pegboard-runner/src/actor_event_demuxer.rs +163 -0
  560. package/packages/pegboard-runner/src/conn.rs +358 -122
  561. package/packages/pegboard-runner/src/errors.rs +5 -0
  562. package/packages/pegboard-runner/src/lib.rs +62 -36
  563. package/packages/pegboard-runner/src/metrics.rs +44 -0
  564. package/packages/pegboard-runner/src/ping_task.rs +60 -13
  565. package/packages/pegboard-runner/src/tunnel_to_ws_task.rs +249 -110
  566. package/packages/pegboard-runner/src/ws_to_tunnel_task.rs +738 -113
  567. package/packages/pegboard-runner/tests/support/ws_to_tunnel_task.rs +150 -0
  568. package/packages/pools/Cargo.toml +1 -2
  569. package/packages/pools/src/db/clickhouse.rs +7 -6
  570. package/packages/pools/src/db/udb.rs +16 -3
  571. package/packages/pools/src/db/ups.rs +27 -5
  572. package/packages/pools/src/error.rs +0 -3
  573. package/packages/pools/src/lib.rs +0 -2
  574. package/packages/pools/src/metrics.rs +33 -28
  575. package/packages/pools/src/pools.rs +15 -39
  576. package/packages/pools/src/prelude.rs +1 -1
  577. package/packages/postgres-util/Cargo.toml +13 -0
  578. package/packages/postgres-util/src/lib.rs +84 -0
  579. package/packages/runner-protocol/build.rs +157 -0
  580. package/packages/runner-protocol/src/lib.rs +16 -0
  581. package/packages/runner-protocol/src/util.rs +14 -0
  582. package/packages/runner-protocol/src/versioned.rs +4345 -0
  583. package/packages/runtime/src/lib.rs +46 -46
  584. package/packages/runtime/src/metrics.rs +39 -30
  585. package/packages/runtime/src/term_signal.rs +25 -12
  586. package/packages/runtime/src/traces.rs +5 -8
  587. package/packages/service-manager/src/lib.rs +66 -15
  588. package/packages/test-deps/src/datacenter.rs +22 -8
  589. package/packages/test-deps/src/lib.rs +47 -25
  590. package/packages/test-deps-docker/src/database.rs +45 -36
  591. package/packages/test-snapshot-gen/Cargo.toml +39 -0
  592. package/packages/test-snapshot-gen/snapshots/.gitkeep +0 -0
  593. package/packages/test-snapshot-gen/snapshots/epoxy-v1/metadata.json +3 -0
  594. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000008.log +0 -0
  595. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000009.sst +3 -0
  596. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/CURRENT +3 -0
  597. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/MANIFEST-000005 +3 -0
  598. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/OPTIONS-000007 +3 -0
  599. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000008.log +0 -0
  600. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000009.sst +3 -0
  601. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/CURRENT +3 -0
  602. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/MANIFEST-000005 +3 -0
  603. package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/OPTIONS-000007 +3 -0
  604. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/metadata.json +3 -0
  605. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000008.log +0 -0
  606. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000009.sst +3 -0
  607. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/CURRENT +3 -0
  608. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/MANIFEST-000005 +3 -0
  609. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/OPTIONS-000007 +3 -0
  610. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000008.log +0 -0
  611. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000009.sst +3 -0
  612. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/CURRENT +3 -0
  613. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/MANIFEST-000005 +3 -0
  614. package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/OPTIONS-000007 +3 -0
  615. package/packages/test-snapshot-gen/src/lib.rs +328 -0
  616. package/packages/test-snapshot-gen/src/main.rs +145 -0
  617. package/packages/test-snapshot-gen/src/scenarios/epoxy_keys.rs +60 -0
  618. package/packages/test-snapshot-gen/src/scenarios/mod.rs +27 -0
  619. package/packages/test-snapshot-gen/src/scenarios/pb_actor_v1_pre_migration.rs +56 -0
  620. package/packages/test-snapshot-gen/src/test_cluster.rs +234 -0
  621. package/packages/tracing-reconfigure/src/lib.rs +1 -1
  622. package/packages/tracing-utils/src/lib.rs +12 -20
  623. package/packages/types/src/actor/error.rs +59 -0
  624. package/packages/types/src/actor/mod.rs +2 -0
  625. package/packages/types/src/actors.rs +5 -0
  626. package/packages/types/src/envoys.rs +21 -0
  627. package/packages/types/src/keys/backfill.rs +5 -0
  628. package/packages/types/src/keys/mod.rs +1 -0
  629. package/packages/types/src/lib.rs +2 -1
  630. package/packages/types/src/runner_configs.rs +43 -14
  631. package/packages/universaldb/Cargo.toml +4 -0
  632. package/packages/universaldb/src/database.rs +50 -5
  633. package/packages/universaldb/src/driver/mod.rs +12 -2
  634. package/packages/universaldb/src/driver/postgres/database.rs +88 -27
  635. package/packages/universaldb/src/driver/postgres/mod.rs +1 -1
  636. package/packages/universaldb/src/driver/postgres/transaction.rs +4 -7
  637. package/packages/universaldb/src/driver/postgres/transaction_task.rs +30 -52
  638. package/packages/universaldb/src/driver/rocksdb/database.rs +13 -7
  639. package/packages/universaldb/src/driver/rocksdb/transaction_conflict_tracker.rs +5 -5
  640. package/packages/universaldb/src/driver/rocksdb/transaction_task.rs +2 -1
  641. package/packages/universaldb/src/metrics.rs +39 -23
  642. package/packages/universaldb/src/prelude.rs +1 -1
  643. package/packages/universaldb/src/transaction.rs +9 -2
  644. package/packages/universaldb/src/utils/cherry_pick.rs +46 -46
  645. package/packages/universaldb/src/utils/keys.rs +21 -2
  646. package/packages/universaldb/src/utils/mod.rs +8 -0
  647. package/packages/universaldb/src/utils/subspace.rs +9 -4
  648. package/packages/universaldb/tests/integration.rs +5 -3
  649. package/packages/universaldb/tests/integration_gas.rs +5 -3
  650. package/packages/universaldb/tests/rocksdb.rs +152 -19
  651. package/packages/universalpubsub/Cargo.toml +8 -2
  652. package/packages/universalpubsub/benches/simple.rs +28 -8
  653. package/packages/universalpubsub/src/chunking.rs +27 -5
  654. package/packages/universalpubsub/src/driver/memory/mod.rs +131 -20
  655. package/packages/universalpubsub/src/driver/mod.rs +5 -0
  656. package/packages/universalpubsub/src/driver/nats/mod.rs +8 -0
  657. package/packages/universalpubsub/src/driver/postgres/mod.rs +505 -96
  658. package/packages/universalpubsub/src/lib.rs +3 -0
  659. package/packages/universalpubsub/src/metrics.rs +60 -0
  660. package/packages/universalpubsub/src/pubsub.rs +227 -87
  661. package/packages/universalpubsub/src/subject.rs +32 -0
  662. package/packages/universalpubsub/tests/chunking.rs +298 -0
  663. package/packages/universalpubsub/tests/integration.rs +148 -7
  664. package/packages/universalpubsub/tests/reconnect.rs +8 -6
  665. package/packages/util/Cargo.toml +1 -3
  666. package/packages/util/build.rs +6 -0
  667. package/packages/util/src/lib.rs +7 -2
  668. package/packages/util/src/metric.rs +1 -0
  669. package/packages/util/src/serde.rs +1 -516
  670. package/packages/{internal → util-serde}/Cargo.toml +4 -5
  671. package/packages/util-serde/src/lib.rs +517 -0
  672. package/packages/workflow-worker/Cargo.toml +4 -4
  673. package/packages/workflow-worker/src/lib.rs +3 -2
  674. package/sdks/go/api-full/client/client.go +17 -4
  675. package/sdks/go/api-full/metadata/client.go +50 -0
  676. package/sdks/go/api-full/namespaces/client.go +3 -0
  677. package/sdks/go/api-full/namespaces.go +6 -4
  678. package/sdks/go/api-full/runners/client.go +3 -0
  679. package/sdks/go/api-full/runners.go +8 -6
  680. package/sdks/go/api-full/types.go +107 -23
  681. package/sdks/rust/api-full/rust/.openapi-generator/FILES +6 -0
  682. package/sdks/rust/api-full/rust/Cargo.toml +1 -1
  683. package/sdks/rust/api-full/rust/README.md +5 -2
  684. package/sdks/rust/api-full/rust/docs/Actor.md +1 -0
  685. package/sdks/rust/api-full/rust/docs/ActorsDeleteApi.md +1 -1
  686. package/sdks/rust/api-full/rust/docs/ActorsKvGetApi.md +2 -1
  687. package/sdks/rust/api-full/rust/docs/ActorsListApi.md +3 -2
  688. package/sdks/rust/api-full/rust/docs/MetadataApi.md +34 -0
  689. package/sdks/rust/api-full/rust/docs/MetadataGetResponse.md +18 -0
  690. package/sdks/rust/api-full/rust/docs/NamespacesApi.md +3 -2
  691. package/sdks/rust/api-full/rust/docs/RunnerConfig.md +1 -0
  692. package/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf1Serverless.md +1 -0
  693. package/sdks/rust/api-full/rust/docs/RunnerConfigResponse.md +15 -0
  694. package/sdks/rust/api-full/rust/docs/RunnerConfigsListApi.md +3 -2
  695. package/sdks/rust/api-full/rust/docs/RunnerConfigsListResponseRunnerConfigsValue.md +1 -1
  696. package/sdks/rust/api-full/rust/docs/RunnersApi.md +3 -2
  697. package/sdks/rust/api-full/rust/src/apis/actors_create_api.rs +1 -1
  698. package/sdks/rust/api-full/rust/src/apis/actors_delete_api.rs +3 -5
  699. package/sdks/rust/api-full/rust/src/apis/actors_get_or_create_api.rs +1 -1
  700. package/sdks/rust/api-full/rust/src/apis/actors_kv_get_api.rs +4 -2
  701. package/sdks/rust/api-full/rust/src/apis/actors_list_api.rs +9 -2
  702. package/sdks/rust/api-full/rust/src/apis/actors_list_names_api.rs +1 -1
  703. package/sdks/rust/api-full/rust/src/apis/configuration.rs +2 -2
  704. package/sdks/rust/api-full/rust/src/apis/datacenters_api.rs +1 -1
  705. package/sdks/rust/api-full/rust/src/apis/health_api.rs +1 -1
  706. package/sdks/rust/api-full/rust/src/apis/metadata_api.rs +62 -0
  707. package/sdks/rust/api-full/rust/src/apis/mod.rs +1 -0
  708. package/sdks/rust/api-full/rust/src/apis/namespaces_api.rs +9 -2
  709. package/sdks/rust/api-full/rust/src/apis/runner_configs_delete_api.rs +1 -1
  710. package/sdks/rust/api-full/rust/src/apis/runner_configs_list_api.rs +9 -2
  711. package/sdks/rust/api-full/rust/src/apis/runner_configs_refresh_metadata_api.rs +1 -1
  712. package/sdks/rust/api-full/rust/src/apis/runner_configs_serverless_health_check_api.rs +1 -1
  713. package/sdks/rust/api-full/rust/src/apis/runner_configs_upsert_api.rs +1 -1
  714. package/sdks/rust/api-full/rust/src/apis/runners_api.rs +9 -2
  715. package/sdks/rust/api-full/rust/src/models/actor.rs +5 -1
  716. package/sdks/rust/api-full/rust/src/models/actor_name.rs +1 -1
  717. package/sdks/rust/api-full/rust/src/models/actors_create_request.rs +1 -1
  718. package/sdks/rust/api-full/rust/src/models/actors_create_response.rs +1 -1
  719. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_request.rs +1 -1
  720. package/sdks/rust/api-full/rust/src/models/actors_get_or_create_response.rs +1 -1
  721. package/sdks/rust/api-full/rust/src/models/actors_kv_get_response.rs +1 -1
  722. package/sdks/rust/api-full/rust/src/models/actors_list_names_response.rs +1 -1
  723. package/sdks/rust/api-full/rust/src/models/actors_list_response.rs +1 -1
  724. package/sdks/rust/api-full/rust/src/models/crash_policy.rs +1 -1
  725. package/sdks/rust/api-full/rust/src/models/datacenter.rs +1 -1
  726. package/sdks/rust/api-full/rust/src/models/datacenter_health.rs +1 -1
  727. package/sdks/rust/api-full/rust/src/models/datacenters_list_response.rs +1 -1
  728. package/sdks/rust/api-full/rust/src/models/health_fanout_response.rs +1 -1
  729. package/sdks/rust/api-full/rust/src/models/health_response.rs +1 -1
  730. package/sdks/rust/api-full/rust/src/models/health_status.rs +1 -1
  731. package/sdks/rust/api-full/rust/src/models/metadata_get_response.rs +48 -0
  732. package/sdks/rust/api-full/rust/src/models/mod.rs +4 -0
  733. package/sdks/rust/api-full/rust/src/models/namespace.rs +1 -1
  734. package/sdks/rust/api-full/rust/src/models/namespace_list_response.rs +1 -1
  735. package/sdks/rust/api-full/rust/src/models/namespaces_create_request.rs +1 -1
  736. package/sdks/rust/api-full/rust/src/models/namespaces_create_response.rs +1 -1
  737. package/sdks/rust/api-full/rust/src/models/pagination.rs +1 -1
  738. package/sdks/rust/api-full/rust/src/models/runner.rs +1 -1
  739. package/sdks/rust/api-full/rust/src/models/runner_config.rs +4 -1
  740. package/sdks/rust/api-full/rust/src/models/runner_config_kind.rs +1 -1
  741. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of.rs +1 -1
  742. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1.rs +1 -1
  743. package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1_serverless.rs +5 -1
  744. package/sdks/rust/api-full/rust/src/models/runner_config_response.rs +39 -0
  745. package/sdks/rust/api-full/rust/src/models/runner_config_variant.rs +1 -1
  746. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response.rs +1 -1
  747. package/sdks/rust/api-full/rust/src/models/runner_configs_list_response_runner_configs_value.rs +3 -3
  748. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_request.rs +1 -1
  749. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response.rs +1 -1
  750. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of.rs +1 -1
  751. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1.rs +1 -1
  752. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1_failure.rs +1 -1
  753. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_success.rs +1 -1
  754. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error.rs +1 -1
  755. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of.rs +1 -1
  756. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_1.rs +1 -1
  757. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_2.rs +1 -1
  758. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3.rs +1 -1
  759. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3_non_success_status.rs +1 -1
  760. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4.rs +1 -1
  761. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4_invalid_response_json.rs +1 -1
  762. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5.rs +1 -1
  763. package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5_invalid_response_schema.rs +1 -1
  764. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_request_body.rs +1 -1
  765. package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_response.rs +1 -1
  766. package/sdks/rust/api-full/rust/src/models/runners_list_names_response.rs +1 -1
  767. package/sdks/rust/api-full/rust/src/models/runners_list_response.rs +1 -1
  768. package/sdks/rust/api-full/src/apis/actors_api.rs +8 -4
  769. package/sdks/rust/api-full/src/apis/ns_api.rs +8 -4
  770. package/sdks/rust/data/src/converted.rs +7 -4
  771. package/sdks/rust/data/src/lib.rs +2 -2
  772. package/sdks/rust/data/src/versioned/mod.rs +47 -4
  773. package/sdks/rust/data/src/versioned/namespace_runner_config.rs +256 -6
  774. package/sdks/rust/envoy-client/Cargo.toml +25 -0
  775. package/sdks/rust/envoy-client/src/actor.rs +992 -0
  776. package/sdks/rust/envoy-client/src/commands.rs +88 -0
  777. package/sdks/rust/envoy-client/src/config.rs +159 -0
  778. package/sdks/rust/envoy-client/src/connection.rs +288 -0
  779. package/sdks/rust/envoy-client/src/context.rs +24 -0
  780. package/sdks/rust/envoy-client/src/envoy.rs +432 -0
  781. package/sdks/rust/envoy-client/src/events.rs +62 -0
  782. package/sdks/rust/envoy-client/src/handle.rs +355 -0
  783. package/sdks/rust/envoy-client/src/kv.rs +132 -0
  784. package/sdks/rust/envoy-client/src/latency_channel.rs +27 -0
  785. package/sdks/rust/envoy-client/src/lib.rs +15 -0
  786. package/sdks/rust/envoy-client/src/stringify.rs +322 -0
  787. package/sdks/rust/envoy-client/src/tunnel.rs +265 -0
  788. package/sdks/rust/envoy-client/src/utils.rs +172 -0
  789. package/sdks/rust/envoy-protocol/Cargo.toml +22 -0
  790. package/sdks/rust/envoy-protocol/build.rs +200 -0
  791. package/sdks/rust/envoy-protocol/src/generated.rs +1 -0
  792. package/sdks/rust/envoy-protocol/src/lib.rs +8 -0
  793. package/sdks/rust/envoy-protocol/src/versioned.rs +208 -0
  794. package/sdks/rust/epoxy-protocol/Cargo.toml +0 -2
  795. package/sdks/rust/epoxy-protocol/build.rs +7 -0
  796. package/sdks/rust/epoxy-protocol/src/lib.rs +2 -5
  797. package/sdks/rust/epoxy-protocol/src/protocol.rs +128 -0
  798. package/sdks/rust/test-envoy/Cargo.toml +23 -0
  799. package/sdks/rust/test-envoy/Dockerfile +22 -0
  800. package/sdks/rust/test-envoy/src/behaviors.rs +141 -0
  801. package/sdks/rust/test-envoy/src/lib.rs +11 -0
  802. package/sdks/rust/test-envoy/src/main.rs +4 -0
  803. package/sdks/rust/test-envoy/src/server.rs +269 -0
  804. package/sdks/schemas/README.md +1 -2
  805. package/sdks/schemas/data/namespace.runner_config.v3.bare +24 -0
  806. package/sdks/schemas/data/namespace.runner_config.v4.bare +25 -0
  807. package/sdks/schemas/data/namespace.runner_config.v5.bare +26 -0
  808. package/sdks/schemas/data/pegboard.namespace.runner_alloc_idx.v2.bare +8 -0
  809. package/sdks/schemas/envoy-protocol/v1.bare +459 -0
  810. package/sdks/schemas/epoxy-protocol/v2.bare +220 -0
  811. package/sdks/schemas/runner-protocol/v4.bare +438 -0
  812. package/sdks/schemas/runner-protocol/v5.bare +430 -0
  813. package/sdks/schemas/runner-protocol/v6.bare +432 -0
  814. package/sdks/schemas/runner-protocol/v7.bare +438 -0
  815. package/sdks/typescript/api-full/.turbo/turbo-build.log +28 -27
  816. package/sdks/typescript/api-full/build.js +7 -1
  817. package/sdks/typescript/api-full/package.json +66 -57
  818. package/sdks/typescript/api-full/rivetkit-engine-api-full-25.5.3.tgz +0 -0
  819. package/sdks/typescript/api-full/src/Client.ts +41 -10
  820. package/sdks/typescript/api-full/src/api/client/requests/ActorsDeleteRequest.ts +4 -2
  821. package/sdks/typescript/api-full/src/api/client/requests/ActorsKvGetRequest.ts +13 -0
  822. package/sdks/typescript/api-full/src/api/client/requests/ActorsListRequest.ts +6 -0
  823. package/sdks/typescript/api-full/src/api/client/requests/RunnerConfigsListRequest.ts +4 -0
  824. package/sdks/typescript/api-full/src/api/client/requests/index.ts +1 -0
  825. package/sdks/typescript/api-full/src/api/resources/index.ts +1 -0
  826. package/sdks/typescript/api-full/src/api/resources/metadata/client/Client.ts +97 -0
  827. package/sdks/typescript/api-full/src/api/resources/metadata/client/index.ts +1 -0
  828. package/sdks/typescript/api-full/src/api/resources/metadata/index.ts +1 -0
  829. package/sdks/typescript/api-full/src/api/resources/namespaces/client/Client.ts +12 -2
  830. package/sdks/typescript/api-full/src/api/resources/namespaces/client/requests/NamespacesListRequest.ts +6 -0
  831. package/sdks/typescript/api-full/src/api/resources/runners/client/Client.ts +12 -2
  832. package/sdks/typescript/api-full/src/api/resources/runners/client/requests/RunnersListRequest.ts +6 -0
  833. package/sdks/typescript/api-full/src/api/types/Actor.ts +2 -0
  834. package/sdks/typescript/api-full/src/api/types/MetadataGetResponse.ts +14 -0
  835. package/sdks/typescript/api-full/src/api/types/RunnerConfig.ts +1 -0
  836. package/sdks/typescript/api-full/src/api/types/RunnerConfigKindServerlessServerless.ts +2 -0
  837. package/sdks/typescript/api-full/src/api/types/RunnerConfigResponse.ts +9 -0
  838. package/sdks/typescript/api-full/src/api/types/RunnerConfigServerless.ts +2 -0
  839. package/sdks/typescript/api-full/src/api/types/RunnerConfigsListResponseRunnerConfigsValue.ts +1 -1
  840. package/sdks/typescript/api-full/src/api/types/index.ts +2 -0
  841. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +6 -4
  842. package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +4 -3
  843. package/sdks/typescript/api-full/src/serialization/types/Actor.ts +2 -0
  844. package/sdks/typescript/api-full/src/serialization/types/MetadataGetResponse.ts +34 -0
  845. package/sdks/typescript/api-full/src/serialization/types/RunnerConfig.ts +5 -0
  846. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigKindServerlessServerless.ts +2 -0
  847. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigResponse.ts +26 -0
  848. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigServerless.ts +2 -0
  849. package/sdks/typescript/api-full/src/serialization/types/RunnerConfigsListResponseRunnerConfigsValue.ts +3 -3
  850. package/sdks/typescript/api-full/src/serialization/types/index.ts +2 -0
  851. package/sdks/typescript/api-full/turbo.json +9 -0
  852. package/sdks/typescript/envoy-protocol/.turbo/turbo-build.log +23 -0
  853. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.cjs +466 -281
  854. package/sdks/typescript/envoy-protocol/dist/index.cjs.map +1 -0
  855. package/sdks/typescript/envoy-protocol/dist/index.d.cts +699 -0
  856. package/sdks/typescript/envoy-protocol/dist/index.d.ts +699 -0
  857. package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.js +530 -345
  858. package/sdks/typescript/envoy-protocol/dist/index.js.map +1 -0
  859. package/sdks/typescript/{runner-protocol → envoy-protocol}/node_modules/.bin/tsc +4 -4
  860. package/{tests/load → sdks/typescript/envoy-protocol}/node_modules/.bin/tsserver +4 -4
  861. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup +21 -0
  862. package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup-node +21 -0
  863. package/sdks/typescript/envoy-protocol/package.json +36 -0
  864. package/sdks/typescript/envoy-protocol/src/index.ts +2331 -0
  865. package/sdks/typescript/envoy-protocol/tsconfig.json +9 -0
  866. package/sdks/typescript/envoy-protocol/tsup.config.ts +4 -0
  867. package/sdks/typescript/runner/package.json +8 -2
  868. package/sdks/typescript/runner/src/actor.ts +38 -0
  869. package/sdks/typescript/runner/src/mod.ts +435 -229
  870. package/sdks/typescript/runner/src/stringify.ts +36 -33
  871. package/sdks/typescript/runner/src/tunnel.ts +52 -56
  872. package/sdks/typescript/runner/src/utils.ts +19 -0
  873. package/sdks/typescript/runner/src/websocket-tunnel-adapter.ts +98 -435
  874. package/sdks/typescript/runner-protocol/package.json +11 -9
  875. package/sdks/typescript/runner-protocol/src/index.ts +224 -156
  876. package/sdks/typescript/runner-protocol/tsconfig.json +1 -9
  877. package/sdks/typescript/test-runner/.turbo/turbo-build.log +5 -5
  878. package/sdks/typescript/test-runner/dist/index.js +53 -44
  879. package/sdks/typescript/test-runner/dist/index.js.map +1 -1
  880. package/sdks/typescript/test-runner/node_modules/.bin/pino +2 -2
  881. package/sdks/typescript/test-runner/node_modules/.bin/tsc +4 -4
  882. package/sdks/typescript/test-runner/node_modules/.bin/tsserver +4 -4
  883. package/sdks/typescript/test-runner/node_modules/.bin/tsup +4 -4
  884. package/sdks/typescript/test-runner/node_modules/.bin/tsup-node +4 -4
  885. package/sdks/typescript/test-runner/node_modules/.bin/tsx +4 -4
  886. package/sdks/typescript/test-runner/node_modules/.bin/vitest +4 -4
  887. package/sdks/typescript/test-runner/package.json +3 -3
  888. package/sdks/typescript/test-runner/src/index.ts +65 -42
  889. package/sdks/typescript/test-runner/src/log.ts +4 -18
  890. package/artifacts/errors/actor.no_runners_available.json +0 -5
  891. package/artifacts/errors/guard.actor_destroyed.json +0 -5
  892. package/artifacts/errors/guard.actor_not_found.json +0 -5
  893. package/contrib-docs/ACTOR_KEY_RESERVATION.md +0 -101
  894. package/contrib-docs/API.md +0 -11
  895. package/contrib-docs/DOCKER.md +0 -5
  896. package/contrib-docs/ERRORS.md +0 -13
  897. package/contrib-docs/GUARD.md +0 -76
  898. package/contrib-docs/PEGBOARD_TUNNEL_RETRIES.md +0 -83
  899. package/contrib-docs/RUNNER_LIFECYCLE.md +0 -172
  900. package/contrib-docs/SDKS.md +0 -9
  901. package/contrib-docs/TEST_DEPENDENCIES.md +0 -43
  902. package/contrib-docs/design-choicse/EMBEDDED_KV.md +0 -80
  903. package/contrib-docs/operate/TRACING_RECONFIGURE.md +0 -78
  904. package/docker/dev/otel-collector-client/config.yaml +0 -39
  905. package/docker/dev-host/otel-collector-client/config.yaml +0 -39
  906. package/docker/dev-multidc/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  907. package/docker/dev-multidc/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  908. package/docker/dev-multidc/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  909. package/docker/dev-multidc-multinode/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
  910. package/docker/dev-multidc-multinode/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
  911. package/docker/dev-multidc-multinode/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
  912. package/docker/dev-multinode/otel-collector-client/config.yaml +0 -39
  913. package/docker/template/src/services/edge/otel-collector-client.ts +0 -64
  914. package/packages/actor-kv/Cargo.toml +0 -31
  915. package/packages/actor-kv/src/key.rs +0 -81
  916. package/packages/actor-kv/src/lib.rs +0 -357
  917. package/packages/cache/src/rate_limit.rs +0 -109
  918. package/packages/cache/tests/integration.rs +0 -582
  919. package/packages/clickhouse-inserter/Cargo.toml +0 -17
  920. package/packages/clickhouse-inserter/src/error.rs +0 -16
  921. package/packages/clickhouse-inserter/src/lib.rs +0 -179
  922. package/packages/clickhouse-user-query/Cargo.toml +0 -16
  923. package/packages/clickhouse-user-query/examples/case_sensitivity_demo.rs +0 -100
  924. package/packages/clickhouse-user-query/examples/group_by_example.rs +0 -53
  925. package/packages/clickhouse-user-query/examples/string_contains_demo.rs +0 -96
  926. package/packages/clickhouse-user-query/src/builder.rs +0 -445
  927. package/packages/clickhouse-user-query/src/error.rs +0 -37
  928. package/packages/clickhouse-user-query/src/lib.rs +0 -61
  929. package/packages/clickhouse-user-query/src/query.rs +0 -143
  930. package/packages/clickhouse-user-query/src/schema.rs +0 -78
  931. package/packages/clickhouse-user-query/tests/builder_tests.rs +0 -619
  932. package/packages/clickhouse-user-query/tests/case_sensitivity_tests.rs +0 -307
  933. package/packages/clickhouse-user-query/tests/integration_tests.rs +0 -540
  934. package/packages/clickhouse-user-query/tests/query_tests.rs +0 -263
  935. package/packages/clickhouse-user-query/tests/schema_tests.rs +0 -44
  936. package/packages/config/src/config/vector.rs +0 -18
  937. package/packages/engine/src/commands/udb_keys.rs +0 -200
  938. package/packages/engine/tests/actors_create.rs +0 -524
  939. package/packages/engine/tests/actors_delete.rs +0 -243
  940. package/packages/engine/tests/actors_general.rs +0 -191
  941. package/packages/engine/tests/actors_get.rs +0 -230
  942. package/packages/engine/tests/actors_get_by_id.rs +0 -170
  943. package/packages/engine/tests/actors_get_or_create.rs +0 -294
  944. package/packages/engine/tests/actors_get_or_create_by_id.rs +0 -147
  945. package/packages/engine/tests/actors_lifecycle.rs +0 -165
  946. package/packages/engine/tests/actors_list.rs +0 -798
  947. package/packages/engine/tests/actors_list_names.rs +0 -353
  948. package/packages/engine/tests/common/ns.rs +0 -36
  949. package/packages/engine/tests/common/runner.rs +0 -134
  950. package/packages/engine/tests/runners_dupe_key.rs +0 -27
  951. package/packages/engine/tests/runners_version.rs +0 -50
  952. package/packages/env/build.rs +0 -8
  953. package/packages/epoxy/spec/KEYS.md +0 -33
  954. package/packages/epoxy/spec/PROPOSAL.md +0 -125
  955. package/packages/epoxy/spec/RECONFIGURE.md +0 -40
  956. package/packages/epoxy/src/ops/explicit_prepare.rs +0 -342
  957. package/packages/epoxy/src/replica/decide_path.rs +0 -51
  958. package/packages/epoxy/src/replica/lead_consensus.rs +0 -65
  959. package/packages/epoxy/src/replica/log.rs +0 -84
  960. package/packages/epoxy/src/replica/messages/accepted.rs +0 -35
  961. package/packages/epoxy/src/replica/messages/committed.rs +0 -41
  962. package/packages/epoxy/src/replica/messages/download_instances.rs +0 -69
  963. package/packages/epoxy/src/replica/messages/pre_accept.rs +0 -69
  964. package/packages/epoxy/src/replica/utils.rs +0 -111
  965. package/packages/epoxy/src/workflows/purger.rs +0 -81
  966. package/packages/guard/src/cache/actor.rs +0 -43
  967. package/packages/guard/src/middleware.rs +0 -42
  968. package/packages/guard/src/routing/pegboard_gateway.rs +0 -260
  969. package/packages/guard-core/src/analytics.rs +0 -46
  970. package/packages/internal/README.md +0 -1
  971. package/packages/internal/src/lib.rs +0 -1
  972. package/packages/internal/src/ops/bump_serverless_autoscaler_global.rs +0 -64
  973. package/packages/internal/src/ops/cache/mod.rs +0 -1
  974. package/packages/internal/src/ops/cache/purge_global.rs +0 -81
  975. package/packages/internal/src/ops/mod.rs +0 -2
  976. package/packages/namespace/src/ops/runner_config/mod.rs +0 -4
  977. package/packages/namespace/src/ops/runner_config/upsert.rs +0 -148
  978. package/packages/pegboard/src/ops/actor/get_runner.rs +0 -64
  979. package/packages/pegboard/src/ops/runner/find_dc_with_runner.rs +0 -222
  980. package/packages/pegboard-serverless/src/lib.rs +0 -523
  981. package/packages/types/src/msgs/mod.rs +0 -1
  982. package/packages/types/src/msgs/pegboard.rs +0 -5
  983. package/sdks/rust/epoxy-protocol/src/versioned.rs +0 -206
  984. package/sdks/rust/runner-protocol/build.rs +0 -115
  985. package/sdks/rust/runner-protocol/src/lib.rs +0 -10
  986. package/sdks/rust/runner-protocol/src/versioned.rs +0 -1734
  987. package/sdks/schemas/epoxy-protocol/v1.bare +0 -260
  988. package/sdks/typescript/runner/.turbo/turbo-build.log +0 -22
  989. package/sdks/typescript/runner/dist/mod.cjs +0 -2951
  990. package/sdks/typescript/runner/dist/mod.cjs.map +0 -1
  991. package/sdks/typescript/runner/dist/mod.d.cts +0 -326
  992. package/sdks/typescript/runner/dist/mod.d.ts +0 -326
  993. package/sdks/typescript/runner/dist/mod.js +0 -2951
  994. package/sdks/typescript/runner/dist/mod.js.map +0 -1
  995. package/sdks/typescript/runner/node_modules/.bin/pino +0 -21
  996. package/sdks/typescript/runner/node_modules/.bin/tsc +0 -21
  997. package/sdks/typescript/runner/node_modules/.bin/tsserver +0 -21
  998. package/sdks/typescript/runner/node_modules/.bin/tsup +0 -21
  999. package/sdks/typescript/runner/node_modules/.bin/tsup-node +0 -21
  1000. package/sdks/typescript/runner/node_modules/.bin/tsx +0 -21
  1001. package/sdks/typescript/runner/node_modules/.bin/uuid +0 -21
  1002. package/sdks/typescript/runner/node_modules/.bin/vitest +0 -21
  1003. package/sdks/typescript/runner-protocol/.turbo/turbo-build.log +0 -22
  1004. package/sdks/typescript/runner-protocol/dist/index.cjs.map +0 -1
  1005. package/sdks/typescript/runner-protocol/dist/index.d.cts +0 -666
  1006. package/sdks/typescript/runner-protocol/dist/index.d.ts +0 -666
  1007. package/sdks/typescript/runner-protocol/dist/index.js.map +0 -1
  1008. package/sdks/typescript/runner-protocol/node_modules/.bin/tsserver +0 -21
  1009. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup +0 -21
  1010. package/sdks/typescript/runner-protocol/node_modules/.bin/tsup-node +0 -21
  1011. package/sdks/typescript/test-runner/Dockerfile +0 -26
  1012. package/tests/load/README.md +0 -28
  1013. package/tests/load/actor-lifecycle/README.md +0 -26
  1014. package/tests/load/actor-lifecycle/actor.ts +0 -41
  1015. package/tests/load/actor-lifecycle/config.ts +0 -14
  1016. package/tests/load/actor-lifecycle/index.ts +0 -62
  1017. package/tests/load/actor-lifecycle/rivet_api.ts +0 -140
  1018. package/tests/load/actor-lifecycle/types.ts +0 -17
  1019. package/tests/load/node_modules/.bin/biome +0 -21
  1020. package/tests/load/node_modules/.bin/tsc +0 -21
  1021. package/tests/load/package.json +0 -15
  1022. package/tests/load/tsconfig.json +0 -20
  1023. package/tests/smoke/README.md +0 -32
  1024. package/tests/smoke/package.json +0 -19
  1025. package/tests/smoke/scripts/connect.ts +0 -41
  1026. package/tests/smoke/src/server/registry.ts +0 -32
  1027. package/tests/smoke/src/server/server.ts +0 -7
  1028. package/tests/smoke/src/smoke-test/index.ts +0 -161
  1029. package/tests/smoke/src/smoke-test/spawn-actor.ts +0 -109
  1030. package/tests/smoke/tsconfig.json +0 -43
  1031. /package/packages/{dump-openapi → api-public-openapi-gen}/build.rs +0 -0
  1032. /package/packages/{dump-openapi → api-public-openapi-gen}/src/lib.rs +0 -0
  1033. /package/{sdks/rust → packages}/runner-protocol/Cargo.toml +0 -0
  1034. /package/{sdks/rust → packages}/runner-protocol/src/compat.rs +0 -0
  1035. /package/{sdks/rust → packages}/runner-protocol/src/generated.rs +0 -0
  1036. /package/{sdks/rust → packages}/runner-protocol/src/uuid_compat.rs +0 -0
  1037. /package/sdks/rust/{runner-protocol → envoy-protocol}/src/util.rs +0 -0
  1038. /package/{tests/smoke → sdks/typescript/envoy-protocol}/turbo.json +0 -0
@@ -0,0 +1,1284 @@
1
+ use std::sync::{Arc, Mutex};
2
+
3
+ use super::super::common;
4
+
5
+ // MARK: Creation and Initialization
6
+ #[test]
7
+ fn actor_basic_create() {
8
+ common::run(common::TestOpts::new(1), |ctx| async move {
9
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
10
+
11
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
12
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
13
+
14
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
15
+ builder.with_actor_behavior("test-actor", move |_| {
16
+ Box::new(common::test_runner::NotifyOnStartActor::new(
17
+ start_tx.clone(),
18
+ ))
19
+ })
20
+ })
21
+ .await;
22
+
23
+ let res = common::create_actor(
24
+ ctx.leader_dc().guard_port(),
25
+ &namespace,
26
+ "test-actor",
27
+ runner.name(),
28
+ rivet_types::actors::CrashPolicy::Destroy,
29
+ )
30
+ .await;
31
+
32
+ let actor_id = res.actor.actor_id.to_string();
33
+
34
+ // Wait for actor to start (notification from actor)
35
+ start_rx
36
+ .await
37
+ .expect("actor should have sent start notification");
38
+
39
+ // Verify actor is allocated to runner
40
+ assert!(
41
+ runner.has_actor(&actor_id).await,
42
+ "runner should have the actor allocated"
43
+ );
44
+
45
+ tracing::info!(?actor_id, "actor allocated to runner");
46
+ });
47
+ }
48
+
49
+ #[test]
50
+ fn create_actor_with_input() {
51
+ common::run(common::TestOpts::new(1), |ctx| async move {
52
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
53
+
54
+ // Generate test input data (base64-encoded String)
55
+ let input_data = common::generate_test_input_data();
56
+
57
+ // Decode the base64 data to get the actual bytes the actor will receive
58
+ // The API automatically decodes base64 input before sending to the runner
59
+ let input_data_bytes =
60
+ base64::Engine::decode(&base64::engine::general_purpose::STANDARD, &input_data)
61
+ .expect("failed to decode base64 input");
62
+
63
+ // Create runner with VerifyInputActor that will validate the input
64
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
65
+ builder.with_actor_behavior("test-actor", move |_| {
66
+ Box::new(common::test_runner::VerifyInputActor::new(
67
+ input_data_bytes.clone(),
68
+ ))
69
+ })
70
+ })
71
+ .await;
72
+
73
+ // Create actor with input data
74
+ let res = common::api::public::actors_create(
75
+ ctx.leader_dc().guard_port(),
76
+ common::api_types::actors::create::CreateQuery {
77
+ namespace: namespace.clone(),
78
+ },
79
+ common::api_types::actors::create::CreateRequest {
80
+ datacenter: None,
81
+ name: "test-actor".to_string(),
82
+ key: None,
83
+ input: Some(input_data.clone()),
84
+ runner_name_selector: runner.name().to_string(),
85
+ crash_policy: rivet_types::actors::CrashPolicy::Destroy,
86
+ },
87
+ )
88
+ .await
89
+ .expect("failed to create actor");
90
+
91
+ let actor_id = res.actor.actor_id.to_string();
92
+
93
+ // Poll for actor to become connectable
94
+ // If input verification fails, the actor will crash and never become connectable
95
+ let actor = loop {
96
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
97
+ .await
98
+ .expect("failed to get actor")
99
+ .expect("actor should exist");
100
+
101
+ // Check if actor crashed (input verification failed)
102
+ if actor.destroy_ts.is_some() {
103
+ panic!(
104
+ "actor crashed during input verification (input data was not received correctly)"
105
+ );
106
+ }
107
+
108
+ // Check if actor is connectable (input verification succeeded)
109
+ if actor.connectable_ts.is_some() {
110
+ break actor;
111
+ }
112
+
113
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
114
+ };
115
+
116
+ assert!(
117
+ actor.connectable_ts.is_some(),
118
+ "actor should be connectable after successful input verification"
119
+ );
120
+
121
+ tracing::info!(
122
+ ?actor_id,
123
+ input_size = input_data.len(),
124
+ "actor successfully verified input data"
125
+ );
126
+ });
127
+ }
128
+
129
+ #[test]
130
+ fn actor_start_timeout() {
131
+ // This test takes 35+ seconds
132
+ common::run(
133
+ common::TestOpts::new(1).with_timeout(45),
134
+ |ctx| async move {
135
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
136
+
137
+ // Create test runner with timeout actor behavior
138
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
139
+ builder.with_actor_behavior("timeout-actor", move |_| {
140
+ Box::new(common::test_runner::TimeoutActor::new())
141
+ })
142
+ })
143
+ .await;
144
+
145
+ tracing::info!("test runner ready, creating actor that will timeout");
146
+
147
+ // Create actor with destroy crash policy
148
+ let res = common::create_actor(
149
+ ctx.leader_dc().guard_port(),
150
+ &namespace,
151
+ "timeout-actor",
152
+ runner.name(),
153
+ rivet_types::actors::CrashPolicy::Destroy,
154
+ )
155
+ .await;
156
+
157
+ let actor_id_str = res.actor.actor_id.to_string();
158
+
159
+ tracing::info!(?actor_id_str, "actor created, waiting for timeout");
160
+
161
+ // Wait for the actor start timeout threshold (30s + buffer)
162
+ tokio::time::sleep(tokio::time::Duration::from_secs(35)).await;
163
+
164
+ // Verify actor was marked as destroyed due to timeout
165
+ let actor =
166
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
167
+ .await
168
+ .expect("failed to get actor")
169
+ .expect("actor should exist");
170
+
171
+ assert!(
172
+ actor.destroy_ts.is_some(),
173
+ "actor should be destroyed after start timeout"
174
+ );
175
+
176
+ tracing::info!(?actor_id_str, "actor correctly destroyed after timeout");
177
+ },
178
+ );
179
+ }
180
+
181
+ // MARK: Running State Management
182
+ #[test]
183
+ fn actor_starts_and_connectable_via_guard_http() {
184
+ common::run(common::TestOpts::new(1), |ctx| async move {
185
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
186
+
187
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
188
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
189
+
190
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
191
+ builder.with_actor_behavior("test-actor", move |_| {
192
+ Box::new(common::test_runner::NotifyOnStartActor::new(
193
+ start_tx.clone(),
194
+ ))
195
+ })
196
+ })
197
+ .await;
198
+
199
+ let res = common::create_actor(
200
+ ctx.leader_dc().guard_port(),
201
+ &namespace,
202
+ "test-actor",
203
+ runner.name(),
204
+ rivet_types::actors::CrashPolicy::Destroy,
205
+ )
206
+ .await;
207
+
208
+ let actor_id = res.actor.actor_id.to_string();
209
+
210
+ // Wait for actor to start
211
+ start_rx
212
+ .await
213
+ .expect("actor should have sent start notification");
214
+
215
+ // Poll for connectable_ts to be set
216
+ let actor = loop {
217
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
218
+ .await
219
+ .expect("failed to get actor")
220
+ .expect("actor should exist");
221
+
222
+ if actor.connectable_ts.is_some() {
223
+ break actor;
224
+ }
225
+
226
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
227
+ };
228
+
229
+ assert!(
230
+ actor.connectable_ts.is_some(),
231
+ "actor should be connectable"
232
+ );
233
+
234
+ // TODO: HTTP ping test via guard needs to be implemented: the Rust test runner atm
235
+ // doesn't implement HTTP tunneling yet. The original test with TypeScript
236
+ // runner included: common::ping_actor_via_guard(ctx.leader_dc(), &actor_id).await;
237
+
238
+ tracing::info!(?actor_id, "actor is connectable (state verified)");
239
+ });
240
+ }
241
+
242
+ #[test]
243
+ fn actor_connectable_via_guard_websocket() {
244
+ common::run(common::TestOpts::new(1), |ctx| async move {
245
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
246
+
247
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
248
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
249
+
250
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
251
+ builder.with_actor_behavior("test-actor", move |_| {
252
+ Box::new(common::test_runner::NotifyOnStartActor::new(
253
+ start_tx.clone(),
254
+ ))
255
+ })
256
+ })
257
+ .await;
258
+
259
+ let res = common::create_actor(
260
+ ctx.leader_dc().guard_port(),
261
+ &namespace,
262
+ "test-actor",
263
+ runner.name(),
264
+ rivet_types::actors::CrashPolicy::Destroy,
265
+ )
266
+ .await;
267
+
268
+ let actor_id = res.actor.actor_id.to_string();
269
+
270
+ // Wait for actor to start
271
+ start_rx
272
+ .await
273
+ .expect("actor should have sent start notification");
274
+
275
+ // Poll for connectable_ts to be set
276
+ let actor = loop {
277
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
278
+ .await
279
+ .expect("failed to get actor")
280
+ .expect("actor should exist");
281
+
282
+ if actor.connectable_ts.is_some() {
283
+ break actor;
284
+ }
285
+
286
+ tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
287
+ };
288
+
289
+ assert!(
290
+ actor.connectable_ts.is_some(),
291
+ "actor should be connectable"
292
+ );
293
+
294
+ // Note: WebSocket ping test via guard is skipped because the Rust test runner
295
+ // doesn't implement HTTP tunneling yet. The original test with TypeScript
296
+ // runner included: common::ping_actor_websocket_via_guard(ctx.leader_dc(), &actor_id).await;
297
+
298
+ tracing::info!(?actor_id, "actor is connectable (state verified)");
299
+ });
300
+ }
301
+
302
+ // MARK: Stopping and Graceful Shutdown
303
+ #[test]
304
+ fn actor_graceful_stop_with_destroy_policy() {
305
+ common::run(common::TestOpts::new(1), |ctx| async move {
306
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
307
+
308
+ // Create test runner with stop immediately actor
309
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
310
+ builder.with_actor_behavior("stop-actor", move |_| {
311
+ Box::new(common::test_runner::StopImmediatelyActor::new())
312
+ })
313
+ })
314
+ .await;
315
+
316
+ tracing::info!("test runner ready, creating actor that will stop gracefully");
317
+
318
+ // Create actor with destroy crash policy
319
+ let res = common::create_actor(
320
+ ctx.leader_dc().guard_port(),
321
+ &namespace,
322
+ "stop-actor",
323
+ runner.name(),
324
+ rivet_types::actors::CrashPolicy::Destroy,
325
+ )
326
+ .await;
327
+
328
+ let actor_id_str = res.actor.actor_id.to_string();
329
+
330
+ tracing::info!(?actor_id_str, "actor created, will send stop intent");
331
+
332
+ // Poll for actor to be destroyed after graceful stop
333
+ let actor = loop {
334
+ let actor =
335
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
336
+ .await
337
+ .expect("failed to get actor")
338
+ .expect("actor should exist");
339
+
340
+ if actor.destroy_ts.is_some() {
341
+ break actor;
342
+ }
343
+
344
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
345
+ };
346
+
347
+ assert!(
348
+ actor.destroy_ts.is_some(),
349
+ "actor should be destroyed after graceful stop with destroy policy"
350
+ );
351
+
352
+ // Verify runner slot freed (actor no longer on runner)
353
+ assert!(
354
+ !runner.has_actor(&actor_id_str).await,
355
+ "actor should be removed from runner after destroy"
356
+ );
357
+
358
+ tracing::info!(?actor_id_str, "actor gracefully stopped and destroyed");
359
+ });
360
+ }
361
+
362
+ #[test]
363
+ fn actor_explicit_destroy() {
364
+ common::run(common::TestOpts::new(1), |ctx| async move {
365
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
366
+
367
+ // Create a channel to be notified when the actor starts
368
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
369
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
370
+
371
+ // Build a custom runner with NotifyOnStartActor
372
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
373
+ builder.with_actor_behavior("test-actor", move |_| {
374
+ Box::new(common::test_runner::NotifyOnStartActor::new(
375
+ start_tx.clone(),
376
+ ))
377
+ })
378
+ })
379
+ .await;
380
+
381
+ let res = common::create_actor(
382
+ ctx.leader_dc().guard_port(),
383
+ &namespace,
384
+ "test-actor",
385
+ runner.name(),
386
+ rivet_types::actors::CrashPolicy::Destroy,
387
+ )
388
+ .await;
389
+
390
+ let actor_id = res.actor.actor_id.to_string();
391
+
392
+ start_rx
393
+ .await
394
+ .expect("actor should have sent start notification");
395
+
396
+ // Verify actor is running
397
+ assert!(
398
+ runner.has_actor(&actor_id).await,
399
+ "runner should have actor"
400
+ );
401
+
402
+ // Delete the actor
403
+ common::api::public::actors_delete(
404
+ ctx.leader_dc().guard_port(),
405
+ common::api_types::actors::delete::DeletePath {
406
+ actor_id: actor_id.parse().expect("failed to parse actor_id"),
407
+ },
408
+ common::api_types::actors::delete::DeleteQuery {
409
+ namespace: namespace.clone(),
410
+ },
411
+ )
412
+ .await
413
+ .expect("failed to delete actor");
414
+
415
+ // Poll for actor to be destroyed or timeout after 5s
416
+ let start = std::time::Instant::now();
417
+ let actor = loop {
418
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
419
+ .await
420
+ .expect("failed to get actor")
421
+ .expect("actor should still exist in database");
422
+
423
+ if actor.destroy_ts.is_some() {
424
+ break actor;
425
+ }
426
+
427
+ if start.elapsed() > std::time::Duration::from_secs(5) {
428
+ panic!("actor deletion timed out after 5 seconds");
429
+ }
430
+
431
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
432
+ };
433
+
434
+ assert!(
435
+ actor.destroy_ts.is_some(),
436
+ "destroy_ts should be set after deletion"
437
+ );
438
+
439
+ tracing::info!(?actor_id, "actor successfully destroyed");
440
+ });
441
+ }
442
+
443
+ // MARK: 5. Crash Handling and Policies
444
+ #[test]
445
+ fn crash_policy_restart() {
446
+ common::run(common::TestOpts::new(1), |ctx| async move {
447
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
448
+
449
+ // Create channel to be notified when actor crashes
450
+ let (crash_tx, crash_rx) = tokio::sync::oneshot::channel();
451
+ let crash_tx = Arc::new(Mutex::new(Some(crash_tx)));
452
+
453
+ // Create test runner with crashing actor
454
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
455
+ builder.with_actor_behavior("crash-actor", move |_| {
456
+ Box::new(common::test_runner::CrashOnStartActor::new_with_notify(
457
+ 1,
458
+ crash_tx.clone(),
459
+ ))
460
+ })
461
+ })
462
+ .await;
463
+
464
+ tracing::info!("test runner ready, creating actor with restart policy");
465
+
466
+ // Create actor with restart crash policy
467
+ let res = common::create_actor(
468
+ ctx.leader_dc().guard_port(),
469
+ &namespace,
470
+ "crash-actor",
471
+ runner.name(),
472
+ rivet_types::actors::CrashPolicy::Restart,
473
+ )
474
+ .await;
475
+
476
+ let actor_id_str = res.actor.actor_id.to_string();
477
+
478
+ tracing::info!(?actor_id_str, "actor created, will crash on start");
479
+
480
+ // Wait for crash notification
481
+ crash_rx
482
+ .await
483
+ .expect("actor should have sent crash notification");
484
+
485
+ // Poll for reschedule_ts to be set (system needs to process the crash)
486
+ let actor = loop {
487
+ let actor =
488
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
489
+ .await
490
+ .expect("failed to get actor")
491
+ .expect("actor should exist");
492
+
493
+ if actor.reschedule_ts.is_some() {
494
+ break actor;
495
+ }
496
+
497
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
498
+ };
499
+
500
+ assert!(
501
+ actor.reschedule_ts.is_some(),
502
+ "actor should have reschedule_ts after crash with restart policy"
503
+ );
504
+
505
+ tracing::info!(?actor_id_str, reschedule_ts = ?actor.reschedule_ts, "actor scheduled for restart");
506
+ });
507
+ }
508
+
509
+ #[test]
510
+ fn crash_policy_restart_resets_on_success() {
511
+ common::run(common::TestOpts::new(1), |ctx| async move {
512
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
513
+
514
+ let crash_count = Arc::new(Mutex::new(0));
515
+
516
+ // Create test runner with actor that crashes 2 times then succeeds
517
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
518
+ builder.with_actor_behavior("crash-recover-actor", move |_| {
519
+ Box::new(common::test_runner::CrashNTimesThenSucceedActor::new(
520
+ 2,
521
+ crash_count.clone(),
522
+ ))
523
+ })
524
+ })
525
+ .await;
526
+
527
+ tracing::info!("test runner ready, creating actor with restart policy");
528
+
529
+ // Create actor with restart crash policy
530
+ let res = common::create_actor(
531
+ ctx.leader_dc().guard_port(),
532
+ &namespace,
533
+ "crash-recover-actor",
534
+ runner.name(),
535
+ rivet_types::actors::CrashPolicy::Restart,
536
+ )
537
+ .await;
538
+
539
+ let actor_id_str = res.actor.actor_id.to_string();
540
+
541
+ tracing::info!(
542
+ ?actor_id_str,
543
+ "actor created, will crash twice then succeed"
544
+ );
545
+
546
+ // Poll for actor to eventually become connectable after crashes and restarts
547
+ // The actor should crash twice, reschedule, and eventually run successfully
548
+ let actor = loop {
549
+ let actor =
550
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
551
+ .await
552
+ .expect("failed to get actor")
553
+ .expect("actor should exist");
554
+
555
+ // Actor successfully running after retries
556
+ if actor.connectable_ts.is_some() {
557
+ break actor;
558
+ }
559
+
560
+ tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
561
+ };
562
+
563
+ assert!(
564
+ actor.connectable_ts.is_some(),
565
+ "actor should eventually become connectable after crashes"
566
+ );
567
+ // actor.reschedule_ts is always Some(), not sure if this is intended
568
+ assert!(
569
+ actor.reschedule_ts.is_none()
570
+ || (actor.connectable_ts.unwrap() > actor.reschedule_ts.unwrap()),
571
+ "actor should not be scheduled for retry when running successfully"
572
+ );
573
+
574
+ tracing::info!(?actor_id_str, "actor successfully recovered after crashes");
575
+ });
576
+ }
577
+
578
+ #[test]
579
+ fn crash_policy_sleep() {
580
+ common::run(common::TestOpts::new(1), |ctx| async move {
581
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
582
+
583
+ // Create channel to be notified when actor crashes
584
+ let (crash_tx, crash_rx) = tokio::sync::oneshot::channel();
585
+ let crash_tx = Arc::new(Mutex::new(Some(crash_tx)));
586
+
587
+ // Create test runner with crashing actor
588
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
589
+ builder.with_actor_behavior("crash-actor", move |_| {
590
+ Box::new(common::test_runner::CrashOnStartActor::new_with_notify(
591
+ 1,
592
+ crash_tx.clone(),
593
+ ))
594
+ })
595
+ })
596
+ .await;
597
+
598
+ tracing::info!("test runner ready, creating actor with sleep policy");
599
+
600
+ // Create actor with sleep crash policy
601
+ let res = common::create_actor(
602
+ ctx.leader_dc().guard_port(),
603
+ &namespace,
604
+ "crash-actor",
605
+ runner.name(),
606
+ rivet_types::actors::CrashPolicy::Sleep,
607
+ )
608
+ .await;
609
+
610
+ let actor_id_str = res.actor.actor_id.to_string();
611
+
612
+ tracing::info!(?actor_id_str, "actor created with sleep policy");
613
+
614
+ // Wait for crash notification
615
+ crash_rx
616
+ .await
617
+ .expect("actor should have sent crash notification");
618
+
619
+ // Poll for sleep_ts to be set (system needs to process the crash)
620
+ let actor = loop {
621
+ let actor =
622
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
623
+ .await
624
+ .expect("failed to get actor")
625
+ .expect("actor should exist");
626
+
627
+ if actor.sleep_ts.is_some() {
628
+ break actor;
629
+ }
630
+
631
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
632
+ };
633
+
634
+ assert!(
635
+ actor.sleep_ts.is_some(),
636
+ "actor should be sleeping after crash with sleep policy"
637
+ );
638
+ assert!(
639
+ actor.connectable_ts.is_none(),
640
+ "actor should not be connectable while sleeping"
641
+ );
642
+
643
+ tracing::info!(
644
+ ?actor_id_str,
645
+ "actor correctly entered sleep state after crash"
646
+ );
647
+ });
648
+ }
649
+
650
+ #[test]
651
+ fn crash_policy_destroy() {
652
+ common::run(common::TestOpts::new(1), |ctx| async move {
653
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
654
+
655
+ // Create channel to be notified when actor crashes
656
+ let (crash_tx, crash_rx) = tokio::sync::oneshot::channel();
657
+ let crash_tx = Arc::new(Mutex::new(Some(crash_tx)));
658
+
659
+ // Create test runner with crashing actor
660
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
661
+ builder.with_actor_behavior("crash-actor", move |_| {
662
+ Box::new(common::test_runner::CrashOnStartActor::new_with_notify(
663
+ 1,
664
+ crash_tx.clone(),
665
+ ))
666
+ })
667
+ })
668
+ .await;
669
+
670
+ tracing::info!("test runner ready, creating actor with destroy policy");
671
+
672
+ // Create actor with destroy crash policy
673
+ let res = common::create_actor(
674
+ ctx.leader_dc().guard_port(),
675
+ &namespace,
676
+ "crash-actor",
677
+ runner.name(),
678
+ rivet_types::actors::CrashPolicy::Destroy,
679
+ )
680
+ .await;
681
+
682
+ let actor_id_str = res.actor.actor_id.to_string();
683
+
684
+ tracing::info!(?actor_id_str, "actor created with destroy policy");
685
+
686
+ // Wait for crash notification
687
+ crash_rx
688
+ .await
689
+ .expect("actor should have sent crash notification");
690
+
691
+ // Poll for destroy_ts to be set (system needs to process the crash)
692
+ let actor = loop {
693
+ let actor =
694
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
695
+ .await
696
+ .expect("failed to get actor")
697
+ .expect("actor should exist");
698
+
699
+ if actor.destroy_ts.is_some() {
700
+ break actor;
701
+ }
702
+
703
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
704
+ };
705
+
706
+ assert!(
707
+ actor.destroy_ts.is_some(),
708
+ "actor should be destroyed after crash with destroy policy"
709
+ );
710
+
711
+ tracing::info!(?actor_id_str, "actor correctly destroyed after crash");
712
+ });
713
+ }
714
+
715
+ // MARK: 6. Sleep and Wake
716
+ #[test]
717
+ fn actor_sleep_intent() {
718
+ common::run(common::TestOpts::new(1), |ctx| async move {
719
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
720
+
721
+ // Create channel to be notified when actor sends sleep intent
722
+ let (sleep_tx, sleep_rx) = tokio::sync::oneshot::channel();
723
+ let sleep_tx = Arc::new(Mutex::new(Some(sleep_tx)));
724
+
725
+ // Create test runner with sleep actor behavior
726
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
727
+ builder.with_actor_behavior("sleep-actor", move |_| {
728
+ Box::new(common::test_runner::SleepImmediatelyActor::new_with_notify(
729
+ sleep_tx.clone(),
730
+ ))
731
+ })
732
+ })
733
+ .await;
734
+
735
+ tracing::info!("test runner ready, creating actor that will sleep");
736
+
737
+ // Create actor
738
+ let res = common::create_actor(
739
+ ctx.leader_dc().guard_port(),
740
+ &namespace,
741
+ "sleep-actor",
742
+ runner.name(),
743
+ rivet_types::actors::CrashPolicy::Destroy,
744
+ )
745
+ .await;
746
+
747
+ let actor_id_str = res.actor.actor_id.to_string();
748
+
749
+ tracing::info!(?actor_id_str, "actor created, will send sleep intent");
750
+
751
+ // Wait for sleep intent notification
752
+ sleep_rx
753
+ .await
754
+ .expect("actor should have sent sleep intent notification");
755
+
756
+ // Poll for sleep_ts to be set (system needs to process the sleep intent)
757
+ let actor = loop {
758
+ let actor =
759
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
760
+ .await
761
+ .expect("failed to get actor")
762
+ .expect("actor should exist");
763
+
764
+ if actor.sleep_ts.is_some() {
765
+ break actor;
766
+ }
767
+
768
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
769
+ };
770
+
771
+ assert!(
772
+ actor.sleep_ts.is_some(),
773
+ "actor should have sleep_ts after sending sleep intent"
774
+ );
775
+ assert!(
776
+ actor.connectable_ts.is_none(),
777
+ "actor should not be connectable while sleeping"
778
+ );
779
+
780
+ tracing::info!(?actor_id_str, "actor correctly entered sleep state");
781
+ });
782
+ }
783
+
784
+ // MARK: Pending Allocation Queue
785
+ #[test]
786
+ fn actor_pending_allocation_no_runners() {
787
+ common::run(common::TestOpts::new(1), |ctx| async move {
788
+ // Create namespace and start a runner with 1 slot
789
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
790
+
791
+ let runner_full = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
792
+ builder
793
+ .with_total_slots(1)
794
+ .with_actor_behavior("filler-actor", |_| {
795
+ Box::new(common::test_runner::EchoActor::new())
796
+ })
797
+ .with_actor_behavior("test-actor", |_| {
798
+ Box::new(common::test_runner::EchoActor::new())
799
+ })
800
+ })
801
+ .await;
802
+
803
+ tracing::info!("runner with 1 slot started");
804
+
805
+ // Fill the slot with a filler actor
806
+ let filler_res = common::create_actor(
807
+ ctx.leader_dc().guard_port(),
808
+ &namespace,
809
+ "filler-actor",
810
+ runner_full.name(),
811
+ rivet_types::actors::CrashPolicy::Destroy,
812
+ )
813
+ .await;
814
+
815
+ let filler_actor_id = filler_res.actor.actor_id.to_string();
816
+
817
+ // Wait for filler actor to be allocated
818
+ loop {
819
+ if runner_full.has_actor(&filler_actor_id).await {
820
+ break;
821
+ }
822
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
823
+ }
824
+
825
+ tracing::info!(
826
+ ?filler_actor_id,
827
+ "filler actor allocated, runner is now full"
828
+ );
829
+
830
+ // Create test actor (should be pending because runner is full)
831
+ let res = common::create_actor(
832
+ ctx.leader_dc().guard_port(),
833
+ &namespace,
834
+ "test-actor",
835
+ runner_full.name(),
836
+ rivet_types::actors::CrashPolicy::Destroy,
837
+ )
838
+ .await;
839
+
840
+ let actor_id = res.actor.actor_id.to_string();
841
+
842
+ // Verify actor is in pending state
843
+ let actor = common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id, &namespace)
844
+ .await
845
+ .expect("failed to get actor")
846
+ .expect("actor should exist");
847
+
848
+ assert!(
849
+ actor.pending_allocation_ts.is_some(),
850
+ "pending_allocation_ts should be set when no runners available"
851
+ );
852
+ assert!(
853
+ actor.connectable_ts.is_none(),
854
+ "actor should not be connectable yet"
855
+ );
856
+
857
+ tracing::info!(?actor_id, "actor is pending allocation");
858
+
859
+ // Now start a runner with available slots
860
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
861
+ builder.with_actor_behavior("test-actor", |_| {
862
+ Box::new(common::test_runner::EchoActor::new())
863
+ })
864
+ })
865
+ .await;
866
+
867
+ tracing::info!("runner with 20 slots started");
868
+
869
+ // Poll for allocation
870
+ loop {
871
+ if runner.has_actor(&actor_id).await {
872
+ break;
873
+ }
874
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
875
+ }
876
+
877
+ // Verify actor is now allocated
878
+ assert!(
879
+ runner.has_actor(&actor_id).await,
880
+ "actor should now be allocated to runner"
881
+ );
882
+
883
+ tracing::info!(
884
+ ?actor_id,
885
+ "actor successfully allocated after runner with slots started"
886
+ );
887
+ });
888
+ }
889
+
890
+ #[test]
891
+ fn pending_allocation_queue_ordering() {
892
+ common::run(common::TestOpts::new(1), |ctx| async move {
893
+ // Create namespace and start runner with only 2 slots
894
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
895
+
896
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
897
+ builder
898
+ .with_total_slots(2)
899
+ .with_actor_behavior("test-actor-0", |_| {
900
+ Box::new(common::test_runner::EchoActor::new())
901
+ })
902
+ .with_actor_behavior("test-actor-1", |_| {
903
+ Box::new(common::test_runner::EchoActor::new())
904
+ })
905
+ .with_actor_behavior("test-actor-2", |_| {
906
+ Box::new(common::test_runner::EchoActor::new())
907
+ })
908
+ })
909
+ .await;
910
+
911
+ tracing::info!("runner with 2 slots started");
912
+
913
+ // Create 3 actors in sequence
914
+ // First 2 should be allocated immediately, 3rd should be pending
915
+ let mut actor_ids = Vec::new();
916
+ for i in 0..3 {
917
+ let name = format!("test-actor-{}", i);
918
+ let res = common::create_actor(
919
+ ctx.leader_dc().guard_port(),
920
+ &namespace,
921
+ &name,
922
+ runner.name(),
923
+ rivet_types::actors::CrashPolicy::Destroy,
924
+ )
925
+ .await;
926
+
927
+ actor_ids.push(res.actor.actor_id.to_string());
928
+
929
+ // Small delay to ensure ordering
930
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
931
+ }
932
+
933
+ // Poll for first 2 actors to be allocated
934
+ loop {
935
+ let has_0 = runner.has_actor(&actor_ids[0]).await;
936
+ let has_1 = runner.has_actor(&actor_ids[1]).await;
937
+
938
+ if has_0 && has_1 {
939
+ break;
940
+ }
941
+
942
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
943
+ }
944
+
945
+ // Verify first 2 actors are allocated (FIFO)
946
+ assert!(
947
+ runner.has_actor(&actor_ids[0]).await,
948
+ "first actor should be allocated"
949
+ );
950
+ assert!(
951
+ runner.has_actor(&actor_ids[1]).await,
952
+ "second actor should be allocated"
953
+ );
954
+
955
+ // Third actor should still be pending
956
+ let actor_c =
957
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_ids[2], &namespace)
958
+ .await
959
+ .expect("failed to get actor")
960
+ .expect("actor should exist");
961
+
962
+ assert!(
963
+ actor_c.pending_allocation_ts.is_some(),
964
+ "third actor should still be pending"
965
+ );
966
+
967
+ tracing::info!("FIFO allocation ordering verified");
968
+ });
969
+ }
970
+
971
+ // MARK: Runner Failures
972
+ #[test]
973
+ fn actor_survives_runner_disconnect() {
974
+ common::run(
975
+ common::TestOpts::new(1).with_timeout(60),
976
+ |ctx| async move {
977
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
978
+
979
+ // Create runner and start actor
980
+ let (start_tx, start_rx) = tokio::sync::oneshot::channel();
981
+ let start_tx = Arc::new(Mutex::new(Some(start_tx)));
982
+
983
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
984
+ builder.with_actor_behavior("test-actor", move |_| {
985
+ Box::new(common::test_runner::NotifyOnStartActor::new(
986
+ start_tx.clone(),
987
+ ))
988
+ })
989
+ })
990
+ .await;
991
+
992
+ let res = common::create_actor(
993
+ ctx.leader_dc().guard_port(),
994
+ &namespace,
995
+ "test-actor",
996
+ runner.name(),
997
+ rivet_types::actors::CrashPolicy::Restart,
998
+ )
999
+ .await;
1000
+
1001
+ let actor_id_str = res.actor.actor_id.to_string();
1002
+
1003
+ // Wait for actor to start
1004
+ start_rx
1005
+ .await
1006
+ .expect("actor should have sent start notification");
1007
+
1008
+ tracing::info!(?actor_id_str, "actor started, simulating runner disconnect");
1009
+
1010
+ // Simulate runner disconnect by shutting down
1011
+ runner.shutdown().await;
1012
+
1013
+ tracing::info!(
1014
+ "runner disconnected, waiting for system to detect and apply crash policy"
1015
+ );
1016
+
1017
+ // Now we wait for runner_lost_threshold so that actor state updates
1018
+ tokio::time::sleep(tokio::time::Duration::from_millis(
1019
+ ctx.leader_dc()
1020
+ .config
1021
+ .pegboard()
1022
+ .runner_lost_threshold()
1023
+ .try_into()
1024
+ .unwrap(),
1025
+ ))
1026
+ .await;
1027
+
1028
+ // Poll for actor to be rescheduled (crash policy is Restart)
1029
+ // The system should detect runner loss and apply the crash policy
1030
+ let start = std::time::Instant::now();
1031
+ let actor = loop {
1032
+ let actor =
1033
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
1034
+ .await
1035
+ .expect("failed to get actor")
1036
+ .expect("actor should exist");
1037
+ tracing::warn!(?actor);
1038
+ // Actor should be waiting for an allocation after runner loss
1039
+ if actor.pending_allocation_ts.is_some() {
1040
+ break actor;
1041
+ }
1042
+
1043
+ if start.elapsed() > std::time::Duration::from_secs(50) {
1044
+ // TODO: Always times out here
1045
+ tracing::info!(?actor);
1046
+ break actor;
1047
+ }
1048
+
1049
+ tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
1050
+ };
1051
+
1052
+ assert!(
1053
+ actor.pending_allocation_ts.is_some(),
1054
+ "actor should be pending allocation after runner disconnected and threshold hit with restart policy"
1055
+ );
1056
+ assert!(
1057
+ actor.connectable_ts.is_none(),
1058
+ "actor should not be connectable after runner disconnect"
1059
+ );
1060
+ },
1061
+ );
1062
+ }
1063
+
1064
+ // MARK: Resource Limits
1065
+ #[test]
1066
+ #[ignore]
1067
+ fn runner_at_max_capacity() {
1068
+ common::run(
1069
+ common::TestOpts::new(1).with_timeout(30),
1070
+ |ctx| async move {
1071
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1072
+
1073
+ // Start runner with only 2 slots
1074
+
1075
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1076
+ builder
1077
+ .with_total_slots(2)
1078
+ .with_actor_behavior("test-actor", move |_| {
1079
+ Box::new(common::test_runner::EchoActor::new())
1080
+ })
1081
+ })
1082
+ .await;
1083
+
1084
+ // Create first two actors to fill capacity
1085
+ let mut actor_ids = Vec::new();
1086
+ for _i in 0..2 {
1087
+ let res = common::create_actor(
1088
+ ctx.leader_dc().guard_port(),
1089
+ &namespace,
1090
+ "test-actor",
1091
+ runner.name(),
1092
+ rivet_types::actors::CrashPolicy::Destroy,
1093
+ )
1094
+ .await;
1095
+
1096
+ actor_ids.push(res.actor.actor_id.to_string());
1097
+ }
1098
+
1099
+ // Poll for both actors to be allocated
1100
+ loop {
1101
+ let has_0 = runner.has_actor(&actor_ids[0]).await;
1102
+ let has_1 = runner.has_actor(&actor_ids[1]).await;
1103
+
1104
+ if has_0 && has_1 {
1105
+ break;
1106
+ }
1107
+
1108
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
1109
+ }
1110
+
1111
+ // Verify both actors are allocated
1112
+ assert!(runner.has_actor(&actor_ids[0]).await);
1113
+ assert!(runner.has_actor(&actor_ids[1]).await);
1114
+
1115
+ // Create third actor (should be pending)
1116
+ let res3 = common::create_actor(
1117
+ ctx.leader_dc().guard_port(),
1118
+ &namespace,
1119
+ "test-actor",
1120
+ runner.name(),
1121
+ rivet_types::actors::CrashPolicy::Destroy,
1122
+ )
1123
+ .await;
1124
+
1125
+ let actor_id3 = res3.actor.actor_id.to_string();
1126
+
1127
+ // Verify third actor is pending
1128
+ let actor3 =
1129
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id3, &namespace)
1130
+ .await
1131
+ .expect("failed to get actor")
1132
+ .expect("actor should exist");
1133
+
1134
+ assert!(
1135
+ actor3.pending_allocation_ts.is_some(),
1136
+ "third actor should be pending when runner at capacity"
1137
+ );
1138
+
1139
+ // Destroy first actor to free a slot
1140
+ common::api::public::actors_delete(
1141
+ ctx.leader_dc().guard_port(),
1142
+ common::api_types::actors::delete::DeletePath {
1143
+ actor_id: actor_ids[0].parse().unwrap(),
1144
+ },
1145
+ common::api_types::actors::delete::DeleteQuery {
1146
+ namespace: namespace.clone(),
1147
+ },
1148
+ )
1149
+ .await
1150
+ .expect("failed to delete actor");
1151
+
1152
+ // Poll for third actor to be allocated (wait for slot to free and pending actor to be allocated)
1153
+ loop {
1154
+ tracing::warn!(
1155
+ "polling runner: current actors: {:?}",
1156
+ runner.get_actor_ids().await
1157
+ );
1158
+ if runner.has_actor(&actor_id3).await {
1159
+ break;
1160
+ }
1161
+ tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
1162
+ }
1163
+
1164
+ // Verify third actor is now allocated
1165
+ assert!(
1166
+ runner.has_actor(&actor_id3).await,
1167
+ "pending actor should be allocated after slot freed"
1168
+ );
1169
+ },
1170
+ );
1171
+ }
1172
+
1173
+ // MARK: Timeout and Retry Scenarios
1174
+ #[test]
1175
+ fn exponential_backoff_max_retries() {
1176
+ common::run(common::TestOpts::new(1), |ctx| async move {
1177
+ let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
1178
+
1179
+ // Create test runner with always-crashing actor
1180
+
1181
+ let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
1182
+ builder.with_actor_behavior("crash-always-actor", move |_| {
1183
+ Box::new(common::test_runner::CrashOnStartActor::new(1))
1184
+ })
1185
+ })
1186
+ .await;
1187
+
1188
+ tracing::info!("test runner ready, creating actor that will always crash");
1189
+
1190
+ // Create actor with restart crash policy
1191
+ let res = common::create_actor(
1192
+ ctx.leader_dc().guard_port(),
1193
+ &namespace,
1194
+ "crash-always-actor",
1195
+ runner.name(),
1196
+ rivet_types::actors::CrashPolicy::Restart,
1197
+ )
1198
+ .await;
1199
+
1200
+ let actor_id_str = res.actor.actor_id.to_string();
1201
+
1202
+ tracing::info!(?actor_id_str, "actor created, will crash repeatedly");
1203
+
1204
+ // Track reschedule timestamps to verify backoff increases
1205
+ let mut previous_reschedule_ts: Option<i64> = None;
1206
+ let mut backoff_deltas = Vec::new();
1207
+
1208
+ // Poll for multiple crashes and verify backoff increases
1209
+ for iteration in 0..5 {
1210
+ let actor = loop {
1211
+ let actor =
1212
+ common::try_get_actor(ctx.leader_dc().guard_port(), &actor_id_str, &namespace)
1213
+ .await
1214
+ .expect("failed to get actor")
1215
+ .expect("actor should exist");
1216
+
1217
+ if actor.reschedule_ts.is_some() {
1218
+ break actor;
1219
+ }
1220
+
1221
+ tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
1222
+ };
1223
+
1224
+ let current_reschedule_ts = actor.reschedule_ts.expect("reschedule_ts should be set");
1225
+
1226
+ tracing::info!(
1227
+ iteration,
1228
+ reschedule_ts = current_reschedule_ts,
1229
+ "actor has reschedule_ts after crash"
1230
+ );
1231
+
1232
+ // Calculate backoff delta if we have a previous timestamp
1233
+ if let Some(prev_ts) = previous_reschedule_ts {
1234
+ let delta = current_reschedule_ts - prev_ts;
1235
+ backoff_deltas.push(delta);
1236
+ tracing::info!(
1237
+ iteration,
1238
+ delta_ms = delta,
1239
+ "backoff delta from previous reschedule"
1240
+ );
1241
+ }
1242
+
1243
+ previous_reschedule_ts = Some(current_reschedule_ts);
1244
+
1245
+ // Wait for the reschedule time to pass so next crash can happen
1246
+ let now = rivet_util::timestamp::now();
1247
+ if current_reschedule_ts > now {
1248
+ let wait_duration = (current_reschedule_ts - now) as u64;
1249
+ tracing::info!(
1250
+ wait_duration_ms = wait_duration,
1251
+ "waiting for reschedule time"
1252
+ );
1253
+ tokio::time::sleep(tokio::time::Duration::from_millis(wait_duration + 100)).await;
1254
+ }
1255
+ }
1256
+
1257
+ // Verify that backoff intervals generally increase (exponential backoff)
1258
+ // We expect each delta to be larger than or equal to the previous
1259
+ // (allowing some tolerance for system timing)
1260
+ for i in 1..backoff_deltas.len() {
1261
+ tracing::info!(
1262
+ iteration = i,
1263
+ current_delta = backoff_deltas[i],
1264
+ previous_delta = backoff_deltas[i - 1],
1265
+ "comparing backoff deltas"
1266
+ );
1267
+
1268
+ // Allow some tolerance: current should be >= 80% of expected growth
1269
+ // (exponential backoff typically doubles, but we allow for some variance)
1270
+ assert!(
1271
+ backoff_deltas[i] >= backoff_deltas[i - 1] / 2,
1272
+ "backoff should not decrease significantly: iteration {}, prev={}, curr={}",
1273
+ i,
1274
+ backoff_deltas[i - 1],
1275
+ backoff_deltas[i]
1276
+ );
1277
+ }
1278
+
1279
+ tracing::info!(
1280
+ ?backoff_deltas,
1281
+ "exponential backoff verified across multiple crashes"
1282
+ );
1283
+ });
1284
+ }