@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,139 +1,32 @@
1
- use anyhow::*;
2
- use epoxy_protocol::protocol;
3
- use futures_util::{FutureExt, TryStreamExt};
1
+ use anyhow::{Context, Result};
2
+ use epoxy_protocol::protocol::{self, ReplicaId};
4
3
  use gas::prelude::*;
5
4
  use rivet_api_builder::ApiCtx;
6
5
  use serde::{Deserialize, Serialize};
7
- use std::collections::{HashMap, VecDeque};
8
- use universaldb::prelude::*;
9
- use universaldb::{KeySelector, RangeOption, options::StreamingMode};
10
-
11
- use crate::types;
12
-
13
- // IMPORTANT: Do not use `read_cluster_config`. Instead, use the config provided by
14
- // `BeginLearning`. This is because the value of `read_cluster_config` may change between
15
- // activities which can cause the learning process to enter an invalid state.
16
6
 
17
7
  #[tracing::instrument(skip_all)]
18
8
  pub async fn setup_replica(ctx: &mut WorkflowCtx, _input: &super::Input) -> Result<()> {
19
- // Wait for coordinator to send begin learning signal
20
- let begin_learning = ctx.listen::<super::BeginLearning>().await?;
21
-
22
- // TODO: Paralellize replicas
23
- let total_replicas = begin_learning.config.replicas.len();
24
- let mut replica_index = 0;
25
-
26
- for replica in begin_learning.config.replicas.iter().cloned() {
27
- // Skip downloading from ourselves
28
- if replica.replica_id == ctx.config().epoxy_replica_id() {
29
- continue;
30
- }
31
-
32
- replica_index += 1;
33
-
34
- #[derive(Serialize, Deserialize)]
35
- struct State {
36
- after_instance: Option<types::Instance>,
37
- /// Total downloaded instances so far.
38
- total_downloaded_instances: u64,
39
- }
40
-
41
- // TODO: This should parallelize downloading chunks
42
- // Track download progress in case downloads fail
43
- ctx.loope(
44
- State {
45
- after_instance: None,
46
- total_downloaded_instances: 0,
47
- },
48
- |ctx, state| {
49
- let learning_config = begin_learning.config.clone();
50
- let replica = replica.clone();
51
- let replica_index = replica_index;
52
- let total_replicas = total_replicas;
53
- async move {
54
- // Download chunk of instances and save them
55
- let output = ctx
56
- .activity(DownloadInstancesChunkInput {
57
- learning_config,
58
- from_replica_id: replica.replica_id,
59
- after_instance: state.after_instance.clone(),
60
- total_downloaded_instances: state.total_downloaded_instances,
61
- count: crate::consts::DOWNLOAD_INSTANCE_COUNT,
62
- replica_index,
63
- total_replicas,
64
- })
65
- .await?;
66
-
67
- // Update after_instance for next iteration if we have a last instance
68
- if let Some(last_instance) = output.last_instance {
69
- state.after_instance = Some(last_instance);
70
- state.total_downloaded_instances += 1;
71
- } else {
72
- // No more instances
73
- return Ok(Loop::Break(()));
74
- }
75
-
76
- Ok(Loop::<()>::Continue)
77
- }
78
- .boxed()
79
- },
80
- )
81
- .await?;
82
- }
83
-
84
- #[derive(Serialize, Deserialize)]
85
- struct RecoverState {
86
- after_key: Option<Vec<u8>>,
87
- incomplete_key_range_start: Option<Vec<u8>>,
88
- total_recovered_keys: u64,
89
- }
90
-
91
- ctx.loope(
92
- RecoverState {
93
- after_key: None,
94
- incomplete_key_range_start: None,
95
- total_recovered_keys: 0,
96
- },
97
- |ctx, state| {
98
- let learning_config = begin_learning.config.clone();
99
- async move {
100
- // Recover chunk of keys
101
- let output = ctx
102
- .activity(RecoverKeysChunkInput {
103
- learning_config,
104
- after_key: state.after_key.clone(),
105
- incomplete_key_range_start: state.incomplete_key_range_start.clone(),
106
- count: crate::consts::RECOVER_KEY_CHUNK_SIZE,
107
- total_recovered_keys: state.total_recovered_keys,
108
- })
109
- .await?;
110
-
111
- // Update state for next iteration
112
- // Store incomplete_key_range_start for next iteration if present
113
- state.incomplete_key_range_start = output.incomplete_key_range_start.clone();
9
+ // Block until the coordinator sends BeginLearning. On fresh clusters with no
10
+ // data to catch up the signal still arrives so the replica transitions to active.
11
+ let sig = ctx.listen::<super::BeginLearning>().await?;
12
+ begin_learning(ctx, &sig).await?;
114
13
 
115
- if let Some(last_key) = output.last_key {
116
- state.after_key = Some(last_key);
117
- state.total_recovered_keys += output.recovered_count;
118
- } else {
119
- // No more keys to recover
120
- tracing::debug!(
121
- total_recovered_keys = state.total_recovered_keys,
122
- "finished recovering keys"
123
- );
124
- return Ok(Loop::Break(()));
125
- }
14
+ Ok(())
15
+ }
126
16
 
127
- Ok(Loop::<()>::Continue)
128
- }
129
- .boxed()
130
- },
131
- )
17
+ #[tracing::instrument(skip_all, fields(replica_id = %ctx.config().epoxy_replica_id()))]
18
+ pub async fn begin_learning(ctx: &mut WorkflowCtx, signal: &super::BeginLearning) -> Result<()> {
19
+ ctx.activity(StoreConfigInput {
20
+ config: signal.config.clone(),
21
+ })
132
22
  .await?;
133
-
134
- // Notify coordinator that we're now active
135
- ctx.activity(NotifyActiveInput {
136
- learning_config: begin_learning.config.clone(),
23
+ ctx.activity(CatchUpReplicaInput {
24
+ config: signal.config.clone(),
25
+ })
26
+ .await?;
27
+ ctx.activity(NotifyCoordinatorReplicaStatusInput {
28
+ config: signal.config.clone(),
29
+ status: crate::types::ReplicaStatus::Active,
137
30
  })
138
31
  .await?;
139
32
 
@@ -141,683 +34,149 @@ pub async fn setup_replica(ctx: &mut WorkflowCtx, _input: &super::Input) -> Resu
141
34
  }
142
35
 
143
36
  #[derive(Debug, Clone, Serialize, Deserialize, Hash)]
144
- pub struct DownloadInstancesChunkInput {
145
- /// Config received from BeginLearning
146
- pub learning_config: types::ClusterConfig,
147
- pub from_replica_id: protocol::ReplicaId,
148
- pub after_instance: Option<types::Instance>,
149
- pub count: u64,
150
- pub replica_index: usize,
151
- pub total_replicas: usize,
152
- pub total_downloaded_instances: u64,
153
- }
154
-
155
- #[derive(Debug, Clone, Serialize, Deserialize)]
156
- pub struct DownloadInstancesChunkOutput {
157
- /// The last instance in the downloaded chunk.
158
- ///
159
- /// Used for pagination.
160
- ///
161
- /// If none, will assume there are no more chunks and stop downloading.
162
- pub last_instance: Option<types::Instance>,
163
- }
164
-
165
- #[activity(DownloadInstancesChunk)]
166
- #[timeout = 300]
167
- #[max_retries = 100]
168
- pub async fn download_instances_chunk(
169
- ctx: &ActivityCtx,
170
- input: &DownloadInstancesChunkInput,
171
- ) -> Result<DownloadInstancesChunkOutput> {
172
- let config = &input.learning_config;
173
- let proto_config: protocol::ClusterConfig = input.learning_config.clone().into();
174
-
175
- tracing::debug!(
176
- from_replica_id = ?input.from_replica_id,
177
- replica_progress = format!("{}/{}", input.replica_index, input.total_replicas - 1), // -1 to exclude self
178
- total_downloaded_instances = input.total_downloaded_instances,
179
- after_instance = ?input.after_instance,
180
- count = input.count,
181
- "downloading instances chunk"
182
- );
183
-
184
- // Send download request to replica
185
- let request = protocol::Request {
186
- from_replica_id: config.coordinator_replica_id,
187
- to_replica_id: input.from_replica_id,
188
- kind: protocol::RequestKind::DownloadInstancesRequest(protocol::DownloadInstancesRequest {
189
- after_instance: input.after_instance.clone().map(Into::into),
190
- count: input.count,
191
- }),
192
- };
193
-
194
- let response =
195
- crate::http_client::send_message(&ApiCtx::new_from_activity(&ctx)?, &proto_config, request)
196
- .await?;
197
-
198
- // Extract instances from response
199
- let protocol::ResponseKind::DownloadInstancesResponse(download_response) = response.kind else {
200
- bail!("unexpected response type for download instances request");
201
- };
202
- let instances = download_response.instances;
203
-
204
- tracing::debug!(instance_count = instances.len(), "received instances");
205
-
206
- // Apply each log entry from the downloaded instances
207
- let total_entries = instances.len();
208
- let mut applied_count = 0;
209
- let mut skipped_count = 0;
210
- for (idx, entry) in instances.iter().enumerate() {
211
- tracing::debug!(
212
- progress = format!("{}/{}", idx + 1, total_entries),
213
- ?entry.instance,
214
- state = ?entry.log_entry.state,
215
- "applying log entry"
216
- );
217
-
218
- // Apply the log entry to replay any uncommitted operations
219
- // Skip entries that fail to apply (e.g., ballot validation failures during recovery)
220
- if let Err(err) = apply_log_entry(ctx, &entry.log_entry, &entry.instance).await {
221
- tracing::debug!(
222
- ?err,
223
- ?entry.instance,
224
- state = ?entry.log_entry.state,
225
- "skipping log entry that failed to apply during recovery"
226
- );
227
- skipped_count += 1;
228
- continue;
229
- }
230
- applied_count += 1;
231
- }
232
-
233
- tracing::debug!(
234
- total_entries,
235
- applied_count,
236
- skipped_count,
237
- "finished applying log entries for chunk"
238
- );
239
-
240
- // Return whether we should continue downloading chunks and the last instance
241
- Ok(DownloadInstancesChunkOutput {
242
- last_instance: instances.last().map(|entry| entry.instance.clone().into()),
243
- })
37
+ pub struct StoreConfigInput {
38
+ pub config: crate::types::ClusterConfig,
244
39
  }
245
40
 
246
- /// Save log entry to UDB & call the appropriate message handler.
247
- ///
248
- /// This function is idempotent since message handlers are executed in the same UDB transaction
249
- /// that the log entry is saved at. If the download or another message handler fails, it's safe to
250
- /// re-execute this.
251
- ///
252
- /// This function does NOT commit values to the KV store, even for committed instances.
253
- /// We only save the log entries and update instance states. The actual KV values are recovered
254
- /// later in the `recover_keys_chunk` phase. This is because:
255
- ///
256
- /// 1. During download, we receive instances in chunks and may not have all dependencies yet
257
- /// 2. To determine the correct final value, we need to analyze ALL instances and their dependencies
258
- /// 4. Only "leaf" instances (those not depended upon by other commits) with the highest sequence
259
- /// number should have their values applied to KV
260
- ///
261
- /// If we committed values during this phase, we might incorrectly apply an older value when
262
- /// a newer one exists but hasn't been downloaded yet, or apply a value that should be superseded
263
- /// by another concurrent operation.
264
- #[tracing::instrument(skip_all)]
265
- async fn apply_log_entry(
266
- ctx: &ActivityCtx,
267
- log_entry: &protocol::LogEntry,
268
- instance: &protocol::Instance,
269
- ) -> Result<()> {
41
+ #[activity(StoreConfig)]
42
+ pub async fn store_config(ctx: &ActivityCtx, input: &StoreConfigInput) -> Result<()> {
270
43
  let replica_id = ctx.config().epoxy_replica_id();
44
+ let update_req = protocol::UpdateConfigRequest {
45
+ config: input.config.clone().into(),
46
+ };
271
47
 
272
- tracing::debug!(
273
- ?instance,
274
- ?log_entry.state,
275
- "replaying log entry"
276
- );
277
-
278
- // Replay the log entry
279
48
  ctx.udb()?
280
49
  .run(|tx| {
281
- let log_entry = log_entry.clone();
282
- let instance = instance.clone();
283
-
284
- async move {
285
- let subspace = crate::keys::subspace(replica_id);
286
- let log_key =
287
- crate::keys::replica::LogEntryKey::new(instance.replica_id, instance.slot_id);
288
- let packed_key = subspace.pack(&log_key);
289
-
290
- // Read existing entry to determine if we need to replay this log entry
291
- if let Some(bytes) = tx.get(&packed_key, Serializable).await? {
292
- let existing = log_key.deserialize(&bytes)?;
293
-
294
- let existing_order = crate::replica::log::state_order(&existing.state);
295
- let new_order = crate::replica::log::state_order(&log_entry.state);
296
-
297
- if existing_order >= new_order {
298
- tracing::debug!(
299
- ?instance,
300
- ?existing.state,
301
- "existing log entry has a higher state order, will not replay log entry"
302
- );
303
- return Result::Ok(());
304
- }
305
- }
306
-
307
- // Replay request
308
- let payload = protocol::Payload {
309
- proposal: protocol::Proposal {
310
- commands: log_entry.commands,
311
- },
312
- seq: log_entry.seq,
313
- deps: log_entry.deps,
314
- instance,
315
- };
316
- match log_entry.state {
317
- protocol::State::PreAccepted => {
318
- let request = protocol::PreAcceptRequest { payload };
319
- crate::replica::messages::pre_accept(&*tx, replica_id, request).await?;
320
- }
321
- protocol::State::Accepted => {
322
- let request = protocol::AcceptRequest { payload };
323
- crate::replica::messages::accept(&*tx, replica_id, request).await?;
324
- }
325
- protocol::State::Committed => {
326
- let request = protocol::CommitRequest { payload };
327
- crate::replica::messages::commit(&*tx, replica_id, request, false).await?;
328
- }
329
- }
330
-
331
- Result::Ok(())
332
- }
50
+ let update_req = update_req.clone();
51
+ async move { crate::replica::update_config::update_config(&*tx, replica_id, update_req) }
333
52
  })
334
- .custom_instrument(tracing::info_span!("apply_log_entry_tx"))
53
+ .custom_instrument(tracing::info_span!("store_replica_config_tx"))
335
54
  .await?;
336
55
 
337
- tracing::debug!(
338
- ?instance,
339
- ?log_entry.state,
340
- "successfully replayed log entry"
341
- );
342
-
343
56
  Ok(())
344
57
  }
345
58
 
346
59
  #[derive(Debug, Clone, Serialize, Deserialize, Hash)]
347
- pub struct RecoverKeysChunkInput {
348
- /// Config received from BeginLearning
349
- pub learning_config: types::ClusterConfig,
350
- /// The last key value from the previous chunk, used for pagination
351
- pub after_key: Option<Vec<u8>>,
352
- /// A key that wasn't fully processed in the previous chunk due to too many instances.
353
- /// When set, the range will start FROM this key instead of skipping past after_key.
354
- pub incomplete_key_range_start: Option<Vec<u8>>,
355
- pub count: u64,
356
- pub total_recovered_keys: u64,
60
+ pub struct CatchUpReplicaInput {
61
+ pub config: crate::types::ClusterConfig,
357
62
  }
358
63
 
359
- #[derive(Debug, Clone, Serialize, Deserialize)]
360
- pub struct RecoverKeysChunkOutput {
361
- /// The last key value that was recovered in this chunk.
362
- ///
363
- /// Used for pagination to skip past all instances of this key in the next iteration.
364
- ///
365
- /// If none, will assume there are no more keys and stop recovering.
366
- pub last_key: Option<Vec<u8>>,
367
- /// Number of keys recovered in this chunk
368
- pub recovered_count: u64,
369
- /// If set, indicates we didn't finish this chunk due to encountering a key with too many instances.
370
- ///
371
- /// The next iteration should start FROM this key instead of skipping past last_key.
372
- pub incomplete_key_range_start: Option<Vec<u8>>,
373
- }
374
-
375
- /// Recovers committed values for a chunk of keys after downloading all log entries.
376
- ///
377
- /// This is necessary because during the download phase (`apply_log_entry`), we only
378
- /// downloaded and stored log entries without committing values to KV. We need this
379
- /// separate recovery phase to analyze all dependencies and determine the correct final
380
- /// values.
381
- ///
382
- /// The function uses a single-pass scan through the KeyInstance subspace, collecting all
383
- /// instances for each key as it iterates. When it encounters a new key (different from
384
- /// the current one being collected), it immediately processes the previous key's instances
385
- /// and then starts collecting for the new key. This approach avoids redundant database
386
- /// scans compared to the previous implementation that would first identify unique keys
387
- /// then re-scan for each key's instances.
388
- #[activity(RecoverKeysChunk)]
389
- pub async fn recover_keys_chunk(
390
- ctx: &ActivityCtx,
391
- input: &RecoverKeysChunkInput,
392
- ) -> Result<RecoverKeysChunkOutput> {
64
+ #[activity(CatchUpReplica)]
65
+ pub async fn catch_up_replica(ctx: &ActivityCtx, input: &CatchUpReplicaInput) -> Result<()> {
393
66
  let replica_id = ctx.config().epoxy_replica_id();
394
-
395
- tracing::debug!(
396
- ?replica_id,
397
- total_recovered_keys = input.total_recovered_keys,
398
- after_key_len = input.after_key.as_ref().map(|k| k.len()),
399
- count = input.count,
400
- "recovering keys chunk"
401
- );
402
-
403
- let (last_key, recovered_count, incomplete_key_range_start) = ctx
404
- .udb()?
405
- .run(|tx| {
406
- let after_key = input.after_key.clone();
407
- let incomplete_key_range_start = input.incomplete_key_range_start.clone();
408
- let count = input.count;
409
-
410
- async move {
411
- let subspace = crate::keys::subspace(replica_id);
412
-
413
- // Build the key instance prefix to scan
414
- let key_instance_all =
415
- crate::keys::replica::KeyInstanceKey::subspace_for_all_keys();
416
- let prefix = subspace.pack(&key_instance_all);
417
-
418
- // Build range start key
419
- let begin_key =
420
- if let Some(incomplete_key_range_start) = &incomplete_key_range_start {
421
- // Start FROM this incomplete key (don't skip past it)
422
- let key_instance_subspace = crate::keys::replica::KeyInstanceKey::subspace(
423
- incomplete_key_range_start.clone(),
424
- );
425
- let key_start = subspace.pack(&key_instance_subspace);
426
- KeySelector::first_greater_or_equal(key_start)
427
- } else if let Some(after_key) = &after_key {
428
- // Skip past all KeyInstance entries for the last processed key
429
- let key_instance_subspace =
430
- crate::keys::replica::KeyInstanceKey::subspace(after_key.clone());
431
- let mut key_after_all_instances = subspace.pack(&key_instance_subspace);
432
- // Append 0xFF to get past all instances for this key
433
- key_after_all_instances.push(0xFF);
434
- KeySelector::first_greater_or_equal(key_after_all_instances)
435
- } else {
436
- KeySelector::first_greater_or_equal(prefix.clone())
437
- };
438
-
439
- // Build range end key - after all KEY_INSTANCE entries
440
- let mut end_prefix = prefix.clone();
441
- end_prefix.push(0xFF);
442
- let end_key = KeySelector::first_greater_or_equal(end_prefix);
443
-
444
- // Scan for key instances
445
- let range_option = RangeOption {
446
- begin: begin_key,
447
- end: end_key,
448
- limit: Some(count as usize),
449
- mode: StreamingMode::WantAll,
450
- ..Default::default()
451
- };
452
-
453
- let mut stream = tx.get_ranges_keyvalues(range_option, Serializable);
454
-
455
- // Iterate over stream and aggregate data for each key
456
- let mut current_key: Option<Vec<u8>> = None;
457
- let mut current_instances: Vec<(protocol::ReplicaId, protocol::SlotId)> =
458
- Vec::new();
459
- let mut recovered_count = 0u64;
460
- let mut last_processed_key = None;
461
- let mut scanned_count = 0u64;
462
-
463
- while let Some(kv) = stream.try_next().await? {
464
- scanned_count += 1;
465
-
466
- // Parse the key instance entry to extract the key and instance info
467
- let key_instance =
468
- subspace.unpack::<crate::keys::replica::KeyInstanceKey>(kv.key())?;
469
- let key = key_instance.key;
470
- let instance = (
471
- key_instance.instance_replica_id,
472
- key_instance.instance_slot_id,
473
- );
474
-
475
- // Check if this is a new key
476
- if let Some(ref cur_key) = current_key {
477
- if cur_key != &key {
478
- // We've hit a different key - process the current one
479
- recover_key_value_with_instances(
480
- &*tx,
481
- replica_id,
482
- cur_key,
483
- &current_instances,
484
- )
485
- .await?;
486
- last_processed_key = Some(cur_key.clone());
487
- recovered_count += 1;
488
-
489
- // Start collecting for the new key
490
- current_key = Some(key);
491
- current_instances = vec![instance];
492
- } else {
493
- // Same key, add to instances
494
- current_instances.push(instance);
495
- }
496
- } else {
497
- // First key
498
- current_key = Some(key);
499
- current_instances = vec![instance];
500
- }
501
- }
502
-
503
- // Handle the last key if we haven't exceeded our limit
504
- // If scanned_count < count, we've reached the end of the subspace
505
- if let Some(ref key) = current_key {
506
- if scanned_count < count {
507
- // We've reached the end of the range, process the last key
508
- recover_key_value_with_instances(&*tx, replica_id, key, &current_instances)
509
- .await?;
510
- recovered_count += 1;
511
- // No more keys to process
512
- last_processed_key = None;
513
- } else {
514
- // We hit the limit before finishing this key
515
- // Don't update last_processed_key - we want to continue from the last
516
- // successfully processed key so this unprocessed key will be found again
517
- // in the next iteration
518
- }
519
- }
520
-
521
- // If no keys were processed despite scanning {count} instances,
522
- // it means a single key has too many instances (i.e. larger than
523
- // the range limit). Return incomplete_key_range_start so the workflow can retry from this position.
524
- let incomplete_key_range_start = if recovered_count == 0 && scanned_count >= count {
525
- tracing::warn!(
526
- ?replica_id,
527
- ?current_key,
528
- scanned_count,
529
- count,
530
- "encountered key with more than {count} instances, will retry from this position"
531
- );
532
- current_key
533
- } else {
534
- None
535
- };
536
-
537
- tracing::debug!(
538
- ?replica_id,
539
- recovered_count,
540
- scanned_count,
541
- ?incomplete_key_range_start,
542
- "recovered keys in chunk"
543
- );
544
-
545
- // Return the last key value for pagination
546
- Result::Ok((
547
- last_processed_key,
548
- recovered_count,
549
- incomplete_key_range_start,
550
- ))
551
- }
552
- })
553
- .custom_instrument(tracing::info_span!("recover_keys_chunk_tx"))
554
- .await?;
555
-
556
- Ok(RecoverKeysChunkOutput {
557
- last_key,
558
- recovered_count,
559
- incomplete_key_range_start,
560
- })
561
- }
562
-
563
- /// Performs topological sort on committed entries based on their dependencies using
564
- /// Kahn's algorithm (BFS-based).
565
- ///
566
- /// This approach is chosen because:
567
- /// - It naturally detects cycles (which would indicate data corruption in EPaxos)
568
- /// - It handles partial dependency graphs well (not all deps may be in our filtered set)
569
- /// - It processes entries level-by-level in intuitive execution order
570
- /// - The queue-based implementation is clear and maintainable
571
- ///
572
- /// Returns entries in topological order where dependencies come before dependents.
573
- /// If a cycle is detected, returns an error.
574
- fn topological_sort_entries(
575
- entries: &[CommittedEntry],
576
- ) -> Result<Vec<&CommittedEntry>, anyhow::Error> {
577
- if entries.is_empty() {
578
- return Ok(Vec::new());
579
- }
580
-
581
- // Build a map for quick lookup
582
- let entry_map: HashMap<(protocol::ReplicaId, protocol::SlotId), &CommittedEntry> =
583
- entries.iter().map(|e| (e.instance, e)).collect();
584
-
585
- // Initialize in-degree map and adjacency list
586
- let mut in_degree: HashMap<(protocol::ReplicaId, protocol::SlotId), usize> = HashMap::new();
587
- let mut adj_list: HashMap<
588
- (protocol::ReplicaId, protocol::SlotId),
589
- Vec<(protocol::ReplicaId, protocol::SlotId)>,
590
- > = HashMap::new();
591
-
592
- // Initialize all nodes with 0 in-degree
593
- for entry in entries {
594
- in_degree.insert(entry.instance, 0);
595
- adj_list.insert(entry.instance, Vec::new());
596
- }
597
-
598
- // Build dependency graph
599
- // Note: In EPaxos, if A depends on B, then B must be executed before A
600
- for entry in entries {
601
- for dep in &entry.deps {
602
- let dep_instance = (dep.replica_id, dep.slot_id);
603
- // Only count dependencies that are in our committed set
604
- if entry_map.contains_key(&dep_instance) {
605
- // dep_instance -> entry.instance (entry depends on dep_instance)
606
- adj_list
607
- .get_mut(&dep_instance)
608
- .unwrap()
609
- .push(entry.instance);
610
- *in_degree.get_mut(&entry.instance).unwrap() += 1;
611
- }
612
- }
613
- }
614
-
615
- // Find all nodes with no dependencies
616
- // Sort them by (replica_id, slot_id) to maintain consistent ordering
617
- // This ensures that when entries have no dependencies, they're applied
618
- // in the order they were created (by slot ID)
619
- let mut initial_nodes: Vec<(protocol::ReplicaId, protocol::SlotId)> = in_degree
67
+ let config: protocol::ClusterConfig = input.config.clone().into();
68
+ let api_ctx = ApiCtx::new_from_activity(ctx)?;
69
+ let source_replica_id = config
70
+ .replicas
620
71
  .iter()
621
- .filter(|(_, degree)| **degree == 0)
622
- .map(|(&instance, _)| instance)
623
- .collect();
624
- initial_nodes.sort(); // Sort by (replica_id, slot_id) tuple
625
- let mut queue: VecDeque<(protocol::ReplicaId, protocol::SlotId)> = initial_nodes.into();
626
-
627
- let mut sorted_order = Vec::new();
628
-
629
- // Process queue
630
- while let Some(current) = queue.pop_front() {
631
- // Add to sorted order
632
- if let Some(entry) = entry_map.get(&current) {
633
- sorted_order.push(*entry);
634
- }
635
-
636
- // Reduce in-degree for dependent nodes
637
- if let Some(dependents) = adj_list.get(&current) {
638
- // Collect newly ready nodes
639
- let mut newly_ready = Vec::new();
640
- for &dependent in dependents {
641
- let degree = in_degree.get_mut(&dependent).unwrap();
642
- *degree -= 1;
643
- if *degree == 0 {
644
- newly_ready.push(dependent);
645
- }
646
- }
647
- // Sort and add to queue to maintain consistent ordering
648
- newly_ready.sort();
649
- for node in newly_ready {
650
- queue.push_back(node);
651
- }
652
- }
653
- }
72
+ .find(|replica| {
73
+ replica.replica_id != replica_id
74
+ && matches!(replica.status, protocol::ReplicaStatus::Active)
75
+ })
76
+ .map(|replica| replica.replica_id);
654
77
 
655
- // Check for cycles
656
- if sorted_order.len() != entries.len() {
657
- return Err(anyhow!(
658
- "Cycle detected in dependency graph: sorted {} entries out of {}",
659
- sorted_order.len(),
660
- entries.len()
661
- ));
78
+ if source_replica_id.is_none() {
79
+ tracing::info!(
80
+ %replica_id,
81
+ "skipping changelog catch-up because the cluster has no active source replica yet"
82
+ );
83
+ return Ok(());
662
84
  }
85
+ let source_replica_id = source_replica_id.unwrap();
86
+
87
+ // Pre-cutover committed values are readable via local dual-read fallback immediately. They only
88
+ // become available to future learners after the background backfill populates the v2 changelog.
89
+ let mut after_versionstamp = None;
90
+ let mut applied_entries = 0usize;
91
+ loop {
92
+ let response = read_changelog_page(
93
+ &api_ctx,
94
+ &config,
95
+ replica_id,
96
+ source_replica_id,
97
+ after_versionstamp.clone(),
98
+ )
99
+ .await?;
663
100
 
664
- Ok(sorted_order)
665
- }
666
-
667
- /// Recovers the final committed value for a single key using pre-collected instances.
668
- ///
669
- /// This optimized version accepts instances that have already been collected during scanning,
670
- /// avoiding the need to re-scan the KeyInstance subspace.
671
- ///
672
- /// The recovery process:
673
- /// 1. Fetches log entries for all provided instances
674
- /// 2. Filters for only committed entries (ignoring pre-accepted or accepted states)
675
- /// 3. Sorts committed entries topologically based on their dependencies
676
- /// 4. Applies commands from each entry in dependency order
677
- ///
678
- /// The dependency-aware ordering is crucial: EPaxos allows concurrent operations, and
679
- /// some operations (like check-and-set) depend on seeing the correct previous values.
680
- /// By applying commands in topological order, we ensure that:
681
- /// - Dependencies are satisfied before dependent operations execute
682
- /// - Check-and-set operations see the correct state from previous set operations
683
- /// - The final state is consistent with the consensus protocol's ordering
684
- ///
685
- /// This is why we can't commit values during `apply_log_entry` - we need to see all
686
- /// instances and their dependencies first to correctly determine the execution order.
687
- #[tracing::instrument(skip_all)]
688
- async fn recover_key_value_with_instances(
689
- tx: &universaldb::Transaction,
690
- replica_id: protocol::ReplicaId,
691
- key: &[u8],
692
- instances: &[(protocol::ReplicaId, protocol::SlotId)],
693
- ) -> Result<()> {
694
- let subspace = crate::keys::subspace(replica_id);
695
-
696
- tracing::debug!(
697
- key_len = key.len(),
698
- instance_count = instances.len(),
699
- "fetching log entries for key recovery"
700
- );
701
-
702
- // Fetch log entries in parallel
703
- let mut committed_entries = Vec::new();
704
- for chunk in instances.chunks(32) {
705
- // Fetch log entries
706
- let mut batch_keys = Vec::with_capacity(chunk.len());
707
- let mut futures = Vec::with_capacity(batch_keys.len());
708
- for &(instance_replica_id, instance_slot_id) in chunk {
709
- let log_key =
710
- crate::keys::replica::LogEntryKey::new(instance_replica_id, instance_slot_id);
711
- let packed_key = subspace.pack(&log_key);
712
- futures.push(tx.get(&packed_key, Serializable));
713
- batch_keys.push((packed_key, log_key, instance_replica_id, instance_slot_id));
101
+ if response.entries.is_empty() {
102
+ break;
714
103
  }
715
- let batch_results = futures_util::future::try_join_all(futures).await?;
716
104
 
717
- // Process results with their corresponding metadata
718
- for (bytes, (_, log_key, instance_replica_id, instance_slot_id)) in
719
- batch_results.into_iter().zip(batch_keys.iter())
720
- {
721
- // Missing log entry indicates data corruption
722
- let bytes = bytes.with_context(|| {
723
- format!(
724
- "missing log entry for instance ({}, {}), data corruption detected",
725
- instance_replica_id, instance_slot_id
726
- )
727
- })?;
728
-
729
- // Collect committed entries
730
- let entry = log_key.deserialize(&bytes)?;
731
- if matches!(entry.state, protocol::State::Committed) {
732
- committed_entries.push(CommittedEntry {
733
- instance: (*instance_replica_id, *instance_slot_id),
734
- entry: entry.clone(),
735
- deps: entry.deps.clone(),
736
- });
737
- }
105
+ let page_entries = response.entries.len();
106
+ let last_versionstamp = response.last_versionstamp.clone();
107
+ for entry in response.entries {
108
+ ctx.udb()?
109
+ .run(|tx| {
110
+ let entry = entry.clone();
111
+ async move { crate::replica::changelog::apply_entry(&*tx, replica_id, entry).await }
112
+ })
113
+ .custom_instrument(tracing::info_span!("apply_changelog_entry_tx"))
114
+ .await?;
738
115
  }
739
- }
740
-
741
- if committed_entries.is_empty() {
742
- return Result::Ok(());
743
- }
744
116
 
745
- // Sort entries topologically to respect dependencies
746
- // This ensures that operations are applied in the correct order,
747
- // particularly important for dependent operations like check-and-set
748
- let sorted_entries = topological_sort_entries(&committed_entries)?;
749
- tracing::debug!(
750
- key_len = key.len(),
751
- sorted_count = sorted_entries.len(),
752
- "applying commands in dependency order"
753
- );
754
-
755
- // Apply commands from each entry in dependency order
756
- // This ensures that check-and-set operations see the correct previous values
757
- for entry in sorted_entries {
758
- // Filter commands relevant to this key
759
- let commands_for_key = entry
760
- .entry
761
- .commands
762
- .iter()
763
- .filter(|cmd| {
764
- crate::replica::utils::extract_key_from_command(&cmd).map_or(false, |k| k == key)
765
- })
766
- .cloned()
767
- .collect::<Vec<_>>();
768
-
769
- if !commands_for_key.is_empty() {
770
- tracing::trace!(
771
- instance = ?entry.instance,
772
- command_count = commands_for_key.len(),
773
- "applying commands from entry"
774
- );
117
+ applied_entries += page_entries;
118
+ tracing::info!(
119
+ %replica_id,
120
+ %source_replica_id,
121
+ applied_entries,
122
+ page_entries,
123
+ "applied changelog catch-up page"
124
+ );
775
125
 
776
- // Execute commands
777
- crate::replica::commit_kv::commit_kv(&*tx, replica_id, &commands_for_key).await?;
778
- }
126
+ after_versionstamp = Some(last_versionstamp);
779
127
  }
780
128
 
781
- Result::Ok(())
782
- }
783
-
784
- #[derive(Debug)]
785
- struct CommittedEntry {
786
- instance: (protocol::ReplicaId, protocol::SlotId),
787
- entry: protocol::LogEntry,
788
- // seq: u64, // Seq is u64 in protocol
789
- deps: Vec<protocol::Instance>,
129
+ Ok(())
790
130
  }
791
131
 
792
132
  #[derive(Debug, Clone, Serialize, Deserialize, Hash)]
793
- pub struct NotifyActiveInput {
794
- /// Config received from BeginLearning
795
- pub learning_config: types::ClusterConfig,
133
+ pub struct NotifyCoordinatorReplicaStatusInput {
134
+ pub config: crate::types::ClusterConfig,
135
+ pub status: crate::types::ReplicaStatus,
796
136
  }
797
137
 
798
- #[activity(NotifyActive)]
799
- #[max_retries = usize::MAX]
800
- pub async fn notify_active(ctx: &ActivityCtx, input: &NotifyActiveInput) -> Result<()> {
801
- let config = &input.learning_config;
802
- let proto_config: protocol::ClusterConfig = config.clone().into();
803
-
804
- tracing::debug!("notifying coordinator that replica is active");
805
-
806
- // Send status update to coordinator
807
- let request = protocol::Request {
808
- from_replica_id: ctx.config().epoxy_replica_id(),
809
- to_replica_id: config.coordinator_replica_id,
810
- kind: protocol::RequestKind::CoordinatorUpdateReplicaStatusRequest(
811
- protocol::CoordinatorUpdateReplicaStatusRequest {
812
- replica_id: ctx.config().epoxy_replica_id(),
813
- status: protocol::ReplicaStatus::Active,
814
- },
815
- ),
816
- };
138
+ #[activity(NotifyCoordinatorReplicaStatus)]
139
+ pub async fn notify_coordinator_replica_status(
140
+ ctx: &ActivityCtx,
141
+ input: &NotifyCoordinatorReplicaStatusInput,
142
+ ) -> Result<()> {
143
+ let config: protocol::ClusterConfig = input.config.clone().into();
144
+ let replica_id = ctx.config().epoxy_replica_id();
817
145
 
818
- crate::http_client::send_message(&ApiCtx::new_from_activity(&ctx)?, &proto_config, request)
819
- .await?;
146
+ crate::http_client::send_message(
147
+ &ApiCtx::new_from_activity(ctx)?,
148
+ &config,
149
+ protocol::Request {
150
+ from_replica_id: replica_id,
151
+ to_replica_id: config.coordinator_replica_id,
152
+ kind: protocol::RequestKind::CoordinatorUpdateReplicaStatusRequest(
153
+ protocol::CoordinatorUpdateReplicaStatusRequest {
154
+ replica_id,
155
+ status: input.status.clone().into(),
156
+ },
157
+ ),
158
+ },
159
+ )
160
+ .await?;
820
161
 
821
- tracing::debug!("notified coordinator of active status");
822
162
  Ok(())
823
163
  }
164
+
165
+ async fn read_changelog_page(
166
+ api_ctx: &ApiCtx,
167
+ config: &protocol::ClusterConfig,
168
+ from_replica_id: ReplicaId,
169
+ source_replica_id: ReplicaId,
170
+ after_versionstamp: Option<Vec<u8>>,
171
+ ) -> Result<protocol::ChangelogReadResponse> {
172
+ crate::http_client::read_changelog(
173
+ api_ctx,
174
+ config,
175
+ from_replica_id,
176
+ source_replica_id,
177
+ after_versionstamp,
178
+ crate::consts::CHANGELOG_READ_COUNT,
179
+ )
180
+ .await
181
+ .with_context(|| format!("failed reading changelog page from replica {source_replica_id}"))
182
+ }