@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
@@ -1,22 +1,41 @@
1
+ // runner wf see how signal fail handling
1
2
  use base64::Engine;
2
3
  use base64::prelude::BASE64_STANDARD;
3
4
  use futures_util::StreamExt;
4
5
  use futures_util::TryStreamExt;
5
6
  use gas::prelude::*;
6
- use rivet_metrics::KeyValue;
7
- use rivet_runner_protocol as protocol;
8
- use rivet_types::{
9
- actors::CrashPolicy, keys::namespace::runner_config::RunnerConfigVariant,
10
- runner_configs::RunnerConfigKind,
7
+ use rand::prelude::SliceRandom;
8
+ use rivet_runner_protocol::{
9
+ self as protocol, PROTOCOL_MK1_VERSION, PROTOCOL_MK2_VERSION, versioned,
11
10
  };
11
+ use rivet_types::actors::CrashPolicy;
12
+ use rivet_types::runner_configs::RunnerConfigKind;
12
13
  use std::time::Instant;
13
- use universaldb::options::{ConflictRangeType, MutationType, StreamingMode};
14
- use universaldb::utils::{FormalKey, IsolationLevel::*};
14
+ use universaldb::prelude::*;
15
+ use universalpubsub::PublishOpts;
16
+ use vbare::OwnedVersionedData;
17
+
18
+ use super::FailureReason;
15
19
 
16
20
  use crate::{keys, metrics};
17
21
 
18
22
  use super::{Allocate, Destroy, Input, PendingAllocation, State, destroy};
19
23
 
24
+ #[derive(Debug, Deserialize, Serialize)]
25
+ pub struct LifecycleRunnerState {
26
+ pub last_event_idx: i64,
27
+ pub last_event_ack_idx: i64,
28
+ }
29
+
30
+ impl Default for LifecycleRunnerState {
31
+ fn default() -> Self {
32
+ LifecycleRunnerState {
33
+ last_event_idx: -1,
34
+ last_event_ack_idx: -1,
35
+ }
36
+ }
37
+ }
38
+
20
39
  // TODO: Rewrite this as a series of nested structs/enums for better transparency of current state (likely
21
40
  // requires actor wf v2)
22
41
  #[derive(Deserialize, Serialize)]
@@ -26,6 +45,8 @@ pub struct LifecycleState {
26
45
  // Set when currently running (not rescheduling or sleeping)
27
46
  pub runner_id: Option<Id>,
28
47
  pub runner_workflow_id: Option<Id>,
48
+ pub runner_protocol_version: Option<u16>,
49
+ pub runner_state: Option<LifecycleRunnerState>,
29
50
 
30
51
  pub sleeping: bool,
31
52
  #[serde(default)]
@@ -46,11 +67,18 @@ pub struct LifecycleState {
46
67
  }
47
68
 
48
69
  impl LifecycleState {
49
- pub fn new(runner_id: Id, runner_workflow_id: Id, actor_start_threshold: i64) -> Self {
70
+ pub fn new(
71
+ runner_id: Id,
72
+ runner_workflow_id: Id,
73
+ runner_protocol_version: u16,
74
+ actor_start_threshold: i64,
75
+ ) -> Self {
50
76
  LifecycleState {
51
77
  generation: 0,
52
78
  runner_id: Some(runner_id),
53
79
  runner_workflow_id: Some(runner_workflow_id),
80
+ runner_protocol_version: Some(runner_protocol_version),
81
+ runner_state: Some(LifecycleRunnerState::default()),
54
82
  sleeping: false,
55
83
  stopping: false,
56
84
  going_away: false,
@@ -66,6 +94,8 @@ impl LifecycleState {
66
94
  generation: 0,
67
95
  runner_id: None,
68
96
  runner_workflow_id: None,
97
+ runner_protocol_version: None,
98
+ runner_state: None,
69
99
  sleeping: true,
70
100
  stopping: false,
71
101
  going_away: false,
@@ -80,6 +110,8 @@ impl LifecycleState {
80
110
  #[derive(Serialize, Deserialize)]
81
111
  pub struct LifecycleResult {
82
112
  pub generation: u32,
113
+ #[serde(default)]
114
+ pub migrate_to_v2: bool,
83
115
  }
84
116
 
85
117
  #[derive(Serialize, Deserialize, Clone, Default)]
@@ -102,14 +134,26 @@ async fn update_runner(ctx: &ActivityCtx, input: &UpdateRunnerInput) -> Result<(
102
134
 
103
135
  state.sleep_ts = None;
104
136
  state.pending_allocation_ts = None;
137
+ state.failure_reason = None;
105
138
  state.runner_id = Some(input.runner_id);
106
139
  state.runner_workflow_id = Some(input.runner_workflow_id);
107
140
 
141
+ ctx.udb()?
142
+ .run(|tx| async move {
143
+ let tx = tx.with_subspace(keys::subspace());
144
+
145
+ // Set actor as not sleeping
146
+ tx.delete(&keys::actor::SleepTsKey::new(input.actor_id));
147
+
148
+ Ok(())
149
+ })
150
+ .await?;
151
+
108
152
  Ok(())
109
153
  }
110
154
 
111
155
  #[derive(Debug, Serialize, Deserialize, Hash)]
112
- struct AllocateActorInput {
156
+ struct AllocateActorInputV1 {
113
157
  actor_id: Id,
114
158
  generation: u32,
115
159
  force_allocate: bool,
@@ -117,7 +161,7 @@ struct AllocateActorInput {
117
161
 
118
162
  #[derive(Debug, Serialize, Deserialize)]
119
163
  #[serde(rename_all = "snake_case")]
120
- pub enum AllocateActorOutput {
164
+ pub enum AllocateActorOutputV1 {
121
165
  Allocated {
122
166
  runner_id: Id,
123
167
  runner_workflow_id: Id,
@@ -128,12 +172,73 @@ pub enum AllocateActorOutput {
128
172
  Sleep,
129
173
  }
130
174
 
131
- // If no availability, returns the timestamp of the actor's queue key
132
175
  #[activity(AllocateActor)]
133
176
  async fn allocate_actor(
134
177
  ctx: &ActivityCtx,
135
- input: &AllocateActorInput,
136
- ) -> Result<AllocateActorOutput> {
178
+ input: &AllocateActorInputV1,
179
+ ) -> Result<AllocateActorOutputV1> {
180
+ bail!("allocate actor v1 should never be called again")
181
+ }
182
+
183
+ #[derive(Debug, Serialize, Deserialize, Hash)]
184
+ struct AllocateActorInputV2 {
185
+ actor_id: Id,
186
+ generation: u32,
187
+ force_allocate: bool,
188
+ }
189
+
190
+ #[derive(Debug, Serialize, Deserialize)]
191
+ struct AllocateActorOutputV2 {
192
+ status: AllocateActorStatus,
193
+ serverless: bool,
194
+ }
195
+
196
+ impl From<AllocateActorOutputV1> for AllocateActorOutputV2 {
197
+ fn from(value: AllocateActorOutputV1) -> Self {
198
+ Self {
199
+ serverless: false,
200
+ status: match value {
201
+ AllocateActorOutputV1::Allocated {
202
+ runner_id,
203
+ runner_workflow_id,
204
+ } => AllocateActorStatus::Allocated {
205
+ runner_id,
206
+ runner_workflow_id,
207
+ runner_protocol_version: None,
208
+ },
209
+ AllocateActorOutputV1::Pending {
210
+ pending_allocation_ts,
211
+ } => AllocateActorStatus::Pending {
212
+ pending_allocation_ts,
213
+ },
214
+ AllocateActorOutputV1::Sleep => AllocateActorStatus::Sleep,
215
+ },
216
+ }
217
+ }
218
+ }
219
+
220
+ #[derive(Debug, Serialize, Deserialize)]
221
+ #[serde(rename_all = "snake_case")]
222
+ enum AllocateActorStatus {
223
+ Allocated {
224
+ runner_id: Id,
225
+ runner_workflow_id: Id,
226
+ #[serde(default)]
227
+ runner_protocol_version: Option<u16>,
228
+ },
229
+ Pending {
230
+ pending_allocation_ts: i64,
231
+ },
232
+ Sleep,
233
+ MigrateToV2,
234
+ }
235
+
236
+ // If no availability, returns the timestamp of the actor's queue key
237
+ #[activity(AllocateActorV2)]
238
+ async fn allocate_actor_v2(
239
+ ctx: &ActivityCtx,
240
+ input: &AllocateActorInputV2,
241
+ ) -> Result<AllocateActorOutputV2> {
137
242
  let start_instant = Instant::now();
138
243
 
139
244
  let mut state = ctx.state::<State>()?;
@@ -141,45 +246,61 @@ async fn allocate_actor(
141
246
  let crash_policy = state.crash_policy;
142
247
  let runner_name_selector = &state.runner_name_selector;
143
248
 
144
- // Check if valid serverless config exists for the current ns + runner name
145
- let runner_config_res = ctx
146
- .op(namespace::ops::runner_config::get::Input {
249
+ let runner_eligible_threshold = ctx.config().pegboard().runner_eligible_threshold();
250
+ let actor_allocation_candidate_sample_size = ctx
251
+ .config()
252
+ .pegboard()
253
+ .actor_allocation_candidate_sample_size();
254
+
255
+ let pool_res = ctx
256
+ .op(crate::ops::runner_config::get::Input {
147
257
  runners: vec![(namespace_id, runner_name_selector.clone())],
148
258
  bypass_cache: false,
149
259
  })
150
260
  .await?;
151
- let has_valid_serverless = runner_config_res
152
- .first()
153
- .map(|runner| match &runner.config.kind {
154
- RunnerConfigKind::Serverless { max_runners, .. } => *max_runners != 0,
155
- _ => false,
156
- })
157
- .unwrap_or_default();
158
-
159
- let runner_eligible_threshold = ctx.config().pegboard().runner_eligible_threshold();
261
+ let pool = pool_res.into_iter().next();
262
+ let for_serverless = pool
263
+ .as_ref()
264
+ .map(|pool| matches!(pool.config.kind, RunnerConfigKind::Serverless { .. }))
265
+ .unwrap_or(false);
266
+
267
+ // Protocol version is set or this is a serverless pool
268
+ if pool.and_then(|p| p.protocol_version).is_some() {
269
+ return Ok(AllocateActorOutputV2 {
270
+ status: AllocateActorStatus::MigrateToV2,
271
+ serverless: false,
272
+ });
273
+ }
160
274
 
161
275
  // NOTE: This txn should closely resemble the one found in the allocate_pending_actors activity of the
162
276
  // client wf
163
- let (for_serverless, res) = ctx
277
+ let res = ctx
164
278
  .udb()?
165
279
  .run(|tx| async move {
166
280
  let ping_threshold_ts = util::timestamp::now() - runner_eligible_threshold;
167
281
 
168
- // Check if runner is an serverless runner
169
- let for_serverless = tx
170
- .with_subspace(namespace::keys::subspace())
171
- .exists(
172
- &namespace::keys::runner_config::ByVariantKey::new(
173
- namespace_id,
174
- RunnerConfigVariant::Serverless,
175
- runner_name_selector.clone(),
176
- ),
177
- Serializable,
178
- )
179
- .await?;
180
-
181
282
  let tx = tx.with_subspace(keys::subspace());
182
283
 
284
+ // Check if a queue exists
285
+ let pending_actor_subspace = keys::subspace().subspace(
286
+ &keys::ns::PendingActorByRunnerNameSelectorKey::subspace(
287
+ namespace_id,
288
+ runner_name_selector.clone(),
289
+ ),
290
+ );
291
+
292
+ let mut queue_stream = tx.get_ranges_keyvalues(
293
+ universaldb::RangeOption {
294
+ mode: StreamingMode::Exact,
295
+ limit: Some(1),
296
+ ..(&pending_actor_subspace).into()
297
+ },
298
+ // NOTE: This is not Serializable because we don't want to conflict with other
299
+ // inserts/clears to this range
300
+ Snapshot,
301
+ );
302
+ let queue_exists = queue_stream.next().await.is_some();
303
+
183
304
  if for_serverless {
184
305
  tx.atomic_op(
185
306
  &rivet_types::keys::pegboard::ns::ServerlessDesiredSlotsKey::new(
@@ -191,28 +312,6 @@ async fn allocate_actor(
191
312
  );
192
313
  }
193
314
 
194
- // Check if a queue exists
195
- let pending_actor_subspace = keys::subspace().subspace(
196
- &keys::ns::PendingActorByRunnerNameSelectorKey::subspace(
197
- namespace_id,
198
- runner_name_selector.clone(),
199
- ),
200
- );
201
- let queue_exists = tx
202
- .get_ranges_keyvalues(
203
- universaldb::RangeOption {
204
- mode: StreamingMode::Exact,
205
- limit: Some(1),
206
- ..(&pending_actor_subspace).into()
207
- },
208
- // NOTE: This is not Serializable because we don't want to conflict with other
209
- // inserts/clears to this range
210
- Snapshot,
211
- )
212
- .next()
213
- .await
214
- .is_some();
215
-
216
315
  if !queue_exists {
217
316
  let runner_alloc_subspace =
218
317
  keys::subspace().subspace(&keys::ns::RunnerAllocIdxKey::subspace(
@@ -231,7 +330,9 @@ async fn allocate_actor(
231
330
  );
232
331
 
233
332
  let mut highest_version = None;
333
+ let mut candidates = Vec::with_capacity(actor_allocation_candidate_sample_size);
234
334
 
335
+ // Select valid runner candidates for allocation
235
336
  loop {
236
337
  let Some(entry) = stream.try_next().await? else {
237
338
  break;
@@ -255,11 +356,26 @@ async fn allocate_actor(
255
356
  break;
256
357
  }
257
358
 
258
- // Scan by last ping
359
+ // Ignore runners without valid ping
259
360
  if old_runner_alloc_key.last_ping_ts < ping_threshold_ts {
260
361
  continue;
261
362
  }
262
363
 
364
+ candidates.push((old_runner_alloc_key, old_runner_alloc_key_data));
365
+
366
+ // Max candidate size reached
367
+ if candidates.len() >= actor_allocation_candidate_sample_size {
368
+ break;
369
+ }
370
+ }
371
+
372
+ if !candidates.is_empty() {
373
+ // Select a candidate at random, weighted by remaining slots
374
+ let (old_runner_alloc_key, old_runner_alloc_key_data) = candidates
375
+ .choose_weighted(&mut rand::thread_rng(), |(key, _)| {
376
+ key.remaining_millislots
377
+ })?;
378
+
263
379
  // Add read conflict only for this key
264
380
  tx.add_conflict_key(&old_runner_alloc_key, ConflictRangeType::Read)?;
265
381
 
@@ -285,6 +401,7 @@ async fn allocate_actor(
285
401
  workflow_id: old_runner_alloc_key_data.workflow_id,
286
402
  remaining_slots: new_remaining_slots,
287
403
  total_slots: old_runner_alloc_key_data.total_slots,
404
+ protocol_version: old_runner_alloc_key_data.protocol_version,
288
405
  },
289
406
  )?;
290
407
 
@@ -312,22 +429,26 @@ async fn allocate_actor(
312
429
  // Set actor as not sleeping
313
430
  tx.delete(&keys::actor::SleepTsKey::new(input.actor_id));
314
431
 
315
- return Ok((
316
- for_serverless,
317
- AllocateActorOutput::Allocated {
432
+ return Ok(AllocateActorOutputV2 {
433
+ serverless: for_serverless,
434
+ status: AllocateActorStatus::Allocated {
318
435
  runner_id: old_runner_alloc_key.runner_id,
319
436
  runner_workflow_id: old_runner_alloc_key_data.workflow_id,
437
+ runner_protocol_version: Some(
438
+ old_runner_alloc_key_data.protocol_version,
439
+ ),
320
440
  },
321
- ));
441
+ });
322
442
  }
323
443
  }
324
444
 
325
445
  // At this point in the txn there is no availability
326
446
 
327
- match (crash_policy, input.force_allocate, has_valid_serverless) {
328
- (CrashPolicy::Sleep, false, false) => {
329
- Ok((for_serverless, AllocateActorOutput::Sleep))
330
- }
447
+ match (crash_policy, input.force_allocate, for_serverless) {
448
+ (CrashPolicy::Sleep, false, false) => Ok(AllocateActorOutputV2 {
449
+ serverless: false,
450
+ status: AllocateActorStatus::Sleep,
451
+ }),
331
452
  // Write the actor to the alloc queue to wait
332
453
  _ => {
333
454
  let pending_allocation_ts = util::timestamp::now();
@@ -345,12 +466,12 @@ async fn allocate_actor(
345
466
  input.generation,
346
467
  )?;
347
468
 
348
- Ok((
349
- for_serverless,
350
- AllocateActorOutput::Pending {
469
+ Ok(AllocateActorOutputV2 {
470
+ serverless: for_serverless,
471
+ status: AllocateActorStatus::Pending {
351
472
  pending_allocation_ts,
352
473
  },
353
- ))
474
+ })
354
475
  }
355
476
  }
356
477
  })
@@ -358,38 +479,58 @@ async fn allocate_actor(
358
479
  .await?;
359
480
 
360
481
  let dt = start_instant.elapsed().as_secs_f64();
361
- metrics::ACTOR_ALLOCATE_DURATION.record(
362
- dt,
363
- &[KeyValue::new(
364
- "did_reserve",
365
- matches!(res, AllocateActorOutput::Allocated { .. }).to_string(),
366
- )],
367
- );
368
-
369
- state.for_serverless = for_serverless;
370
- state.allocated_serverless_slot = for_serverless;
371
-
372
- match &res {
373
- AllocateActorOutput::Allocated {
482
+ metrics::ACTOR_ALLOCATE_DURATION
483
+ .with_label_values(&[
484
+ if res.serverless {
485
+ "serverless"
486
+ } else {
487
+ "serverful"
488
+ },
489
+ match res.status {
490
+ AllocateActorStatus::Allocated { .. } => "allocated",
491
+ AllocateActorStatus::Pending { .. } => "pending",
492
+ AllocateActorStatus::Sleep { .. } => "sleep",
493
+ AllocateActorStatus::MigrateToV2 => bail!("should not be migrate_to_v2"),
494
+ },
495
+ ])
496
+ .observe(dt);
497
+
498
+ state.for_serverless = res.serverless;
499
+ state.allocated_serverless_slot = res.serverless;
500
+ state.reschedule_ts = None;
501
+
502
+ match &res.status {
503
+ AllocateActorStatus::Allocated {
374
504
  runner_id,
375
505
  runner_workflow_id,
506
+ ..
376
507
  } => {
377
508
  state.sleep_ts = None;
378
509
  state.pending_allocation_ts = None;
510
+ state.failure_reason = None;
379
511
  state.runner_id = Some(*runner_id);
380
512
  state.runner_workflow_id = Some(*runner_workflow_id);
381
513
  }
382
- AllocateActorOutput::Pending {
514
+ AllocateActorStatus::Pending {
383
515
  pending_allocation_ts,
516
+ ..
384
517
  } => {
385
- tracing::warn!(
518
+ tracing::debug!(
386
519
  actor_id=?input.actor_id,
387
520
  "failed to allocate (no availability), waiting for allocation",
388
521
  );
389
522
 
390
523
  state.pending_allocation_ts = Some(*pending_allocation_ts);
524
+ if state.failure_reason.is_none() {
525
+ state.failure_reason = Some(super::FailureReason::NoCapacity);
526
+ }
527
+ }
528
+ AllocateActorStatus::Sleep => {
529
+ if state.failure_reason.is_none() {
530
+ state.failure_reason = Some(super::FailureReason::NoCapacity);
531
+ }
391
532
  }
392
- AllocateActorOutput::Sleep => {}
533
+ AllocateActorStatus::MigrateToV2 => bail!("should not be migrate_to_v2"),
393
534
  }
394
535
 
395
536
  Ok(res)
@@ -406,6 +547,8 @@ pub async fn set_not_connectable(ctx: &ActivityCtx, input: &SetNotConnectableInp
406
547
 
407
548
  ctx.udb()?
408
549
  .run(|tx| async move {
550
+ let tx = tx.with_subspace(keys::subspace());
551
+
409
552
  let connectable_key = keys::actor::ConnectableKey::new(input.actor_id);
410
553
  tx.clear(&keys::subspace().pack(&connectable_key));
411
554
 
@@ -432,10 +575,10 @@ pub struct DeallocateOutput {
432
575
  #[activity(Deallocate)]
433
576
  pub async fn deallocate(ctx: &ActivityCtx, input: &DeallocateInput) -> Result<DeallocateOutput> {
434
577
  let mut state = ctx.state::<State>()?;
435
- let runner_name_selector = &state.runner_name_selector;
436
578
  let namespace_id = state.namespace_id;
579
+ let runner_name_selector = &state.runner_name_selector;
437
580
  let runner_id = state.runner_id;
438
- let for_serverless = state.for_serverless;
581
+ let allocated_serverless_slot = state.allocated_serverless_slot;
439
582
 
440
583
  ctx.udb()?
441
584
  .run(|tx| async move {
@@ -443,18 +586,15 @@ pub async fn deallocate(ctx: &ActivityCtx, input: &DeallocateInput) -> Result<De
443
586
 
444
587
  tx.delete(&keys::actor::ConnectableKey::new(input.actor_id));
445
588
 
446
- // Only clear slot if we have a runner id
447
- if let Some(runner_id) = runner_id {
448
- destroy::clear_slot(
449
- input.actor_id,
450
- namespace_id,
451
- runner_name_selector,
452
- runner_id,
453
- for_serverless,
454
- &tx,
455
- )
456
- .await?;
457
- }
589
+ destroy::clear_slot(
590
+ input.actor_id,
591
+ namespace_id,
592
+ runner_name_selector,
593
+ runner_id,
594
+ allocated_serverless_slot,
595
+ &tx,
596
+ )
597
+ .await?;
458
598
 
459
599
  Ok(())
460
600
  })
@@ -464,6 +604,7 @@ pub async fn deallocate(ctx: &ActivityCtx, input: &DeallocateInput) -> Result<De
464
604
  state.connectable_ts = None;
465
605
  state.runner_id = None;
466
606
  state.runner_workflow_id = None;
607
+ state.runner_state = None;
467
608
  // Slot was cleared by the above txn
468
609
  state.allocated_serverless_slot = false;
469
610
 
@@ -479,6 +620,9 @@ pub enum AllocationOverride {
479
620
  None,
480
621
  /// Forces actors with CrashPolicy::Sleep to pend instead of sleep.
481
622
  DontSleep { pending_timeout: Option<i64> },
623
+ /// If an allocation results in pending, it will be put to sleep if it is not allocated after this
624
+ /// timeout.
625
+ PendingTimeout { pending_timeout: i64 },
482
626
  }
483
627
 
484
628
  #[derive(Debug)]
@@ -486,9 +630,11 @@ pub enum SpawnActorOutput {
486
630
  Allocated {
487
631
  runner_id: Id,
488
632
  runner_workflow_id: Id,
633
+ runner_protocol_version: u16,
489
634
  },
490
635
  Sleep,
491
636
  Destroy,
637
+ MigrateToV2,
492
638
  }
493
639
 
494
640
  /// Wrapper around `allocate_actor` that handles pending state.
@@ -499,76 +645,179 @@ pub async fn spawn_actor(
499
645
  allocation_override: AllocationOverride,
500
646
  ) -> Result<SpawnActorOutput> {
501
647
  // Attempt allocation
502
- let allocate_res = ctx
503
- .activity(AllocateActorInput {
504
- actor_id: input.actor_id,
505
- generation,
506
- force_allocate: matches!(&allocation_override, AllocationOverride::DontSleep { .. }),
507
- })
508
- .await?;
648
+ let allocate_res: AllocateActorOutputV2 = match ctx.check_version(2).await? {
649
+ 1 => ctx
650
+ .activity(AllocateActorInputV1 {
651
+ actor_id: input.actor_id,
652
+ generation,
653
+ force_allocate: matches!(
654
+ &allocation_override,
655
+ AllocationOverride::DontSleep { .. }
656
+ ),
657
+ })
658
+ .await?
659
+ .into(),
660
+ _latest => {
661
+ ctx.v(2)
662
+ .activity(AllocateActorInputV2 {
663
+ actor_id: input.actor_id,
664
+ generation,
665
+ force_allocate: matches!(
666
+ &allocation_override,
667
+ AllocationOverride::DontSleep { .. }
668
+ ),
669
+ })
670
+ .await?
671
+ }
672
+ };
509
673
 
510
- match allocate_res {
511
- AllocateActorOutput::Allocated {
674
+ match allocate_res.status {
675
+ AllocateActorStatus::Allocated {
512
676
  runner_id,
513
677
  runner_workflow_id,
678
+ runner_protocol_version,
514
679
  } => {
515
- // Bump the autoscaler so it can scale up
516
- ctx.msg(rivet_types::msgs::pegboard::BumpServerlessAutoscaler {})
517
- .send()
680
+ let runner_protocol_version = runner_protocol_version.unwrap_or(PROTOCOL_MK1_VERSION);
681
+
682
+ ctx.removed::<Message<super::BumpServerlessAutoscalerStub>>()
518
683
  .await?;
519
684
 
520
- ctx.signal(crate::workflows::runner::Command {
521
- inner: protocol::Command::CommandStartActor(protocol::CommandStartActor {
522
- actor_id: input.actor_id.to_string(),
685
+ // Bump the pool so it can scale up
686
+ if allocate_res.serverless {
687
+ let res = ctx
688
+ .v(2)
689
+ .signal(crate::workflows::runner_pool::Bump::default())
690
+ .to_workflow::<crate::workflows::runner_pool::Workflow>()
691
+ .tag("namespace_id", input.namespace_id)
692
+ .tag("runner_name", input.runner_name_selector.clone())
693
+ .send()
694
+ .await;
695
+
696
+ if let Some(WorkflowError::WorkflowNotFound) = res
697
+ .as_ref()
698
+ .err()
699
+ .and_then(|x| x.chain().find_map(|x| x.downcast_ref::<WorkflowError>()))
700
+ {
701
+ tracing::warn!(
702
+ namespace_id=%input.namespace_id,
703
+ runner_name=%input.runner_name_selector,
704
+ "serverless pool workflow not found, respective runner config likely deleted"
705
+ );
706
+ } else {
707
+ res?;
708
+ }
709
+ }
710
+
711
+ if protocol::is_mk2(runner_protocol_version) {
712
+ ctx.activity(InsertAndSendCommandsInput {
713
+ actor_id: input.actor_id,
523
714
  generation,
524
- config: protocol::ActorConfig {
525
- name: input.name.clone(),
526
- key: input.key.clone(),
527
- // HACK: We should not use dynamic timestamp here, but we don't validate if signal data
528
- // changes (like activity inputs) so this is fine for now.
529
- create_ts: util::timestamp::now(),
530
- input: input
531
- .input
532
- .as_ref()
533
- .map(|x| BASE64_STANDARD.decode(x))
534
- .transpose()?,
535
- },
536
- // Empty because request ids are ephemeral. This is intercepted by guard and
537
- // populated before it reaches the runner
538
- hibernating_requests: Vec::new(),
539
- }),
540
- })
541
- .to_workflow_id(runner_workflow_id)
542
- .send()
543
- .await?;
715
+ runner_id,
716
+ commands: vec![protocol::mk2::Command::CommandStartActor(
717
+ protocol::mk2::CommandStartActor {
718
+ config: protocol::mk2::ActorConfig {
719
+ name: input.name.clone(),
720
+ key: input.key.clone(),
721
+ // HACK: We should not use dynamic timestamp here, but we don't validate if signal data
722
+ // changes (like activity inputs) so this is fine for now.
723
+ create_ts: util::timestamp::now(),
724
+ input: input
725
+ .input
726
+ .as_ref()
727
+ .and_then(|x| BASE64_STANDARD.decode(x).ok()),
728
+ },
729
+ // Empty because request ids are ephemeral. This is intercepted by guard and
730
+ // populated before it reaches the runner
731
+ hibernating_requests: Vec::new(),
732
+ },
733
+ )],
734
+ })
735
+ .await?;
736
+ } else {
737
+ ctx.signal(crate::workflows::runner::Command {
738
+ inner: protocol::Command::CommandStartActor(protocol::CommandStartActor {
739
+ actor_id: input.actor_id.to_string(),
740
+ generation,
741
+ config: protocol::ActorConfig {
742
+ name: input.name.clone(),
743
+ key: input.key.clone(),
744
+ // HACK: We should not use dynamic timestamp here, but we don't validate if signal data
745
+ // changes (like activity inputs) so this is fine for now.
746
+ create_ts: util::timestamp::now(),
747
+ input: input
748
+ .input
749
+ .as_ref()
750
+ .map(|x| BASE64_STANDARD.decode(x))
751
+ .transpose()?,
752
+ },
753
+ // Empty because request ids are ephemeral. This is intercepted by guard and
754
+ // populated before it reaches the runner
755
+ hibernating_requests: Vec::new(),
756
+ }),
757
+ })
758
+ .to_workflow_id(runner_workflow_id)
759
+ .send()
760
+ .await?;
761
+ }
544
762
 
545
763
  Ok(SpawnActorOutput::Allocated {
546
764
  runner_id,
547
765
  runner_workflow_id,
766
+ runner_protocol_version,
548
767
  })
549
768
  }
550
- AllocateActorOutput::Pending {
769
+ AllocateActorStatus::Pending {
551
770
  pending_allocation_ts,
552
771
  } => {
553
- // Bump the autoscaler so it can scale up
554
- ctx.msg(rivet_types::msgs::pegboard::BumpServerlessAutoscaler {})
555
- .send()
772
+ ctx.removed::<Message<super::BumpServerlessAutoscalerStub>>()
556
773
  .await?;
557
774
 
558
- let signal = if let AllocationOverride::DontSleep {
559
- pending_timeout: Some(timeout),
560
- } = allocation_override
561
- {
562
- ctx.listen_with_timeout::<PendingAllocation>(timeout)
563
- .await?
564
- } else {
565
- Some(ctx.listen::<PendingAllocation>().await?)
775
+ // Bump the pool so it can scale up
776
+ if allocate_res.serverless {
777
+ let res = ctx
778
+ .v(2)
779
+ .signal(crate::workflows::runner_pool::Bump::default())
780
+ .to_workflow::<crate::workflows::runner_pool::Workflow>()
781
+ .tag("namespace_id", input.namespace_id)
782
+ .tag("runner_name", input.runner_name_selector.clone())
783
+ .send()
784
+ .await;
785
+
786
+ if let Some(WorkflowError::WorkflowNotFound) = res
787
+ .as_ref()
788
+ .err()
789
+ .and_then(|x| x.chain().find_map(|x| x.downcast_ref::<WorkflowError>()))
790
+ {
791
+ tracing::warn!(
792
+ namespace_id=%input.namespace_id,
793
+ runner_name=%input.runner_name_selector,
794
+ "serverless pool workflow not found, respective runner config likely deleted"
795
+ );
796
+ } else {
797
+ res?;
798
+ }
799
+ }
800
+
801
+ let signal = match allocation_override {
802
+ AllocationOverride::DontSleep {
803
+ pending_timeout: Some(timeout),
804
+ }
805
+ | AllocationOverride::PendingTimeout {
806
+ pending_timeout: timeout,
807
+ } => {
808
+ ctx.listen_with_timeout::<PendingAllocation>(timeout)
809
+ .await?
810
+ }
811
+ _ => Some(ctx.listen::<PendingAllocation>().await?),
566
812
  };
567
813
 
568
814
  // If allocation fails, the allocate txn already inserted this actor into the queue. Now we wait for
569
815
  // an `Allocate` signal
570
816
  match signal {
571
817
  Some(PendingAllocation::Allocate(sig)) => {
818
+ let runner_protocol_version =
819
+ sig.runner_protocol_version.unwrap_or(PROTOCOL_MK1_VERSION);
820
+
572
821
  ctx.activity(UpdateRunnerInput {
573
822
  actor_id: input.actor_id,
574
823
  runner_id: sig.runner_id,
@@ -576,32 +825,61 @@ pub async fn spawn_actor(
576
825
  })
577
826
  .await?;
578
827
 
579
- ctx.signal(crate::workflows::runner::Command {
580
- inner: protocol::Command::CommandStartActor(protocol::CommandStartActor {
581
- actor_id: input.actor_id.to_string(),
828
+ if protocol::is_mk2(runner_protocol_version) {
829
+ ctx.activity(InsertAndSendCommandsInput {
830
+ actor_id: input.actor_id,
582
831
  generation,
583
- config: protocol::ActorConfig {
584
- name: input.name.clone(),
585
- key: input.key.clone(),
586
- create_ts: util::timestamp::now(),
587
- input: input
588
- .input
589
- .as_ref()
590
- .map(|x| BASE64_STANDARD.decode(x))
591
- .transpose()?,
592
- },
593
- // Empty because request ids are ephemeral. This is intercepted by guard and
594
- // populated before it reaches the runner
595
- hibernating_requests: Vec::new(),
596
- }),
597
- })
598
- .to_workflow_id(sig.runner_workflow_id)
599
- .send()
600
- .await?;
832
+ runner_id: sig.runner_id,
833
+ commands: vec![protocol::mk2::Command::CommandStartActor(
834
+ protocol::mk2::CommandStartActor {
835
+ config: protocol::mk2::ActorConfig {
836
+ name: input.name.clone(),
837
+ key: input.key.clone(),
838
+ create_ts: util::timestamp::now(),
839
+ input: input
840
+ .input
841
+ .as_ref()
842
+ .map(|x| BASE64_STANDARD.decode(x))
843
+ .transpose()?,
844
+ },
845
+ // Empty because request ids are ephemeral. This is intercepted by guard and
846
+ // populated before it reaches the runner
847
+ hibernating_requests: Vec::new(),
848
+ },
849
+ )],
850
+ })
851
+ .await?;
852
+ } else {
853
+ ctx.signal(crate::workflows::runner::Command {
854
+ inner: protocol::Command::CommandStartActor(
855
+ protocol::CommandStartActor {
856
+ actor_id: input.actor_id.to_string(),
857
+ generation,
858
+ config: protocol::ActorConfig {
859
+ name: input.name.clone(),
860
+ key: input.key.clone(),
861
+ create_ts: util::timestamp::now(),
862
+ input: input
863
+ .input
864
+ .as_ref()
865
+ .map(|x| BASE64_STANDARD.decode(x))
866
+ .transpose()?,
867
+ },
868
+ // Empty because request ids are ephemeral. This is intercepted by guard and
869
+ // populated before it reaches the runner
870
+ hibernating_requests: Vec::new(),
871
+ },
872
+ ),
873
+ })
874
+ .to_workflow_id(sig.runner_workflow_id)
875
+ .send()
876
+ .await?;
877
+ }
601
878
 
602
879
  Ok(SpawnActorOutput::Allocated {
603
880
  runner_id: sig.runner_id,
604
881
  runner_workflow_id: sig.runner_workflow_id,
882
+ runner_protocol_version,
605
883
  })
606
884
  }
607
885
  Some(PendingAllocation::Destroy(_)) => {
@@ -628,6 +906,31 @@ pub async fn spawn_actor(
628
906
  })
629
907
  .await?;
630
908
  }
909
+ // Bump the pool so it can scale down
910
+ else if allocate_res.serverless {
911
+ let res = ctx
912
+ .v(2)
913
+ .signal(crate::workflows::runner_pool::Bump::default())
914
+ .to_workflow::<crate::workflows::runner_pool::Workflow>()
915
+ .tag("namespace_id", input.namespace_id)
916
+ .tag("runner_name", input.runner_name_selector.clone())
917
+ .send()
918
+ .await;
919
+
920
+ if let Some(WorkflowError::WorkflowNotFound) = res
921
+ .as_ref()
922
+ .err()
923
+ .and_then(|x| x.chain().find_map(|x| x.downcast_ref::<WorkflowError>()))
924
+ {
925
+ tracing::warn!(
926
+ namespace_id=%input.namespace_id,
927
+ runner_name=%input.runner_name_selector,
928
+ "serverless pool workflow not found, respective runner config likely deleted"
929
+ );
930
+ } else {
931
+ res?;
932
+ }
933
+ }
631
934
 
632
935
  Ok(SpawnActorOutput::Destroy)
633
936
  }
@@ -647,6 +950,8 @@ pub async fn spawn_actor(
647
950
  // wait for the allocated signal to prevent a race condition.
648
951
  if !cleared {
649
952
  let sig = ctx.listen::<Allocate>().await?;
953
+ let runner_protocol_version =
954
+ sig.runner_protocol_version.unwrap_or(PROTOCOL_MK1_VERSION);
650
955
 
651
956
  ctx.activity(UpdateRunnerInput {
652
957
  actor_id: input.actor_id,
@@ -655,42 +960,95 @@ pub async fn spawn_actor(
655
960
  })
656
961
  .await?;
657
962
 
658
- ctx.signal(crate::workflows::runner::Command {
659
- inner: protocol::Command::CommandStartActor(
660
- protocol::CommandStartActor {
661
- actor_id: input.actor_id.to_string(),
662
- generation,
663
- config: protocol::ActorConfig {
664
- name: input.name.clone(),
665
- key: input.key.clone(),
666
- create_ts: util::timestamp::now(),
667
- input: input
668
- .input
669
- .as_ref()
670
- .map(|x| BASE64_STANDARD.decode(x))
671
- .transpose()?,
963
+ if protocol::is_mk2(runner_protocol_version) {
964
+ ctx.activity(InsertAndSendCommandsInput {
965
+ actor_id: input.actor_id,
966
+ generation,
967
+ runner_id: sig.runner_id,
968
+ commands: vec![protocol::mk2::Command::CommandStartActor(
969
+ protocol::mk2::CommandStartActor {
970
+ config: protocol::mk2::ActorConfig {
971
+ name: input.name.clone(),
972
+ key: input.key.clone(),
973
+ create_ts: util::timestamp::now(),
974
+ input: input
975
+ .input
976
+ .as_ref()
977
+ .map(|x| BASE64_STANDARD.decode(x))
978
+ .transpose()?,
979
+ },
980
+ // Empty because request ids are ephemeral. This is intercepted by guard and
981
+ // populated before it reaches the runner
982
+ hibernating_requests: Vec::new(),
672
983
  },
673
- // Empty because request ids are ephemeral. This is intercepted by guard and
674
- // populated before it reaches the runner
675
- hibernating_requests: Vec::new(),
676
- },
677
- ),
678
- })
679
- .to_workflow_id(sig.runner_workflow_id)
680
- .send()
681
- .await?;
984
+ )],
985
+ })
986
+ .await?;
987
+ } else {
988
+ ctx.signal(crate::workflows::runner::Command {
989
+ inner: protocol::Command::CommandStartActor(
990
+ protocol::CommandStartActor {
991
+ actor_id: input.actor_id.to_string(),
992
+ generation,
993
+ config: protocol::ActorConfig {
994
+ name: input.name.clone(),
995
+ key: input.key.clone(),
996
+ create_ts: util::timestamp::now(),
997
+ input: input
998
+ .input
999
+ .as_ref()
1000
+ .map(|x| BASE64_STANDARD.decode(x))
1001
+ .transpose()?,
1002
+ },
1003
+ // Empty because request ids are ephemeral. This is intercepted by guard and
1004
+ // populated before it reaches the runner
1005
+ hibernating_requests: Vec::new(),
1006
+ },
1007
+ ),
1008
+ })
1009
+ .to_workflow_id(sig.runner_workflow_id)
1010
+ .send()
1011
+ .await?;
1012
+ }
682
1013
 
683
1014
  Ok(SpawnActorOutput::Allocated {
684
1015
  runner_id: sig.runner_id,
685
1016
  runner_workflow_id: sig.runner_workflow_id,
1017
+ runner_protocol_version,
686
1018
  })
687
1019
  } else {
1020
+ // Bump the pool so it can scale down
1021
+ if allocate_res.serverless {
1022
+ let res = ctx
1023
+ .v(2)
1024
+ .signal(crate::workflows::runner_pool::Bump::default())
1025
+ .to_workflow::<crate::workflows::runner_pool::Workflow>()
1026
+ .tag("namespace_id", input.namespace_id)
1027
+ .tag("runner_name", input.runner_name_selector.clone())
1028
+ .send()
1029
+ .await;
1030
+
1031
+ if let Some(WorkflowError::WorkflowNotFound) =
1032
+ res.as_ref().err().and_then(|x| {
1033
+ x.chain().find_map(|x| x.downcast_ref::<WorkflowError>())
1034
+ }) {
1035
+ tracing::warn!(
1036
+ namespace_id=%input.namespace_id,
1037
+ runner_name=%input.runner_name_selector,
1038
+ "serverless pool workflow not found, respective runner config likely deleted"
1039
+ );
1040
+ } else {
1041
+ res?;
1042
+ }
1043
+ }
1044
+
688
1045
  Ok(SpawnActorOutput::Sleep)
689
1046
  }
690
1047
  }
691
1048
  }
692
1049
  }
693
- AllocateActorOutput::Sleep => Ok(SpawnActorOutput::Sleep),
1050
+ AllocateActorStatus::Sleep => Ok(SpawnActorOutput::Sleep),
1051
+ AllocateActorStatus::MigrateToV2 => Ok(SpawnActorOutput::MigrateToV2),
694
1052
  }
695
1053
  }
696
1054
 
@@ -700,6 +1058,7 @@ pub async fn reschedule_actor(
700
1058
  ctx: &mut WorkflowCtx,
701
1059
  input: &Input,
702
1060
  state: &mut LifecycleState,
1061
+ metrics_workflow_id: Id,
703
1062
  allocation_override: AllocationOverride,
704
1063
  ) -> Result<SpawnActorOutput> {
705
1064
  tracing::debug!(actor_id=?input.actor_id, "rescheduling actor");
@@ -747,15 +1106,26 @@ pub async fn reschedule_actor(
747
1106
  if let SpawnActorOutput::Allocated {
748
1107
  runner_id,
749
1108
  runner_workflow_id,
1109
+ runner_protocol_version,
750
1110
  } = &spawn_res
751
1111
  {
752
1112
  state.generation = next_generation;
753
1113
  state.runner_id = Some(*runner_id);
754
1114
  state.runner_workflow_id = Some(*runner_workflow_id);
1115
+ state.runner_protocol_version = Some(*runner_protocol_version);
755
1116
 
756
1117
  // Reset gc timeout once allocated
757
1118
  state.gc_timeout_ts =
758
1119
  Some(util::timestamp::now() + ctx.config().pegboard().actor_start_threshold());
1120
+
1121
+ // Resume periodic metrics workflow
1122
+ ctx.v(2)
1123
+ .signal(super::metrics::Resume {
1124
+ ts: util::timestamp::now(),
1125
+ })
1126
+ .to_workflow_id(metrics_workflow_id)
1127
+ .send()
1128
+ .await?;
759
1129
  }
760
1130
 
761
1131
  Ok(spawn_res)
@@ -774,27 +1144,52 @@ pub async fn clear_pending_allocation(
774
1144
  ctx: &ActivityCtx,
775
1145
  input: &ClearPendingAllocationInput,
776
1146
  ) -> Result<bool> {
1147
+ let mut state = ctx.state::<State>()?;
1148
+
1149
+ let allocated_serverless_slot = state.allocated_serverless_slot;
1150
+
777
1151
  // Clear self from alloc queue
778
1152
  let cleared = ctx
779
1153
  .udb()?
780
1154
  .run(|tx| async move {
781
- let pending_alloc_key =
782
- keys::subspace().pack(&keys::ns::PendingActorByRunnerNameSelectorKey::new(
783
- input.namespace_id,
784
- input.runner_name_selector.clone(),
785
- input.pending_allocation_ts,
786
- input.actor_id,
787
- ));
788
-
789
- let exists = tx.get(&pending_alloc_key, Serializable).await?.is_some();
1155
+ let tx = tx.with_subspace(keys::subspace());
790
1156
 
791
- tx.clear(&pending_alloc_key);
1157
+ let pending_alloc_key = keys::ns::PendingActorByRunnerNameSelectorKey::new(
1158
+ input.namespace_id,
1159
+ input.runner_name_selector.clone(),
1160
+ input.pending_allocation_ts,
1161
+ input.actor_id,
1162
+ );
1163
+ let exists = tx.exists(&pending_alloc_key, Serializable).await?;
1164
+
1165
+ if exists {
1166
+ tx.delete(&pending_alloc_key);
1167
+
1168
+ // If the pending actor key still exists, we must clear its desired slot because after this
1169
+ // activity the actor will go to sleep or be destroyed. We don't clear the slot if the key
1170
+ // doesn't exist because the actor may either be allocated or destroyed.
1171
+ if allocated_serverless_slot {
1172
+ tx.atomic_op(
1173
+ &rivet_types::keys::pegboard::ns::ServerlessDesiredSlotsKey::new(
1174
+ input.namespace_id,
1175
+ input.runner_name_selector.clone(),
1176
+ ),
1177
+ &(-1i64).to_le_bytes(),
1178
+ MutationType::Add,
1179
+ );
1180
+ }
1181
+ }
792
1182
 
793
1183
  Ok(exists)
794
1184
  })
795
1185
  .custom_instrument(tracing::info_span!("actor_clear_pending_alloc_tx"))
796
1186
  .await?;
797
1187
 
1188
+ // Only mark allocated_serverless_slot as false if it was allocated before and cleared now
1189
+ if allocated_serverless_slot && cleared {
1190
+ state.allocated_serverless_slot = false;
1191
+ }
1192
+
798
1193
  Ok(cleared)
799
1194
  }
800
1195
 
@@ -836,14 +1231,17 @@ pub struct SetStartedInput {
836
1231
  #[activity(SetStarted)]
837
1232
  pub async fn set_started(ctx: &ActivityCtx, input: &SetStartedInput) -> Result<()> {
838
1233
  let mut state = ctx.state::<State>()?;
1234
+ let now = util::timestamp::now();
839
1235
 
840
1236
  if state.start_ts.is_none() {
841
- state.start_ts = Some(util::timestamp::now());
1237
+ state.start_ts = Some(now);
842
1238
  }
843
- state.connectable_ts = Some(util::timestamp::now());
1239
+ state.connectable_ts = Some(now);
844
1240
 
845
1241
  ctx.udb()?
846
1242
  .run(|tx| async move {
1243
+ let tx = tx.with_subspace(keys::subspace());
1244
+
847
1245
  let connectable_key = keys::actor::ConnectableKey::new(input.actor_id);
848
1246
  tx.set(
849
1247
  &keys::subspace().pack(&connectable_key),
@@ -866,9 +1264,9 @@ pub struct SetSleepingInput {
866
1264
  #[activity(SetSleeping)]
867
1265
  pub async fn set_sleeping(ctx: &ActivityCtx, input: &SetSleepingInput) -> Result<()> {
868
1266
  let mut state = ctx.state::<State>()?;
869
- let sleep_ts = util::timestamp::now();
1267
+ let now = util::timestamp::now();
870
1268
 
871
- state.sleep_ts = Some(sleep_ts);
1269
+ state.sleep_ts = Some(now);
872
1270
  state.connectable_ts = None;
873
1271
 
874
1272
  ctx.udb()?
@@ -877,8 +1275,7 @@ pub async fn set_sleeping(ctx: &ActivityCtx, input: &SetSleepingInput) -> Result
877
1275
 
878
1276
  // Make not connectable
879
1277
  tx.delete(&keys::actor::ConnectableKey::new(input.actor_id));
880
-
881
- tx.write(&keys::actor::SleepTsKey::new(input.actor_id), sleep_ts)?;
1278
+ tx.write(&keys::actor::SleepTsKey::new(input.actor_id), now)?;
882
1279
 
883
1280
  Ok(())
884
1281
  })
@@ -907,3 +1304,179 @@ fn reschedule_backoff(
907
1304
  ) -> util::backoff::Backoff {
908
1305
  util::backoff::Backoff::new_at(max_exponent, None, base_retry_timeout, 500, retry_count)
909
1306
  }
1307
+
1308
+ #[derive(Debug, Serialize, Deserialize, Hash)]
1309
+ pub struct InsertAndSendCommandsInput {
1310
+ pub actor_id: Id,
1311
+ pub generation: u32,
1312
+ pub runner_id: Id,
1313
+ pub commands: Vec<protocol::mk2::Command>,
1314
+ }
1315
+
1316
+ #[activity(InsertAndSendCommands)]
1317
+ pub async fn insert_and_send_commands(
1318
+ ctx: &ActivityCtx,
1319
+ input: &InsertAndSendCommandsInput,
1320
+ ) -> Result<()> {
1321
+ let mut state = ctx.state::<State>()?;
1322
+
1323
+ let runner_state = state.runner_state.get_or_insert_default();
1324
+ let old_last_command_idx = runner_state.last_command_idx;
1325
+ runner_state.last_command_idx += input.commands.len() as i64;
1326
+
1327
+ // This does not have to be part of its own activity because the txn is idempotent
1328
+ let last_command_idx = runner_state.last_command_idx;
1329
+ ctx.udb()?
1330
+ .run(|tx| async move {
1331
+ let tx = tx.with_subspace(keys::subspace());
1332
+
1333
+ tx.write(
1334
+ &keys::runner::ActorLastCommandIdxKey::new(
1335
+ input.runner_id,
1336
+ input.actor_id,
1337
+ input.generation,
1338
+ ),
1339
+ last_command_idx,
1340
+ )?;
1341
+
1342
+ for (i, command) in input.commands.iter().enumerate() {
1343
+ tx.write(
1344
+ &keys::runner::ActorCommandKey::new(
1345
+ input.runner_id,
1346
+ input.actor_id,
1347
+ input.generation,
1348
+ old_last_command_idx + i as i64 + 1,
1349
+ ),
1350
+ match command {
1351
+ protocol::mk2::Command::CommandStartActor(x) => {
1352
+ protocol::mk2::ActorCommandKeyData::CommandStartActor(x.clone())
1353
+ }
1354
+ protocol::mk2::Command::CommandStopActor => {
1355
+ protocol::mk2::ActorCommandKeyData::CommandStopActor
1356
+ }
1357
+ },
1358
+ )?;
1359
+ }
1360
+
1361
+ Ok(())
1362
+ })
1363
+ .await?;
1364
+
1365
+ let receiver_subject =
1366
+ crate::pubsub_subjects::RunnerReceiverSubject::new(input.runner_id).to_string();
1367
+
1368
+ let message_serialized =
1369
+ versioned::ToRunnerMk2::wrap_latest(protocol::mk2::ToRunner::ToClientCommands(
1370
+ input
1371
+ .commands
1372
+ .iter()
1373
+ .enumerate()
1374
+ .map(|(i, command)| protocol::mk2::CommandWrapper {
1375
+ checkpoint: protocol::mk2::ActorCheckpoint {
1376
+ actor_id: input.actor_id.to_string(),
1377
+ generation: input.generation,
1378
+ index: old_last_command_idx + i as i64 + 1,
1379
+ },
1380
+ inner: command.clone(),
1381
+ })
1382
+ .collect(),
1383
+ ))
1384
+ .serialize_with_embedded_version(PROTOCOL_MK2_VERSION)?;
1385
+
1386
+ ctx.ups()?
1387
+ .publish(&receiver_subject, &message_serialized, PublishOpts::one())
1388
+ .await?;
1389
+
1390
+ Ok(())
1391
+ }
1392
+
1393
+ #[derive(Debug, Serialize, Deserialize, Hash)]
1394
+ pub struct SendMessagesToRunnerInput {
1395
+ pub runner_id: Id,
1396
+ pub messages: Vec<protocol::mk2::ToRunner>,
1397
+ }
1398
+
1399
+ #[activity(SendMessagesToRunner)]
1400
+ pub async fn send_messages_to_runner(
1401
+ ctx: &ActivityCtx,
1402
+ input: &SendMessagesToRunnerInput,
1403
+ ) -> Result<()> {
1404
+ let receiver_subject =
1405
+ crate::pubsub_subjects::RunnerReceiverSubject::new(input.runner_id).to_string();
1406
+
1407
+ for message in &input.messages {
1408
+ let message_serialized = versioned::ToRunnerMk2::wrap_latest(message.clone())
1409
+ .serialize_with_embedded_version(PROTOCOL_MK2_VERSION)?;
1410
+
1411
+ ctx.ups()?
1412
+ .publish(&receiver_subject, &message_serialized, PublishOpts::one())
1413
+ .await?;
1414
+ }
1415
+
1416
+ Ok(())
1417
+ }
1418
+
1419
+ #[derive(Debug, Serialize, Deserialize, Hash)]
1420
+ pub struct CheckRunnersStubInput {}
1421
+
1422
+ #[activity(CheckRunnersStub)]
1423
+ pub async fn check_runners(ctx: &ActivityCtx, input: &CheckRunnersStubInput) -> Result<()> {
1424
+ unreachable!();
1425
+ }
1426
+
1427
+ #[derive(Debug, Serialize, Deserialize, Hash)]
1428
+ pub struct SetFailureReasonInput {
1429
+ pub failure_reason: FailureReason,
1430
+ }
1431
+
1432
+ /// Sets the failure reason on the actor workflow state.
1433
+ #[activity(SetFailureReason)]
1434
+ pub async fn set_failure_reason(ctx: &ActivityCtx, input: &SetFailureReasonInput) -> Result<()> {
1435
+ let mut state = ctx.state::<State>()?;
1436
+
1437
+ // Runner-related errors are never overwritten, as they represent the root cause of the failure
1438
+ // and should not be masked by subsequent errors like `Crashed`.
1439
+ if let Some(existing) = &state.failure_reason
1440
+ && existing.is_runner_failure()
1441
+ {
1442
+ tracing::debug!(
1443
+ ?existing,
1444
+ new=?input.failure_reason,
1445
+ "preserving existing runner failure error"
1446
+ );
1447
+ return Ok(());
1448
+ }
1449
+
1450
+ state.failure_reason = Some(input.failure_reason.clone());
1451
+ Ok(())
1452
+ }
1453
+
1454
+ #[derive(Debug, Serialize, Deserialize, Hash)]
1455
+ pub struct RecordEventMetricsInput {
1456
+ pub namespace_id: Id,
1457
+ pub name: String,
1458
+ pub alarms_set: usize,
1459
+ }
1460
+
1461
+ #[activity(RecordEventMetrics)]
1462
+ pub async fn record_event_metrics(
1463
+ ctx: &ActivityCtx,
1464
+ input: &RecordEventMetricsInput,
1465
+ ) -> Result<()> {
1466
+ ctx.udb()?
1467
+ .run(|tx| async move {
1468
+ let tx = tx.with_subspace(keys::subspace());
1469
+
1470
+ namespace::keys::metric::inc(
1471
+ &tx.with_subspace(namespace::keys::subspace()),
1472
+ input.namespace_id,
1473
+ namespace::keys::metric::Metric::AlarmsSet(input.name.clone()),
1474
+ input.alarms_set as i64,
1475
+ );
1476
+
1477
+ Ok(())
1478
+ })
1479
+ .await?;
1480
+
1481
+ Ok(())
1482
+ }