@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.
- package/CLAUDE.md +38 -0
- package/artifacts/config-schema.json +1140 -0
- package/artifacts/errors/actor.kv_storage_quota_exceeded.json +5 -0
- package/artifacts/errors/actor.no_runner_config_configured.json +5 -0
- package/artifacts/errors/guard.actor_runner_failed.json +5 -0
- package/artifacts/errors/guard.invalid_request.json +5 -0
- package/artifacts/errors/guard.invalid_request_body.json +5 -0
- package/artifacts/errors/guard.invalid_response_body.json +5 -0
- package/artifacts/errors/guard.missing_query_parameter.json +5 -0
- package/artifacts/errors/guard.query_ambiguous_runner_configs.json +5 -0
- package/artifacts/errors/guard.query_duplicate_param.json +5 -0
- package/artifacts/errors/guard.query_empty_actor_name.json +5 -0
- package/artifacts/errors/guard.query_get_disallowed_params.json +5 -0
- package/artifacts/errors/guard.query_invalid_base64_input.json +5 -0
- package/artifacts/errors/guard.query_invalid_cbor_input.json +5 -0
- package/artifacts/errors/guard.query_invalid_params.json +5 -0
- package/artifacts/errors/guard.query_invalid_percent_encoding.json +5 -0
- package/artifacts/errors/guard.query_missing_runner_name.json +5 -0
- package/artifacts/errors/guard.query_no_runner_configs.json +5 -0
- package/artifacts/errors/guard.query_param_missing_equals.json +5 -0
- package/artifacts/errors/guard.query_path_token_syntax.json +5 -0
- package/artifacts/errors/guard.query_unknown_param.json +5 -0
- package/artifacts/errors/guard.request_body_too_large.json +5 -0
- package/artifacts/errors/guard.response_body_too_large.json +5 -0
- package/artifacts/errors/serverless_runner_pool.failed_to_fetch_metadata.json +5 -0
- package/artifacts/errors/serverless_runner_pool.not_found.json +5 -0
- package/artifacts/errors/{api.rate_limited.json → test.api_rate_limited.json} +2 -2
- package/artifacts/errors/{namespace.invalid_name.json → test.namespace_invalid_name.json} +2 -2
- package/artifacts/errors/ws.going_away.json +5 -0
- package/artifacts/openapi.json +458 -6
- package/docker/builder-base/linux-gnu.Dockerfile +21 -0
- package/docker/builder-base/linux-musl.Dockerfile +53 -0
- package/docker/builder-base/osxcross.Dockerfile +42 -0
- package/docker/builder-base/windows-mingw.Dockerfile +41 -0
- package/docker/builder-base/windows-msvc.Dockerfile +25 -0
- package/docker/dev/docker-compose.yml +43 -18
- package/docker/dev/grafana/dashboards/api.json +1077 -1239
- package/docker/dev/grafana/dashboards/cache.json +911 -1074
- package/docker/dev/grafana/dashboards/epoxy.json +1606 -0
- package/docker/dev/grafana/dashboards/futures.json +242 -229
- package/docker/dev/grafana/dashboards/gasoline.json +2663 -2476
- package/docker/dev/grafana/dashboards/guard.json +1433 -1273
- package/docker/dev/grafana/dashboards/operation.json +871 -0
- package/docker/dev/grafana/dashboards/pegboard.json +1274 -0
- package/docker/dev/grafana/dashboards/tokio.json +930 -1004
- package/docker/dev/grafana/dashboards/traces.json +35 -13
- package/docker/dev/grafana/provisioning/datasources/datasources.yaml +8 -0
- package/docker/{dev-multinode/otel-collector-server → dev/otel-collector}/config.yaml +18 -13
- package/docker/dev/prometheus/prometheus.yml +4 -0
- package/docker/dev/rivet-engine/config.jsonc +9 -16
- package/docker/dev-host/docker-compose.yml +38 -16
- package/docker/dev-host/grafana/dashboards/api.json +1077 -1239
- package/docker/dev-host/grafana/dashboards/cache.json +911 -1074
- package/docker/dev-host/grafana/dashboards/epoxy.json +1606 -0
- package/docker/dev-host/grafana/dashboards/futures.json +242 -229
- package/docker/dev-host/grafana/dashboards/gasoline.json +2663 -2476
- package/docker/dev-host/grafana/dashboards/guard.json +1433 -1273
- package/docker/dev-host/grafana/dashboards/operation.json +871 -0
- package/docker/dev-host/grafana/dashboards/pegboard.json +1274 -0
- package/docker/dev-host/grafana/dashboards/tokio.json +930 -1004
- package/docker/dev-host/grafana/dashboards/traces.json +35 -13
- package/docker/dev-host/grafana/provisioning/datasources/datasources.yaml +8 -0
- package/docker/dev-host/{otel-collector-server → otel-collector}/config.yaml +18 -13
- package/docker/dev-host/prometheus/prometheus.yml +4 -0
- package/docker/dev-host/rivet-engine/config.jsonc +9 -16
- package/docker/dev-multidc/core/grafana/dashboards/api.json +1077 -1239
- package/docker/dev-multidc/core/grafana/dashboards/cache.json +911 -1074
- package/docker/dev-multidc/core/grafana/dashboards/epoxy.json +1606 -0
- package/docker/dev-multidc/core/grafana/dashboards/futures.json +242 -229
- package/docker/dev-multidc/core/grafana/dashboards/gasoline.json +2663 -2476
- package/docker/dev-multidc/core/grafana/dashboards/guard.json +1433 -1273
- package/docker/dev-multidc/core/grafana/dashboards/operation.json +871 -0
- package/docker/dev-multidc/core/grafana/dashboards/pegboard.json +1274 -0
- package/docker/dev-multidc/core/grafana/dashboards/tokio.json +930 -1004
- package/docker/dev-multidc/core/grafana/dashboards/traces.json +35 -13
- package/docker/dev-multidc/core/grafana/provisioning/datasources/datasources.yaml +8 -0
- package/docker/dev-multidc/core/prometheus/prometheus.yml +4 -0
- package/docker/dev-multidc/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +18 -13
- package/docker/dev-multidc/datacenters/dc-a/rivet-engine/config.jsonc +23 -22
- package/docker/{dev-multidc-multinode/datacenters/dc-b/otel-collector-server → dev-multidc/datacenters/dc-b/otel-collector}/config.yaml +18 -13
- package/docker/dev-multidc/datacenters/dc-b/rivet-engine/config.jsonc +23 -22
- package/docker/dev-multidc/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +18 -13
- package/docker/dev-multidc/datacenters/dc-c/rivet-engine/config.jsonc +23 -22
- package/docker/dev-multidc/docker-compose.yml +71 -64
- package/docker/dev-multidc-multinode/core/grafana/dashboards/api.json +1077 -1239
- package/docker/dev-multidc-multinode/core/grafana/dashboards/cache.json +911 -1074
- package/docker/dev-multidc-multinode/core/grafana/dashboards/epoxy.json +1606 -0
- package/docker/dev-multidc-multinode/core/grafana/dashboards/futures.json +242 -229
- package/docker/dev-multidc-multinode/core/grafana/dashboards/gasoline.json +2663 -2476
- package/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json +1433 -1273
- package/docker/dev-multidc-multinode/core/grafana/dashboards/operation.json +871 -0
- package/docker/dev-multidc-multinode/core/grafana/dashboards/pegboard.json +1274 -0
- package/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json +930 -1004
- package/docker/dev-multidc-multinode/core/grafana/dashboards/traces.json +35 -13
- package/docker/dev-multidc-multinode/core/grafana/provisioning/datasources/datasources.yaml +8 -0
- package/docker/dev-multidc-multinode/core/prometheus/prometheus.yml +4 -0
- package/docker/dev-multidc-multinode/datacenters/dc-a/{otel-collector-server → otel-collector}/config.yaml +28 -13
- package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/0/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/1/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-a/rivet-engine/2/config.jsonc +23 -22
- package/docker/{dev-multidc/datacenters/dc-b/otel-collector-server → dev-multidc-multinode/datacenters/dc-b/otel-collector}/config.yaml +28 -13
- package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/0/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/1/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-b/rivet-engine/2/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-c/{otel-collector-server → otel-collector}/config.yaml +28 -13
- package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/0/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/1/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/datacenters/dc-c/rivet-engine/2/config.jsonc +23 -22
- package/docker/dev-multidc-multinode/docker-compose.yml +113 -88
- package/docker/dev-multinode/docker-compose.yml +57 -26
- package/docker/dev-multinode/grafana/dashboards/api.json +1077 -1239
- package/docker/dev-multinode/grafana/dashboards/cache.json +911 -1074
- package/docker/dev-multinode/grafana/dashboards/epoxy.json +1606 -0
- package/docker/dev-multinode/grafana/dashboards/futures.json +242 -229
- package/docker/dev-multinode/grafana/dashboards/gasoline.json +2663 -2476
- package/docker/dev-multinode/grafana/dashboards/guard.json +1433 -1273
- package/docker/dev-multinode/grafana/dashboards/operation.json +871 -0
- package/docker/dev-multinode/grafana/dashboards/pegboard.json +1274 -0
- package/docker/dev-multinode/grafana/dashboards/tokio.json +930 -1004
- package/docker/dev-multinode/grafana/dashboards/traces.json +35 -13
- package/docker/dev-multinode/grafana/provisioning/datasources/datasources.yaml +8 -0
- package/docker/{dev/otel-collector-server → dev-multinode/otel-collector}/config.yaml +28 -13
- package/docker/dev-multinode/prometheus/prometheus.yml +4 -0
- package/docker/dev-multinode/rivet-engine/0/config.jsonc +9 -16
- package/docker/dev-multinode/rivet-engine/1/config.jsonc +9 -16
- package/docker/dev-multinode/rivet-engine/2/config.jsonc +9 -16
- package/docker/engine/linux-aarch64.Dockerfile +9 -49
- package/docker/engine/linux-x86_64.Dockerfile +7 -57
- package/docker/engine/macos-aarch64.Dockerfile +8 -54
- package/docker/engine/macos-x86_64.Dockerfile +9 -55
- package/docker/engine/windows.Dockerfile +5 -53
- package/docker/template/grafana-dashboards/api.json +1077 -1239
- package/docker/template/grafana-dashboards/cache.json +911 -1074
- package/docker/template/grafana-dashboards/epoxy.json +1606 -0
- package/docker/template/grafana-dashboards/futures.json +242 -229
- package/docker/template/grafana-dashboards/gasoline.json +2663 -2476
- package/docker/template/grafana-dashboards/guard.json +1433 -1273
- package/docker/template/grafana-dashboards/operation.json +871 -0
- package/docker/template/grafana-dashboards/pegboard.json +1274 -0
- package/docker/template/grafana-dashboards/tokio.json +930 -1004
- package/docker/template/grafana-dashboards/traces.json +35 -13
- package/docker/template/node_modules/.bin/js-yaml +4 -4
- package/docker/template/node_modules/.bin/tsc +4 -4
- package/docker/template/node_modules/.bin/tsserver +4 -4
- package/docker/template/node_modules/.bin/tsx +4 -4
- package/docker/template/src/docker-compose.ts +42 -29
- package/docker/template/src/main.ts +4 -4
- package/docker/template/src/services/core/grafana.ts +14 -1
- package/docker/template/src/services/core/prometheus.ts +20 -0
- package/docker/template/src/services/edge/{otel-collector-server.ts → otel-collector.ts} +55 -24
- package/docker/template/src/services/edge/rivet-engine.ts +4 -16
- package/docker/template/src/services/edge/runner.ts +2 -3
- package/docker/universal/Dockerfile +5 -3
- package/package.json +2 -5
- package/packages/api-builder/src/global_context.rs +1 -1
- package/packages/api-builder/src/metrics.rs +28 -24
- package/packages/api-builder/src/middleware.rs +30 -48
- package/packages/api-builder/src/router.rs +13 -1
- package/packages/api-peer/Cargo.toml +7 -9
- package/packages/api-peer/src/actors/delete.rs +56 -57
- package/packages/api-peer/src/actors/get_or_create.rs +139 -0
- package/packages/api-peer/src/actors/kv_get.rs +40 -28
- package/packages/api-peer/src/actors/list.rs +31 -14
- package/packages/api-peer/src/actors/list_names.rs +6 -6
- package/packages/api-peer/src/actors/mod.rs +3 -0
- package/packages/api-peer/src/actors/reschedule.rs +55 -0
- package/packages/api-peer/src/actors/sleep.rs +55 -0
- package/packages/api-peer/src/envoys.rs +57 -0
- package/packages/api-peer/src/internal.rs +441 -24
- package/packages/api-peer/src/lib.rs +2 -1
- package/packages/api-peer/src/namespaces.rs +24 -9
- package/packages/api-peer/src/router.rs +31 -7
- package/packages/api-peer/src/runner_configs.rs +66 -19
- package/packages/api-peer/src/runners.rs +30 -32
- package/packages/api-public/Cargo.toml +2 -0
- package/packages/api-public/src/actors/create.rs +8 -17
- package/packages/api-public/src/actors/delete.rs +11 -35
- package/packages/api-public/src/actors/get_or_create.rs +23 -95
- package/packages/api-public/src/actors/kv_get.rs +12 -29
- package/packages/api-public/src/actors/list.rs +56 -78
- package/packages/api-public/src/actors/list_names.rs +15 -14
- package/packages/api-public/src/actors/mod.rs +2 -0
- package/packages/api-public/src/actors/reschedule.rs +65 -0
- package/packages/api-public/src/actors/sleep.rs +64 -0
- package/packages/api-public/src/actors/utils.rs +12 -60
- package/packages/api-public/src/ctx.rs +14 -6
- package/packages/api-public/src/datacenters.rs +5 -5
- package/packages/api-public/src/envoys.rs +57 -0
- package/packages/api-public/src/errors.rs +0 -7
- package/packages/api-public/src/health.rs +51 -44
- package/packages/api-public/src/lib.rs +2 -1
- package/packages/api-public/src/metadata.rs +44 -14
- package/packages/api-public/src/namespaces.rs +11 -11
- package/packages/api-public/src/router.rs +22 -5
- package/packages/api-public/src/runner_configs/delete.rs +13 -10
- package/packages/api-public/src/runner_configs/list.rs +5 -2
- package/packages/api-public/src/runner_configs/refresh_metadata.rs +1 -1
- package/packages/api-public/src/runner_configs/serverless_health_check.rs +2 -2
- package/packages/api-public/src/runner_configs/upsert.rs +12 -9
- package/packages/api-public/src/runner_configs/utils.rs +35 -175
- package/packages/api-public/src/runners.rs +17 -45
- package/packages/{dump-openapi → api-public-openapi-gen}/Cargo.toml +1 -1
- package/packages/api-types/src/actors/create.rs +1 -0
- package/packages/api-types/src/actors/delete.rs +20 -0
- package/packages/api-types/src/actors/get_or_create.rs +30 -0
- package/packages/api-types/src/actors/kv_get.rs +25 -0
- package/packages/api-types/src/actors/list.rs +8 -1
- package/packages/api-types/src/actors/mod.rs +5 -0
- package/packages/api-types/src/actors/reschedule.rs +26 -0
- package/packages/api-types/src/actors/sleep.rs +26 -0
- package/packages/api-types/src/datacenters/list.rs +2 -2
- package/packages/api-types/src/envoys/list.rs +24 -0
- package/packages/api-types/src/envoys/mod.rs +1 -0
- package/packages/api-types/src/lib.rs +1 -0
- package/packages/api-types/src/namespaces/list.rs +4 -0
- package/packages/api-types/src/namespaces/runner_configs.rs +23 -2
- package/packages/api-types/src/runner_configs/list.rs +6 -1
- package/packages/api-types/src/runner_configs/mod.rs +12 -0
- package/packages/api-types/src/runners/list.rs +4 -0
- package/packages/api-types/src/runners/list_names.rs +21 -0
- package/packages/api-types/src/runners/mod.rs +1 -0
- package/packages/api-util/src/lib.rs +44 -21
- package/packages/bootstrap/Cargo.toml +7 -4
- package/packages/bootstrap/src/backfill.rs +53 -0
- package/packages/bootstrap/src/lib.rs +43 -7
- package/packages/cache/Cargo.toml +3 -1
- package/packages/cache/src/driver.rs +43 -151
- package/packages/cache/src/getter_ctx.rs +48 -70
- package/packages/cache/src/inner.rs +28 -18
- package/packages/cache/src/key.rs +17 -3
- package/packages/cache/src/lib.rs +0 -2
- package/packages/cache/src/metrics.rs +43 -31
- package/packages/cache/src/req_config.rs +219 -156
- package/packages/cache/tests/fetch.rs +91 -0
- package/packages/cache/tests/in_flight.rs +361 -0
- package/packages/cache/tests/ttl.rs +314 -0
- package/packages/cache-purge/src/lib.rs +1 -1
- package/packages/config/Cargo.toml +1 -0
- package/packages/config/src/config/cache.rs +10 -3
- package/packages/config/src/config/clickhouse.rs +0 -30
- package/packages/config/src/config/{db.rs → db/mod.rs} +3 -18
- package/packages/config/src/config/db/postgres.rs +59 -0
- package/packages/config/src/config/guard.rs +19 -0
- package/packages/config/src/config/metrics.rs +22 -0
- package/packages/config/src/config/mod.rs +44 -10
- package/packages/config/src/config/pegboard.rs +242 -16
- package/packages/config/src/config/pubsub.rs +11 -0
- package/packages/config/src/config/runtime.rs +58 -0
- package/packages/config/src/config/telemetry.rs +1 -0
- package/packages/config/src/config/topology.rs +78 -19
- package/packages/config/src/defaults.rs +3 -0
- package/packages/config/src/lib.rs +10 -1
- package/packages/config-schema-gen/Cargo.toml +11 -0
- package/packages/config-schema-gen/build.rs +26 -0
- package/packages/config-schema-gen/src/lib.rs +2 -0
- package/packages/engine/Cargo.toml +11 -2
- package/packages/engine/src/commands/db/mod.rs +0 -10
- package/packages/engine/src/commands/epoxy.rs +395 -0
- package/packages/engine/src/commands/mod.rs +1 -1
- package/packages/engine/src/commands/start.rs +43 -63
- package/packages/engine/src/commands/udb/cli.rs +148 -4
- package/packages/engine/src/commands/wf/mod.rs +83 -12
- package/packages/engine/src/commands/wf/signal.rs +38 -0
- package/packages/engine/src/lib.rs +6 -3
- package/packages/engine/src/main.rs +1 -1
- package/packages/engine/src/run_config.rs +6 -7
- package/packages/engine/src/util/db.rs +1 -25
- package/packages/engine/src/util/wf/mod.rs +39 -5
- package/packages/engine/tests/common/actors.rs +50 -332
- package/packages/engine/tests/common/api/mod.rs +7 -0
- package/packages/engine/tests/common/api/peer.rs +364 -0
- package/packages/engine/tests/common/api/public.rs +473 -0
- package/packages/engine/tests/common/ctx.rs +15 -3
- package/packages/engine/tests/common/mod.rs +8 -5
- package/packages/engine/tests/common/test_envoy.rs +87 -0
- package/packages/engine/tests/common/test_helpers.rs +218 -130
- package/packages/engine/tests/common/test_runner.rs +273 -0
- package/packages/engine/tests/envoy/actors_lifecycle.rs +1277 -0
- package/packages/engine/tests/envoy/mod.rs +1 -0
- package/packages/engine/tests/mod.rs +3 -0
- package/packages/engine/tests/runner/actors_alarm.rs +1453 -0
- package/packages/engine/tests/runner/actors_kv_crud.rs +996 -0
- package/packages/engine/tests/runner/actors_kv_delete_range.rs +126 -0
- package/packages/engine/tests/runner/actors_kv_drop.rs +255 -0
- package/packages/engine/tests/runner/actors_kv_list.rs +1061 -0
- package/packages/engine/tests/runner/actors_kv_misc.rs +882 -0
- package/packages/engine/tests/runner/actors_lifecycle.rs +1284 -0
- package/packages/engine/tests/runner/actors_scheduling_errors.rs +1005 -0
- package/packages/engine/tests/runner/api_actors_create.rs +422 -0
- package/packages/engine/tests/runner/api_actors_delete.rs +487 -0
- package/packages/engine/tests/runner/api_actors_get_or_create.rs +634 -0
- package/packages/engine/tests/runner/api_actors_list.rs +1771 -0
- package/packages/engine/tests/runner/api_actors_list_names.rs +691 -0
- package/packages/engine/tests/runner/api_namespaces_create.rs +428 -0
- package/packages/engine/tests/runner/api_namespaces_list.rs +760 -0
- package/packages/engine/tests/runner/api_runner_configs_list.rs +646 -0
- package/packages/engine/tests/runner/api_runner_configs_upsert.rs +651 -0
- package/packages/engine/tests/runner/api_runners_list.rs +166 -0
- package/packages/engine/tests/runner/api_runners_list_names.rs +386 -0
- package/packages/engine/tests/runner/mod.rs +20 -0
- package/packages/engine/tests/runner/runner_drain_on_version.rs +620 -0
- package/packages/env/Cargo.toml +0 -4
- package/packages/env/src/lib.rs +0 -18
- package/packages/epoxy/Cargo.toml +3 -2
- package/packages/epoxy/README.md +554 -93
- package/packages/epoxy/src/consts.rs +4 -36
- package/packages/epoxy/src/http_client.rs +59 -26
- package/packages/epoxy/src/http_routes.rs +73 -10
- package/packages/epoxy/src/keys/keys.rs +260 -11
- package/packages/epoxy/src/keys/mod.rs +11 -1
- package/packages/epoxy/src/keys/replica.rs +5 -260
- package/packages/epoxy/src/lib.rs +2 -1
- package/packages/epoxy/src/metrics.rs +118 -0
- package/packages/epoxy/src/ops/kv/get_local.rs +15 -24
- package/packages/epoxy/src/ops/kv/get_optimistic.rs +102 -64
- package/packages/epoxy/src/ops/kv/mod.rs +1 -0
- package/packages/epoxy/src/ops/kv/purge_local.rs +18 -9
- package/packages/epoxy/src/ops/kv/read_value.rs +92 -0
- package/packages/epoxy/src/ops/mod.rs +0 -1
- package/packages/epoxy/src/ops/propose.rs +1079 -194
- package/packages/epoxy/src/replica/ballot.rs +162 -102
- package/packages/epoxy/src/replica/changelog.rs +147 -0
- package/packages/epoxy/src/replica/commit_kv.rs +69 -66
- package/packages/epoxy/src/replica/message_request.rs +33 -48
- package/packages/epoxy/src/replica/messages/accept.rs +82 -41
- package/packages/epoxy/src/replica/messages/commit.rs +21 -33
- package/packages/epoxy/src/replica/messages/mod.rs +0 -8
- package/packages/epoxy/src/replica/messages/prepare.rs +68 -69
- package/packages/epoxy/src/replica/mod.rs +1 -6
- package/packages/epoxy/src/replica/update_config.rs +3 -1
- package/packages/epoxy/src/types.rs +30 -54
- package/packages/epoxy/src/utils.rs +149 -16
- package/packages/epoxy/src/workflows/backfill.rs +233 -0
- package/packages/epoxy/src/workflows/coordinator/mod.rs +33 -7
- package/packages/epoxy/src/workflows/coordinator/reconfigure.rs +44 -0
- package/packages/epoxy/src/workflows/coordinator/replica_status_change.rs +4 -3
- package/packages/epoxy/src/workflows/mod.rs +1 -1
- package/packages/epoxy/src/workflows/replica/mod.rs +4 -6
- package/packages/epoxy/src/workflows/replica/setup.rs +130 -771
- package/packages/epoxy/tests/backfill.rs +65 -0
- package/packages/epoxy/tests/backfill_snapshot.rs +233 -0
- package/packages/epoxy/tests/common/mod.rs +77 -21
- package/packages/epoxy/tests/common/utils.rs +366 -10
- package/packages/epoxy/tests/consensus_regressions.rs +285 -0
- package/packages/epoxy/tests/kv.rs +128 -167
- package/packages/epoxy/tests/kv_get_optimistic.rs +257 -157
- package/packages/epoxy/tests/migration.rs +75 -0
- package/packages/epoxy/tests/proposal.rs +133 -28
- package/packages/epoxy/tests/reconfigure.rs +92 -474
- package/packages/error/tests/basic.rs +8 -8
- package/packages/gasoline/Cargo.toml +1 -0
- package/packages/gasoline/src/builder/common/message.rs +19 -47
- package/packages/gasoline/src/builder/common/signal.rs +37 -21
- package/packages/gasoline/src/builder/common/workflow.rs +19 -15
- package/packages/gasoline/src/builder/workflow/lupe.rs +295 -0
- package/packages/gasoline/src/builder/workflow/message.rs +24 -47
- package/packages/gasoline/src/builder/workflow/mod.rs +1 -0
- package/packages/gasoline/src/builder/workflow/signal.rs +68 -22
- package/packages/gasoline/src/builder/workflow/sub_workflow.rs +6 -15
- package/packages/gasoline/src/ctx/activity.rs +46 -6
- package/packages/gasoline/src/ctx/common.rs +26 -23
- package/packages/gasoline/src/ctx/listen.rs +33 -50
- package/packages/gasoline/src/ctx/message.rs +76 -64
- package/packages/gasoline/src/ctx/operation.rs +15 -5
- package/packages/gasoline/src/ctx/standalone.rs +32 -4
- package/packages/gasoline/src/ctx/test.rs +31 -6
- package/packages/gasoline/src/ctx/versioned_workflow.rs +33 -7
- package/packages/gasoline/src/ctx/workflow.rs +194 -384
- package/packages/gasoline/src/db/debug.rs +49 -9
- package/packages/gasoline/src/db/kv/debug.rs +905 -15
- package/packages/gasoline/src/db/kv/keys/history.rs +434 -9
- package/packages/gasoline/src/db/kv/keys/metric.rs +70 -47
- package/packages/gasoline/src/db/kv/keys/signal.rs +19 -3
- package/packages/gasoline/src/db/kv/keys/workflow.rs +349 -3
- package/packages/gasoline/src/db/kv/mod.rs +975 -514
- package/packages/gasoline/src/db/kv/system.rs +155 -18
- package/packages/gasoline/src/db/mod.rs +29 -7
- package/packages/gasoline/src/error.rs +26 -21
- package/packages/gasoline/src/executable.rs +3 -1
- package/packages/gasoline/src/history/cursor.rs +436 -336
- package/packages/gasoline/src/history/event.rs +24 -15
- package/packages/gasoline/src/listen.rs +2 -14
- package/packages/gasoline/src/message.rs +1 -1
- package/packages/gasoline/src/metrics.rs +260 -143
- package/packages/gasoline/src/prelude.rs +1 -1
- package/packages/gasoline/src/registry.rs +6 -2
- package/packages/gasoline/src/signal.rs +34 -31
- package/packages/gasoline/src/utils/mod.rs +1 -18
- package/packages/gasoline/src/utils/topic.rs +35 -0
- package/packages/gasoline/src/worker.rs +71 -14
- package/packages/gasoline/src/workflow.rs +13 -0
- package/packages/gasoline/tests/workflows/eviction_test.rs +2 -2
- package/packages/gasoline-macros/src/lib.rs +74 -12
- package/packages/gasoline-runtime/Cargo.toml +18 -0
- package/packages/gasoline-runtime/src/lib.rs +12 -0
- package/packages/gasoline-runtime/src/workflows/mod.rs +1 -0
- package/packages/gasoline-runtime/src/workflows/pruner.rs +55 -0
- package/packages/guard/Cargo.toml +16 -8
- package/packages/guard/src/cache/mod.rs +63 -43
- package/packages/guard/src/cache/pegboard_gateway.rs +144 -0
- package/packages/guard/src/errors.rs +105 -0
- package/packages/guard/src/lib.rs +5 -15
- package/packages/guard/src/metrics.rs +12 -0
- package/packages/guard/src/routing/actor_path.rs +409 -0
- package/packages/guard/src/routing/api_public.rs +6 -14
- package/packages/guard/src/routing/envoy.rs +98 -0
- package/packages/guard/src/routing/mod.rs +152 -206
- package/packages/guard/src/routing/pegboard_gateway/mod.rs +572 -0
- package/packages/guard/src/routing/pegboard_gateway/resolve_actor_query.rs +236 -0
- package/packages/guard/src/routing/runner.rs +24 -54
- package/packages/guard/src/routing/ws_health.rs +61 -0
- package/packages/guard/src/shared_state.rs +11 -2
- package/packages/guard/tests/parse_actor_path.rs +418 -165
- package/packages/guard-core/Cargo.toml +3 -10
- package/packages/guard-core/src/custom_serve.rs +4 -10
- package/packages/guard-core/src/errors.rs +20 -4
- package/packages/guard-core/src/lib.rs +6 -4
- package/packages/guard-core/src/metrics.rs +66 -53
- package/packages/guard-core/src/proxy_service.rs +618 -1520
- package/packages/guard-core/src/request_context.rs +149 -169
- package/packages/guard-core/src/response_body.rs +65 -0
- package/packages/guard-core/src/route.rs +76 -0
- package/packages/guard-core/src/server.rs +60 -26
- package/packages/guard-core/src/task_group.rs +4 -0
- package/packages/guard-core/src/utils.rs +296 -0
- package/packages/guard-core/src/websocket_handle.rs +3 -3
- package/packages/guard-core/tests/common/mod.rs +0 -1
- package/packages/guard-core/tests/custom_serve.rs +4 -6
- package/packages/guard-core/tests/simple_websocket.rs +19 -19
- package/packages/guard-core/tests/streaming_response.rs +4 -9
- package/packages/metrics/Cargo.toml +3 -2
- package/packages/metrics/src/buckets.rs +5 -11
- package/packages/metrics/src/lib.rs +6 -3
- package/packages/metrics/src/providers.rs +2 -42
- package/packages/metrics/src/registry.rs +7 -0
- package/packages/metrics/src/server.rs +57 -0
- package/packages/namespace/Cargo.toml +0 -3
- package/packages/namespace/src/keys/metric.rs +301 -0
- package/packages/namespace/src/keys/mod.rs +1 -1
- package/packages/namespace/src/ops/get_global.rs +7 -4
- package/packages/namespace/src/ops/get_local.rs +32 -16
- package/packages/namespace/src/ops/mod.rs +0 -1
- package/packages/namespace/src/ops/resolve_for_name_global.rs +7 -4
- package/packages/namespace/src/ops/resolve_for_name_local.rs +39 -19
- package/packages/namespace/src/workflows/namespace.rs +3 -3
- package/packages/pegboard/Cargo.toml +22 -0
- package/packages/pegboard/src/actor_kv/entry.rs +47 -0
- package/packages/pegboard/src/actor_kv/metrics.rs +19 -0
- package/packages/pegboard/src/actor_kv/mod.rs +530 -0
- package/packages/pegboard/src/actor_kv/preload.rs +363 -0
- package/packages/{actor-kv/src → pegboard/src/actor_kv}/utils.rs +36 -35
- package/packages/pegboard/src/errors.rs +39 -5
- package/packages/pegboard/src/keys/actor.rs +285 -2
- package/packages/{actor-kv/src/entry.rs → pegboard/src/keys/actor_kv.rs} +73 -39
- package/packages/pegboard/src/keys/backfill.rs +49 -0
- package/packages/pegboard/src/keys/envoy.rs +1070 -0
- package/packages/pegboard/src/keys/epoxy/ns.rs +1 -1
- package/packages/pegboard/src/keys/mod.rs +4 -6
- package/packages/pegboard/src/keys/ns.rs +493 -14
- package/packages/pegboard/src/keys/runner.rs +281 -0
- package/packages/{namespace → pegboard}/src/keys/runner_config.rs +53 -0
- package/packages/pegboard/src/lib.rs +15 -2
- package/packages/pegboard/src/metrics.rs +57 -16
- package/packages/pegboard/src/ops/actor/create.rs +123 -53
- package/packages/pegboard/src/ops/actor/get.rs +14 -45
- package/packages/pegboard/src/ops/actor/get_for_gateway.rs +16 -0
- package/packages/pegboard/src/ops/actor/get_for_key.rs +3 -0
- package/packages/pegboard/src/ops/actor/get_for_kv.rs +43 -0
- package/packages/pegboard/src/ops/actor/get_for_runner.rs +99 -0
- package/packages/pegboard/src/ops/actor/get_reservation_for_key.rs +1 -0
- package/packages/pegboard/src/ops/actor/list_for_ns.rs +10 -38
- package/packages/pegboard/src/ops/actor/list_names.rs +3 -3
- package/packages/pegboard/src/ops/actor/mod.rs +3 -1
- package/packages/pegboard/src/ops/actor/util.rs +263 -0
- package/packages/pegboard/src/ops/envoy/drain.rs +101 -0
- package/packages/pegboard/src/ops/envoy/evict_actors.rs +54 -0
- package/packages/pegboard/src/ops/envoy/expire.rs +92 -0
- package/packages/pegboard/src/ops/envoy/get.rs +135 -0
- package/packages/pegboard/src/ops/envoy/list.rs +131 -0
- package/packages/pegboard/src/ops/envoy/mod.rs +6 -0
- package/packages/pegboard/src/ops/envoy/update_ping.rs +92 -0
- package/packages/pegboard/src/ops/mod.rs +3 -0
- package/packages/pegboard/src/ops/runner/drain.rs +110 -0
- package/packages/pegboard/src/ops/runner/list_names.rs +3 -3
- package/packages/pegboard/src/ops/runner/list_runner_config_enabled_dcs.rs +199 -0
- package/packages/pegboard/src/ops/runner/list_runner_config_epoxy_replica_ids.rs +51 -0
- package/packages/pegboard/src/ops/runner/mod.rs +3 -1
- package/packages/pegboard/src/ops/runner/update_alloc_idx.rs +17 -5
- package/packages/{namespace → pegboard}/src/ops/runner_config/delete.rs +18 -9
- package/packages/pegboard/src/ops/runner_config/ensure_normal_if_missing.rs +62 -0
- package/packages/{namespace → pegboard}/src/ops/runner_config/get.rs +15 -5
- package/packages/pegboard/src/ops/runner_config/get_error.rs +146 -0
- package/packages/{namespace → pegboard}/src/ops/runner_config/list.rs +13 -12
- package/packages/pegboard/src/ops/runner_config/mod.rs +7 -0
- package/packages/pegboard/src/ops/runner_config/refresh_metadata.rs +124 -0
- package/packages/pegboard/src/ops/runner_config/upsert.rs +206 -0
- package/packages/pegboard/src/ops/serverless_metadata/fetch.rs +223 -0
- package/packages/pegboard/src/ops/serverless_metadata/mod.rs +1 -0
- package/packages/pegboard/src/pubsub_subjects.rs +52 -0
- package/packages/pegboard/src/utils.rs +36 -2
- package/packages/pegboard/src/workflows/actor/destroy.rs +135 -99
- package/packages/pegboard/src/workflows/actor/keys.rs +59 -5
- package/packages/pegboard/src/workflows/actor/metrics.rs +345 -0
- package/packages/pegboard/src/workflows/actor/mod.rs +848 -204
- package/packages/pegboard/src/workflows/actor/runtime.rs +785 -212
- package/packages/pegboard/src/workflows/actor/setup.rs +61 -0
- package/packages/pegboard/src/workflows/actor2/keys.rs +337 -0
- package/packages/pegboard/src/workflows/actor2/metrics.rs +334 -0
- package/packages/pegboard/src/workflows/actor2/mod.rs +1251 -0
- package/packages/pegboard/src/workflows/actor2/runtime.rs +1005 -0
- package/packages/pegboard/src/workflows/actor_runner_name_selector_backfill.rs +266 -0
- package/packages/pegboard/src/workflows/metrics_aggregator.rs +282 -0
- package/packages/pegboard/src/workflows/mod.rs +8 -0
- package/packages/pegboard/src/workflows/runner.rs +62 -56
- package/packages/pegboard/src/workflows/runner2.rs +978 -0
- package/packages/pegboard/src/workflows/runner_pool.rs +298 -0
- package/packages/pegboard/src/workflows/runner_pool_error_tracker.rs +173 -0
- package/packages/pegboard/src/workflows/runner_pool_metadata_poller.rs +237 -0
- package/packages/pegboard/src/workflows/serverless/backfill.rs +120 -0
- package/packages/pegboard/src/workflows/serverless/conn.rs +702 -0
- package/packages/pegboard/src/workflows/serverless/mod.rs +3 -0
- package/packages/pegboard/src/workflows/serverless/receiver.rs +87 -0
- package/packages/pegboard/tests/actor_v1_pre_migration.rs +77 -0
- package/packages/{actor-kv/tests/list_edge_cases.rs → pegboard/tests/kv_list_edge_cases.rs} +74 -59
- package/packages/{actor-kv → pegboard}/tests/kv_operations.rs +77 -48
- package/packages/pegboard-envoy/Cargo.toml +43 -0
- package/packages/pegboard-envoy/src/actor_event_demuxer.rs +165 -0
- package/packages/pegboard-envoy/src/conn.rs +417 -0
- package/packages/pegboard-envoy/src/errors.rs +38 -0
- package/packages/pegboard-envoy/src/lib.rs +250 -0
- package/packages/pegboard-envoy/src/metrics.rs +44 -0
- package/packages/pegboard-envoy/src/ping_task.rs +61 -0
- package/packages/pegboard-envoy/src/tunnel_to_ws_task.rs +183 -0
- package/packages/pegboard-envoy/src/utils.rs +68 -0
- package/packages/pegboard-envoy/src/ws_to_tunnel_task.rs +536 -0
- package/packages/pegboard-envoy/tests/support/ws_to_tunnel_task.rs +82 -0
- package/packages/pegboard-gateway/Cargo.toml +2 -0
- package/packages/pegboard-gateway/src/keepalive_task.rs +1 -1
- package/packages/pegboard-gateway/src/lib.rs +506 -128
- package/packages/pegboard-gateway/src/metrics.rs +7 -11
- package/packages/pegboard-gateway/src/metrics_task.rs +80 -0
- package/packages/pegboard-gateway/src/ping_task.rs +9 -2
- package/packages/pegboard-gateway/src/shared_state.rs +110 -74
- package/packages/pegboard-gateway/src/tunnel_to_ws_task.rs +21 -7
- package/packages/pegboard-gateway/src/ws_to_tunnel_task.rs +12 -6
- package/packages/pegboard-gateway2/Cargo.toml +37 -0
- package/packages/pegboard-gateway2/src/keepalive_task.rs +61 -0
- package/packages/pegboard-gateway2/src/lib.rs +1044 -0
- package/packages/pegboard-gateway2/src/metrics.rs +10 -0
- package/packages/pegboard-gateway2/src/metrics_task.rs +80 -0
- package/packages/pegboard-gateway2/src/ping_task.rs +30 -0
- package/packages/pegboard-gateway2/src/shared_state.rs +601 -0
- package/packages/pegboard-gateway2/src/tunnel_to_ws_task.rs +99 -0
- package/packages/pegboard-gateway2/src/ws_to_tunnel_task.rs +71 -0
- package/packages/{pegboard-serverless → pegboard-outbound}/Cargo.toml +9 -9
- package/packages/pegboard-outbound/src/lib.rs +487 -0
- package/packages/pegboard-outbound/src/metrics.rs +17 -0
- package/packages/pegboard-runner/Cargo.toml +11 -5
- package/packages/pegboard-runner/src/actor_event_demuxer.rs +163 -0
- package/packages/pegboard-runner/src/conn.rs +358 -122
- package/packages/pegboard-runner/src/errors.rs +5 -0
- package/packages/pegboard-runner/src/lib.rs +62 -36
- package/packages/pegboard-runner/src/metrics.rs +44 -0
- package/packages/pegboard-runner/src/ping_task.rs +60 -13
- package/packages/pegboard-runner/src/tunnel_to_ws_task.rs +249 -110
- package/packages/pegboard-runner/src/ws_to_tunnel_task.rs +738 -113
- package/packages/pegboard-runner/tests/support/ws_to_tunnel_task.rs +150 -0
- package/packages/pools/Cargo.toml +1 -2
- package/packages/pools/src/db/clickhouse.rs +7 -6
- package/packages/pools/src/db/udb.rs +16 -3
- package/packages/pools/src/db/ups.rs +27 -5
- package/packages/pools/src/error.rs +0 -3
- package/packages/pools/src/lib.rs +0 -2
- package/packages/pools/src/metrics.rs +33 -28
- package/packages/pools/src/pools.rs +15 -39
- package/packages/pools/src/prelude.rs +1 -1
- package/packages/postgres-util/Cargo.toml +13 -0
- package/packages/postgres-util/src/lib.rs +84 -0
- package/packages/runner-protocol/build.rs +157 -0
- package/packages/runner-protocol/src/lib.rs +16 -0
- package/packages/runner-protocol/src/util.rs +14 -0
- package/packages/runner-protocol/src/versioned.rs +4345 -0
- package/packages/runtime/src/lib.rs +46 -46
- package/packages/runtime/src/metrics.rs +39 -30
- package/packages/runtime/src/term_signal.rs +25 -12
- package/packages/runtime/src/traces.rs +5 -8
- package/packages/service-manager/src/lib.rs +66 -15
- package/packages/test-deps/src/datacenter.rs +22 -8
- package/packages/test-deps/src/lib.rs +47 -25
- package/packages/test-deps-docker/src/database.rs +45 -36
- package/packages/test-snapshot-gen/Cargo.toml +39 -0
- package/packages/test-snapshot-gen/snapshots/.gitkeep +0 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/metadata.json +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000008.log +0 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/000009.sst +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/CURRENT +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/MANIFEST-000005 +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-1/OPTIONS-000007 +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000008.log +0 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/000009.sst +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/CURRENT +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/MANIFEST-000005 +3 -0
- package/packages/test-snapshot-gen/snapshots/epoxy-v1/replica-2/OPTIONS-000007 +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/metadata.json +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000008.log +0 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/000009.sst +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/CURRENT +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/MANIFEST-000005 +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-1/OPTIONS-000007 +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000008.log +0 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/000009.sst +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/CURRENT +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/MANIFEST-000005 +3 -0
- package/packages/test-snapshot-gen/snapshots/pb-actor-v1-pre-migration/replica-2/OPTIONS-000007 +3 -0
- package/packages/test-snapshot-gen/src/lib.rs +328 -0
- package/packages/test-snapshot-gen/src/main.rs +145 -0
- package/packages/test-snapshot-gen/src/scenarios/epoxy_keys.rs +60 -0
- package/packages/test-snapshot-gen/src/scenarios/mod.rs +27 -0
- package/packages/test-snapshot-gen/src/scenarios/pb_actor_v1_pre_migration.rs +56 -0
- package/packages/test-snapshot-gen/src/test_cluster.rs +234 -0
- package/packages/tracing-reconfigure/src/lib.rs +1 -1
- package/packages/tracing-utils/src/lib.rs +12 -20
- package/packages/types/src/actor/error.rs +59 -0
- package/packages/types/src/actor/mod.rs +2 -0
- package/packages/types/src/actors.rs +5 -0
- package/packages/types/src/envoys.rs +21 -0
- package/packages/types/src/keys/backfill.rs +5 -0
- package/packages/types/src/keys/mod.rs +1 -0
- package/packages/types/src/lib.rs +2 -1
- package/packages/types/src/runner_configs.rs +43 -14
- package/packages/universaldb/Cargo.toml +4 -0
- package/packages/universaldb/src/database.rs +50 -5
- package/packages/universaldb/src/driver/mod.rs +12 -2
- package/packages/universaldb/src/driver/postgres/database.rs +88 -27
- package/packages/universaldb/src/driver/postgres/mod.rs +1 -1
- package/packages/universaldb/src/driver/postgres/transaction.rs +4 -7
- package/packages/universaldb/src/driver/postgres/transaction_task.rs +30 -52
- package/packages/universaldb/src/driver/rocksdb/database.rs +13 -7
- package/packages/universaldb/src/driver/rocksdb/transaction_conflict_tracker.rs +5 -5
- package/packages/universaldb/src/driver/rocksdb/transaction_task.rs +2 -1
- package/packages/universaldb/src/metrics.rs +39 -23
- package/packages/universaldb/src/prelude.rs +1 -1
- package/packages/universaldb/src/transaction.rs +9 -2
- package/packages/universaldb/src/utils/cherry_pick.rs +46 -46
- package/packages/universaldb/src/utils/keys.rs +21 -2
- package/packages/universaldb/src/utils/mod.rs +8 -0
- package/packages/universaldb/src/utils/subspace.rs +9 -4
- package/packages/universaldb/tests/integration.rs +5 -3
- package/packages/universaldb/tests/integration_gas.rs +5 -3
- package/packages/universaldb/tests/rocksdb.rs +152 -19
- package/packages/universalpubsub/Cargo.toml +8 -2
- package/packages/universalpubsub/benches/simple.rs +28 -8
- package/packages/universalpubsub/src/chunking.rs +27 -5
- package/packages/universalpubsub/src/driver/memory/mod.rs +131 -20
- package/packages/universalpubsub/src/driver/mod.rs +5 -0
- package/packages/universalpubsub/src/driver/nats/mod.rs +8 -0
- package/packages/universalpubsub/src/driver/postgres/mod.rs +505 -96
- package/packages/universalpubsub/src/lib.rs +3 -0
- package/packages/universalpubsub/src/metrics.rs +60 -0
- package/packages/universalpubsub/src/pubsub.rs +227 -87
- package/packages/universalpubsub/src/subject.rs +32 -0
- package/packages/universalpubsub/tests/chunking.rs +298 -0
- package/packages/universalpubsub/tests/integration.rs +148 -7
- package/packages/universalpubsub/tests/reconnect.rs +8 -6
- package/packages/util/Cargo.toml +1 -3
- package/packages/util/build.rs +6 -0
- package/packages/util/src/lib.rs +7 -2
- package/packages/util/src/metric.rs +1 -0
- package/packages/util/src/serde.rs +1 -516
- package/packages/{internal → util-serde}/Cargo.toml +4 -5
- package/packages/util-serde/src/lib.rs +517 -0
- package/packages/workflow-worker/Cargo.toml +4 -4
- package/packages/workflow-worker/src/lib.rs +3 -2
- package/sdks/go/api-full/client/client.go +17 -4
- package/sdks/go/api-full/metadata/client.go +50 -0
- package/sdks/go/api-full/namespaces/client.go +3 -0
- package/sdks/go/api-full/namespaces.go +6 -4
- package/sdks/go/api-full/runners/client.go +3 -0
- package/sdks/go/api-full/runners.go +8 -6
- package/sdks/go/api-full/types.go +107 -23
- package/sdks/rust/api-full/rust/.openapi-generator/FILES +6 -0
- package/sdks/rust/api-full/rust/Cargo.toml +1 -1
- package/sdks/rust/api-full/rust/README.md +5 -2
- package/sdks/rust/api-full/rust/docs/Actor.md +1 -0
- package/sdks/rust/api-full/rust/docs/ActorsDeleteApi.md +1 -1
- package/sdks/rust/api-full/rust/docs/ActorsKvGetApi.md +2 -1
- package/sdks/rust/api-full/rust/docs/ActorsListApi.md +3 -2
- package/sdks/rust/api-full/rust/docs/MetadataApi.md +34 -0
- package/sdks/rust/api-full/rust/docs/MetadataGetResponse.md +18 -0
- package/sdks/rust/api-full/rust/docs/NamespacesApi.md +3 -2
- package/sdks/rust/api-full/rust/docs/RunnerConfig.md +1 -0
- package/sdks/rust/api-full/rust/docs/RunnerConfigKindOneOf1Serverless.md +1 -0
- package/sdks/rust/api-full/rust/docs/RunnerConfigResponse.md +15 -0
- package/sdks/rust/api-full/rust/docs/RunnerConfigsListApi.md +3 -2
- package/sdks/rust/api-full/rust/docs/RunnerConfigsListResponseRunnerConfigsValue.md +1 -1
- package/sdks/rust/api-full/rust/docs/RunnersApi.md +3 -2
- package/sdks/rust/api-full/rust/src/apis/actors_create_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/actors_delete_api.rs +3 -5
- package/sdks/rust/api-full/rust/src/apis/actors_get_or_create_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/actors_kv_get_api.rs +4 -2
- package/sdks/rust/api-full/rust/src/apis/actors_list_api.rs +9 -2
- package/sdks/rust/api-full/rust/src/apis/actors_list_names_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/configuration.rs +2 -2
- package/sdks/rust/api-full/rust/src/apis/datacenters_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/health_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/metadata_api.rs +62 -0
- package/sdks/rust/api-full/rust/src/apis/mod.rs +1 -0
- package/sdks/rust/api-full/rust/src/apis/namespaces_api.rs +9 -2
- package/sdks/rust/api-full/rust/src/apis/runner_configs_delete_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/runner_configs_list_api.rs +9 -2
- package/sdks/rust/api-full/rust/src/apis/runner_configs_refresh_metadata_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/runner_configs_serverless_health_check_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/runner_configs_upsert_api.rs +1 -1
- package/sdks/rust/api-full/rust/src/apis/runners_api.rs +9 -2
- package/sdks/rust/api-full/rust/src/models/actor.rs +5 -1
- package/sdks/rust/api-full/rust/src/models/actor_name.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_create_request.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_create_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_get_or_create_request.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_get_or_create_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_kv_get_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_list_names_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/actors_list_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/crash_policy.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/datacenter.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/datacenter_health.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/datacenters_list_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/health_fanout_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/health_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/health_status.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/metadata_get_response.rs +48 -0
- package/sdks/rust/api-full/rust/src/models/mod.rs +4 -0
- package/sdks/rust/api-full/rust/src/models/namespace.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/namespace_list_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/namespaces_create_request.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/namespaces_create_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/pagination.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_config.rs +4 -1
- package/sdks/rust/api-full/rust/src/models/runner_config_kind.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_config_kind_one_of_1_serverless.rs +5 -1
- package/sdks/rust/api-full/rust/src/models/runner_config_response.rs +39 -0
- package/sdks/rust/api-full/rust/src/models/runner_config_variant.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_list_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_list_response_runner_configs_value.rs +3 -3
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_request.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_1_failure.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_health_check_response_one_of_success.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_1.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_2.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_3_non_success_status.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_4_invalid_response_json.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_serverless_metadata_error_one_of_5_invalid_response_schema.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_request_body.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runner_configs_upsert_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runners_list_names_response.rs +1 -1
- package/sdks/rust/api-full/rust/src/models/runners_list_response.rs +1 -1
- package/sdks/rust/api-full/src/apis/actors_api.rs +8 -4
- package/sdks/rust/api-full/src/apis/ns_api.rs +8 -4
- package/sdks/rust/data/src/converted.rs +7 -4
- package/sdks/rust/data/src/lib.rs +2 -2
- package/sdks/rust/data/src/versioned/mod.rs +47 -4
- package/sdks/rust/data/src/versioned/namespace_runner_config.rs +256 -6
- package/sdks/rust/envoy-client/Cargo.toml +25 -0
- package/sdks/rust/envoy-client/src/actor.rs +992 -0
- package/sdks/rust/envoy-client/src/commands.rs +88 -0
- package/sdks/rust/envoy-client/src/config.rs +159 -0
- package/sdks/rust/envoy-client/src/connection.rs +288 -0
- package/sdks/rust/envoy-client/src/context.rs +24 -0
- package/sdks/rust/envoy-client/src/envoy.rs +432 -0
- package/sdks/rust/envoy-client/src/events.rs +62 -0
- package/sdks/rust/envoy-client/src/handle.rs +355 -0
- package/sdks/rust/envoy-client/src/kv.rs +132 -0
- package/sdks/rust/envoy-client/src/latency_channel.rs +27 -0
- package/sdks/rust/envoy-client/src/lib.rs +15 -0
- package/sdks/rust/envoy-client/src/stringify.rs +322 -0
- package/sdks/rust/envoy-client/src/tunnel.rs +265 -0
- package/sdks/rust/envoy-client/src/utils.rs +172 -0
- package/sdks/rust/envoy-protocol/Cargo.toml +22 -0
- package/sdks/rust/envoy-protocol/build.rs +200 -0
- package/sdks/rust/envoy-protocol/src/generated.rs +1 -0
- package/sdks/rust/envoy-protocol/src/lib.rs +8 -0
- package/sdks/rust/envoy-protocol/src/versioned.rs +208 -0
- package/sdks/rust/epoxy-protocol/Cargo.toml +0 -2
- package/sdks/rust/epoxy-protocol/build.rs +7 -0
- package/sdks/rust/epoxy-protocol/src/lib.rs +2 -5
- package/sdks/rust/epoxy-protocol/src/protocol.rs +128 -0
- package/sdks/rust/test-envoy/Cargo.toml +23 -0
- package/sdks/rust/test-envoy/Dockerfile +22 -0
- package/sdks/rust/test-envoy/src/behaviors.rs +141 -0
- package/sdks/rust/test-envoy/src/lib.rs +11 -0
- package/sdks/rust/test-envoy/src/main.rs +4 -0
- package/sdks/rust/test-envoy/src/server.rs +269 -0
- package/sdks/schemas/README.md +1 -2
- package/sdks/schemas/data/namespace.runner_config.v3.bare +24 -0
- package/sdks/schemas/data/namespace.runner_config.v4.bare +25 -0
- package/sdks/schemas/data/namespace.runner_config.v5.bare +26 -0
- package/sdks/schemas/data/pegboard.namespace.runner_alloc_idx.v2.bare +8 -0
- package/sdks/schemas/envoy-protocol/v1.bare +459 -0
- package/sdks/schemas/epoxy-protocol/v2.bare +220 -0
- package/sdks/schemas/runner-protocol/v4.bare +438 -0
- package/sdks/schemas/runner-protocol/v5.bare +430 -0
- package/sdks/schemas/runner-protocol/v6.bare +432 -0
- package/sdks/schemas/runner-protocol/v7.bare +438 -0
- package/sdks/typescript/api-full/.turbo/turbo-build.log +28 -27
- package/sdks/typescript/api-full/build.js +7 -1
- package/sdks/typescript/api-full/package.json +66 -57
- package/sdks/typescript/api-full/rivetkit-engine-api-full-25.5.3.tgz +0 -0
- package/sdks/typescript/api-full/src/Client.ts +41 -10
- package/sdks/typescript/api-full/src/api/client/requests/ActorsDeleteRequest.ts +4 -2
- package/sdks/typescript/api-full/src/api/client/requests/ActorsKvGetRequest.ts +13 -0
- package/sdks/typescript/api-full/src/api/client/requests/ActorsListRequest.ts +6 -0
- package/sdks/typescript/api-full/src/api/client/requests/RunnerConfigsListRequest.ts +4 -0
- package/sdks/typescript/api-full/src/api/client/requests/index.ts +1 -0
- package/sdks/typescript/api-full/src/api/resources/index.ts +1 -0
- package/sdks/typescript/api-full/src/api/resources/metadata/client/Client.ts +97 -0
- package/sdks/typescript/api-full/src/api/resources/metadata/client/index.ts +1 -0
- package/sdks/typescript/api-full/src/api/resources/metadata/index.ts +1 -0
- package/sdks/typescript/api-full/src/api/resources/namespaces/client/Client.ts +12 -2
- package/sdks/typescript/api-full/src/api/resources/namespaces/client/requests/NamespacesListRequest.ts +6 -0
- package/sdks/typescript/api-full/src/api/resources/runners/client/Client.ts +12 -2
- package/sdks/typescript/api-full/src/api/resources/runners/client/requests/RunnersListRequest.ts +6 -0
- package/sdks/typescript/api-full/src/api/types/Actor.ts +2 -0
- package/sdks/typescript/api-full/src/api/types/MetadataGetResponse.ts +14 -0
- package/sdks/typescript/api-full/src/api/types/RunnerConfig.ts +1 -0
- package/sdks/typescript/api-full/src/api/types/RunnerConfigKindServerlessServerless.ts +2 -0
- package/sdks/typescript/api-full/src/api/types/RunnerConfigResponse.ts +9 -0
- package/sdks/typescript/api-full/src/api/types/RunnerConfigServerless.ts +2 -0
- package/sdks/typescript/api-full/src/api/types/RunnerConfigsListResponseRunnerConfigsValue.ts +1 -1
- package/sdks/typescript/api-full/src/api/types/index.ts +2 -0
- package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/Node18UniversalStreamWrapper.ts +6 -4
- package/sdks/typescript/api-full/src/core/fetcher/stream-wrappers/UndiciStreamWrapper.ts +4 -3
- package/sdks/typescript/api-full/src/serialization/types/Actor.ts +2 -0
- package/sdks/typescript/api-full/src/serialization/types/MetadataGetResponse.ts +34 -0
- package/sdks/typescript/api-full/src/serialization/types/RunnerConfig.ts +5 -0
- package/sdks/typescript/api-full/src/serialization/types/RunnerConfigKindServerlessServerless.ts +2 -0
- package/sdks/typescript/api-full/src/serialization/types/RunnerConfigResponse.ts +26 -0
- package/sdks/typescript/api-full/src/serialization/types/RunnerConfigServerless.ts +2 -0
- package/sdks/typescript/api-full/src/serialization/types/RunnerConfigsListResponseRunnerConfigsValue.ts +3 -3
- package/sdks/typescript/api-full/src/serialization/types/index.ts +2 -0
- package/sdks/typescript/api-full/turbo.json +9 -0
- package/sdks/typescript/envoy-protocol/.turbo/turbo-build.log +23 -0
- package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.cjs +466 -281
- package/sdks/typescript/envoy-protocol/dist/index.cjs.map +1 -0
- package/sdks/typescript/envoy-protocol/dist/index.d.cts +699 -0
- package/sdks/typescript/envoy-protocol/dist/index.d.ts +699 -0
- package/sdks/typescript/{runner-protocol → envoy-protocol}/dist/index.js +530 -345
- package/sdks/typescript/envoy-protocol/dist/index.js.map +1 -0
- package/sdks/typescript/{runner-protocol → envoy-protocol}/node_modules/.bin/tsc +4 -4
- package/{tests/load → sdks/typescript/envoy-protocol}/node_modules/.bin/tsserver +4 -4
- package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup +21 -0
- package/sdks/typescript/envoy-protocol/node_modules/.bin/tsup-node +21 -0
- package/sdks/typescript/envoy-protocol/package.json +36 -0
- package/sdks/typescript/envoy-protocol/src/index.ts +2331 -0
- package/sdks/typescript/envoy-protocol/tsconfig.json +9 -0
- package/sdks/typescript/envoy-protocol/tsup.config.ts +4 -0
- package/sdks/typescript/runner/package.json +8 -2
- package/sdks/typescript/runner/src/actor.ts +38 -0
- package/sdks/typescript/runner/src/mod.ts +435 -229
- package/sdks/typescript/runner/src/stringify.ts +36 -33
- package/sdks/typescript/runner/src/tunnel.ts +52 -56
- package/sdks/typescript/runner/src/utils.ts +19 -0
- package/sdks/typescript/runner/src/websocket-tunnel-adapter.ts +98 -435
- package/sdks/typescript/runner-protocol/package.json +11 -9
- package/sdks/typescript/runner-protocol/src/index.ts +224 -156
- package/sdks/typescript/runner-protocol/tsconfig.json +1 -9
- package/sdks/typescript/test-runner/.turbo/turbo-build.log +5 -5
- package/sdks/typescript/test-runner/dist/index.js +53 -44
- package/sdks/typescript/test-runner/dist/index.js.map +1 -1
- package/sdks/typescript/test-runner/node_modules/.bin/pino +2 -2
- package/sdks/typescript/test-runner/node_modules/.bin/tsc +4 -4
- package/sdks/typescript/test-runner/node_modules/.bin/tsserver +4 -4
- package/sdks/typescript/test-runner/node_modules/.bin/tsup +4 -4
- package/sdks/typescript/test-runner/node_modules/.bin/tsup-node +4 -4
- package/sdks/typescript/test-runner/node_modules/.bin/tsx +4 -4
- package/sdks/typescript/test-runner/node_modules/.bin/vitest +4 -4
- package/sdks/typescript/test-runner/package.json +3 -3
- package/sdks/typescript/test-runner/src/index.ts +65 -42
- package/sdks/typescript/test-runner/src/log.ts +4 -18
- package/artifacts/errors/actor.no_runners_available.json +0 -5
- package/artifacts/errors/guard.actor_destroyed.json +0 -5
- package/artifacts/errors/guard.actor_not_found.json +0 -5
- package/contrib-docs/ACTOR_KEY_RESERVATION.md +0 -101
- package/contrib-docs/API.md +0 -11
- package/contrib-docs/DOCKER.md +0 -5
- package/contrib-docs/ERRORS.md +0 -13
- package/contrib-docs/GUARD.md +0 -76
- package/contrib-docs/PEGBOARD_TUNNEL_RETRIES.md +0 -83
- package/contrib-docs/RUNNER_LIFECYCLE.md +0 -172
- package/contrib-docs/SDKS.md +0 -9
- package/contrib-docs/TEST_DEPENDENCIES.md +0 -43
- package/contrib-docs/design-choicse/EMBEDDED_KV.md +0 -80
- package/contrib-docs/operate/TRACING_RECONFIGURE.md +0 -78
- package/docker/dev/otel-collector-client/config.yaml +0 -39
- package/docker/dev-host/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multidc/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multidc/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multidc/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multidc-multinode/datacenters/dc-a/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multidc-multinode/datacenters/dc-b/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multidc-multinode/datacenters/dc-c/otel-collector-client/config.yaml +0 -39
- package/docker/dev-multinode/otel-collector-client/config.yaml +0 -39
- package/docker/template/src/services/edge/otel-collector-client.ts +0 -64
- package/packages/actor-kv/Cargo.toml +0 -31
- package/packages/actor-kv/src/key.rs +0 -81
- package/packages/actor-kv/src/lib.rs +0 -357
- package/packages/cache/src/rate_limit.rs +0 -109
- package/packages/cache/tests/integration.rs +0 -582
- package/packages/clickhouse-inserter/Cargo.toml +0 -17
- package/packages/clickhouse-inserter/src/error.rs +0 -16
- package/packages/clickhouse-inserter/src/lib.rs +0 -179
- package/packages/clickhouse-user-query/Cargo.toml +0 -16
- package/packages/clickhouse-user-query/examples/case_sensitivity_demo.rs +0 -100
- package/packages/clickhouse-user-query/examples/group_by_example.rs +0 -53
- package/packages/clickhouse-user-query/examples/string_contains_demo.rs +0 -96
- package/packages/clickhouse-user-query/src/builder.rs +0 -445
- package/packages/clickhouse-user-query/src/error.rs +0 -37
- package/packages/clickhouse-user-query/src/lib.rs +0 -61
- package/packages/clickhouse-user-query/src/query.rs +0 -143
- package/packages/clickhouse-user-query/src/schema.rs +0 -78
- package/packages/clickhouse-user-query/tests/builder_tests.rs +0 -619
- package/packages/clickhouse-user-query/tests/case_sensitivity_tests.rs +0 -307
- package/packages/clickhouse-user-query/tests/integration_tests.rs +0 -540
- package/packages/clickhouse-user-query/tests/query_tests.rs +0 -263
- package/packages/clickhouse-user-query/tests/schema_tests.rs +0 -44
- package/packages/config/src/config/vector.rs +0 -18
- package/packages/engine/src/commands/udb_keys.rs +0 -200
- package/packages/engine/tests/actors_create.rs +0 -524
- package/packages/engine/tests/actors_delete.rs +0 -243
- package/packages/engine/tests/actors_general.rs +0 -191
- package/packages/engine/tests/actors_get.rs +0 -230
- package/packages/engine/tests/actors_get_by_id.rs +0 -170
- package/packages/engine/tests/actors_get_or_create.rs +0 -294
- package/packages/engine/tests/actors_get_or_create_by_id.rs +0 -147
- package/packages/engine/tests/actors_lifecycle.rs +0 -165
- package/packages/engine/tests/actors_list.rs +0 -798
- package/packages/engine/tests/actors_list_names.rs +0 -353
- package/packages/engine/tests/common/ns.rs +0 -36
- package/packages/engine/tests/common/runner.rs +0 -134
- package/packages/engine/tests/runners_dupe_key.rs +0 -27
- package/packages/engine/tests/runners_version.rs +0 -50
- package/packages/env/build.rs +0 -8
- package/packages/epoxy/spec/KEYS.md +0 -33
- package/packages/epoxy/spec/PROPOSAL.md +0 -125
- package/packages/epoxy/spec/RECONFIGURE.md +0 -40
- package/packages/epoxy/src/ops/explicit_prepare.rs +0 -342
- package/packages/epoxy/src/replica/decide_path.rs +0 -51
- package/packages/epoxy/src/replica/lead_consensus.rs +0 -65
- package/packages/epoxy/src/replica/log.rs +0 -84
- package/packages/epoxy/src/replica/messages/accepted.rs +0 -35
- package/packages/epoxy/src/replica/messages/committed.rs +0 -41
- package/packages/epoxy/src/replica/messages/download_instances.rs +0 -69
- package/packages/epoxy/src/replica/messages/pre_accept.rs +0 -69
- package/packages/epoxy/src/replica/utils.rs +0 -111
- package/packages/epoxy/src/workflows/purger.rs +0 -81
- package/packages/guard/src/cache/actor.rs +0 -43
- package/packages/guard/src/middleware.rs +0 -42
- package/packages/guard/src/routing/pegboard_gateway.rs +0 -260
- package/packages/guard-core/src/analytics.rs +0 -46
- package/packages/internal/README.md +0 -1
- package/packages/internal/src/lib.rs +0 -1
- package/packages/internal/src/ops/bump_serverless_autoscaler_global.rs +0 -64
- package/packages/internal/src/ops/cache/mod.rs +0 -1
- package/packages/internal/src/ops/cache/purge_global.rs +0 -81
- package/packages/internal/src/ops/mod.rs +0 -2
- package/packages/namespace/src/ops/runner_config/mod.rs +0 -4
- package/packages/namespace/src/ops/runner_config/upsert.rs +0 -148
- package/packages/pegboard/src/ops/actor/get_runner.rs +0 -64
- package/packages/pegboard/src/ops/runner/find_dc_with_runner.rs +0 -222
- package/packages/pegboard-serverless/src/lib.rs +0 -523
- package/packages/types/src/msgs/mod.rs +0 -1
- package/packages/types/src/msgs/pegboard.rs +0 -5
- package/sdks/rust/epoxy-protocol/src/versioned.rs +0 -206
- package/sdks/rust/runner-protocol/build.rs +0 -115
- package/sdks/rust/runner-protocol/src/lib.rs +0 -10
- package/sdks/rust/runner-protocol/src/versioned.rs +0 -1734
- package/sdks/schemas/epoxy-protocol/v1.bare +0 -260
- package/sdks/typescript/runner/.turbo/turbo-build.log +0 -22
- package/sdks/typescript/runner/dist/mod.cjs +0 -2951
- package/sdks/typescript/runner/dist/mod.cjs.map +0 -1
- package/sdks/typescript/runner/dist/mod.d.cts +0 -326
- package/sdks/typescript/runner/dist/mod.d.ts +0 -326
- package/sdks/typescript/runner/dist/mod.js +0 -2951
- package/sdks/typescript/runner/dist/mod.js.map +0 -1
- package/sdks/typescript/runner/node_modules/.bin/pino +0 -21
- package/sdks/typescript/runner/node_modules/.bin/tsc +0 -21
- package/sdks/typescript/runner/node_modules/.bin/tsserver +0 -21
- package/sdks/typescript/runner/node_modules/.bin/tsup +0 -21
- package/sdks/typescript/runner/node_modules/.bin/tsup-node +0 -21
- package/sdks/typescript/runner/node_modules/.bin/tsx +0 -21
- package/sdks/typescript/runner/node_modules/.bin/uuid +0 -21
- package/sdks/typescript/runner/node_modules/.bin/vitest +0 -21
- package/sdks/typescript/runner-protocol/.turbo/turbo-build.log +0 -22
- package/sdks/typescript/runner-protocol/dist/index.cjs.map +0 -1
- package/sdks/typescript/runner-protocol/dist/index.d.cts +0 -666
- package/sdks/typescript/runner-protocol/dist/index.d.ts +0 -666
- package/sdks/typescript/runner-protocol/dist/index.js.map +0 -1
- package/sdks/typescript/runner-protocol/node_modules/.bin/tsserver +0 -21
- package/sdks/typescript/runner-protocol/node_modules/.bin/tsup +0 -21
- package/sdks/typescript/runner-protocol/node_modules/.bin/tsup-node +0 -21
- package/sdks/typescript/test-runner/Dockerfile +0 -26
- package/tests/load/README.md +0 -28
- package/tests/load/actor-lifecycle/README.md +0 -26
- package/tests/load/actor-lifecycle/actor.ts +0 -41
- package/tests/load/actor-lifecycle/config.ts +0 -14
- package/tests/load/actor-lifecycle/index.ts +0 -62
- package/tests/load/actor-lifecycle/rivet_api.ts +0 -140
- package/tests/load/actor-lifecycle/types.ts +0 -17
- package/tests/load/node_modules/.bin/biome +0 -21
- package/tests/load/node_modules/.bin/tsc +0 -21
- package/tests/load/package.json +0 -15
- package/tests/load/tsconfig.json +0 -20
- package/tests/smoke/README.md +0 -32
- package/tests/smoke/package.json +0 -19
- package/tests/smoke/scripts/connect.ts +0 -41
- package/tests/smoke/src/server/registry.ts +0 -32
- package/tests/smoke/src/server/server.ts +0 -7
- package/tests/smoke/src/smoke-test/index.ts +0 -161
- package/tests/smoke/src/smoke-test/spawn-actor.ts +0 -109
- package/tests/smoke/tsconfig.json +0 -43
- /package/packages/{dump-openapi → api-public-openapi-gen}/build.rs +0 -0
- /package/packages/{dump-openapi → api-public-openapi-gen}/src/lib.rs +0 -0
- /package/{sdks/rust → packages}/runner-protocol/Cargo.toml +0 -0
- /package/{sdks/rust → packages}/runner-protocol/src/compat.rs +0 -0
- /package/{sdks/rust → packages}/runner-protocol/src/generated.rs +0 -0
- /package/{sdks/rust → packages}/runner-protocol/src/uuid_compat.rs +0 -0
- /package/sdks/rust/{runner-protocol → envoy-protocol}/src/util.rs +0 -0
- /package/{tests/smoke → sdks/typescript/envoy-protocol}/turbo.json +0 -0
|
@@ -0,0 +1,1005 @@
|
|
|
1
|
+
use super::super::common;
|
|
2
|
+
|
|
3
|
+
use serde_json::json;
|
|
4
|
+
use std::net::SocketAddr;
|
|
5
|
+
use std::sync::Arc;
|
|
6
|
+
use std::sync::atomic::{AtomicU32, Ordering};
|
|
7
|
+
use std::time::Duration;
|
|
8
|
+
|
|
9
|
+
async fn start_mock_serverless(status_code: u16) -> (SocketAddr, tokio::task::JoinHandle<()>) {
|
|
10
|
+
use axum::{Router, routing::any};
|
|
11
|
+
|
|
12
|
+
let router = Router::new().fallback(any(move || async move {
|
|
13
|
+
(
|
|
14
|
+
axum::http::StatusCode::from_u16(status_code).unwrap(),
|
|
15
|
+
format!("mock error response with status {}", status_code),
|
|
16
|
+
)
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
|
|
20
|
+
let addr = listener.local_addr().unwrap();
|
|
21
|
+
|
|
22
|
+
let handle = tokio::spawn(async move {
|
|
23
|
+
axum::serve(listener, router).await.unwrap();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
(addr, handle)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/// Starts a mock serverless that returns an empty SSE stream on first connection
|
|
30
|
+
/// (causing StreamEndedEarly error), then fails with an HTTP error on subsequent connections.
|
|
31
|
+
/// Returns the address, handle, and a counter of how many connections have been made.
|
|
32
|
+
async fn start_mock_serverless_stream_then_fail(
|
|
33
|
+
fail_status_code: u16,
|
|
34
|
+
) -> (SocketAddr, tokio::task::JoinHandle<()>, Arc<AtomicU32>) {
|
|
35
|
+
use axum::{
|
|
36
|
+
Router,
|
|
37
|
+
body::Body,
|
|
38
|
+
http::{Response, StatusCode, header},
|
|
39
|
+
routing::get,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
let connection_count = Arc::new(AtomicU32::new(0));
|
|
43
|
+
let connection_count_clone = connection_count.clone();
|
|
44
|
+
|
|
45
|
+
let router = Router::new().route(
|
|
46
|
+
"/start",
|
|
47
|
+
get(move || {
|
|
48
|
+
let connection_count = connection_count_clone.clone();
|
|
49
|
+
async move {
|
|
50
|
+
let count = connection_count.fetch_add(1, Ordering::SeqCst);
|
|
51
|
+
|
|
52
|
+
if count == 0 {
|
|
53
|
+
// First connection: return valid SSE stream that closes immediately
|
|
54
|
+
// This simulates a runner that connects but crashes before init
|
|
55
|
+
// This triggers "StreamEndedEarly" error
|
|
56
|
+
Response::builder()
|
|
57
|
+
.status(StatusCode::OK)
|
|
58
|
+
.header(header::CONTENT_TYPE, "text/event-stream")
|
|
59
|
+
.header(header::CACHE_CONTROL, "no-cache")
|
|
60
|
+
.body(Body::empty())
|
|
61
|
+
.unwrap()
|
|
62
|
+
} else {
|
|
63
|
+
// Subsequent connections: return HTTP error
|
|
64
|
+
Response::builder()
|
|
65
|
+
.status(StatusCode::from_u16(fail_status_code).unwrap())
|
|
66
|
+
.body(Body::from(format!(
|
|
67
|
+
"mock error response with status {}",
|
|
68
|
+
fail_status_code
|
|
69
|
+
)))
|
|
70
|
+
.unwrap()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}),
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
|
|
77
|
+
let addr = listener.local_addr().unwrap();
|
|
78
|
+
|
|
79
|
+
let handle = tokio::spawn(async move {
|
|
80
|
+
axum::serve(listener, router).await.unwrap();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
(addr, handle, connection_count)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async fn create_serverless_runner_config(
|
|
87
|
+
guard_port: u16,
|
|
88
|
+
namespace: &str,
|
|
89
|
+
runner_name: &str,
|
|
90
|
+
serverless_url: &str,
|
|
91
|
+
) {
|
|
92
|
+
let client = reqwest::Client::new();
|
|
93
|
+
let response = client
|
|
94
|
+
.put(format!(
|
|
95
|
+
"http://127.0.0.1:{}/runner-configs/{}?namespace={}",
|
|
96
|
+
guard_port, runner_name, namespace
|
|
97
|
+
))
|
|
98
|
+
.json(&json!({
|
|
99
|
+
"datacenters": {
|
|
100
|
+
"dc-1": {
|
|
101
|
+
"serverless": {
|
|
102
|
+
"url": serverless_url,
|
|
103
|
+
"max_runners": 1,
|
|
104
|
+
"slots_per_runner": 1,
|
|
105
|
+
"request_lifespan": 15,
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}))
|
|
110
|
+
.send()
|
|
111
|
+
.await
|
|
112
|
+
.unwrap();
|
|
113
|
+
|
|
114
|
+
if !response.status().is_success() {
|
|
115
|
+
let text = response.text().await.unwrap();
|
|
116
|
+
panic!("failed to create runner config: {}", text);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/// Creates an actor and returns the actor_id if successful, or the error response body if failed.
|
|
121
|
+
async fn create_actor(
|
|
122
|
+
guard_port: u16,
|
|
123
|
+
namespace: &str,
|
|
124
|
+
runner_name: &str,
|
|
125
|
+
) -> Result<String, serde_json::Value> {
|
|
126
|
+
create_actor_with_policy(guard_port, namespace, runner_name, "sleep").await
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/// Creates an actor with a specific crash policy and returns the actor_id if successful.
|
|
130
|
+
async fn create_actor_with_policy(
|
|
131
|
+
guard_port: u16,
|
|
132
|
+
namespace: &str,
|
|
133
|
+
runner_name: &str,
|
|
134
|
+
crash_policy: &str,
|
|
135
|
+
) -> Result<String, serde_json::Value> {
|
|
136
|
+
let client = reqwest::Client::new();
|
|
137
|
+
let response = client
|
|
138
|
+
.post(format!(
|
|
139
|
+
"http://127.0.0.1:{}/actors?namespace={}",
|
|
140
|
+
guard_port, namespace
|
|
141
|
+
))
|
|
142
|
+
.json(&json!({
|
|
143
|
+
"name": "test",
|
|
144
|
+
"key": "key",
|
|
145
|
+
"crash_policy": crash_policy,
|
|
146
|
+
"runner_name_selector": runner_name,
|
|
147
|
+
}))
|
|
148
|
+
.send()
|
|
149
|
+
.await
|
|
150
|
+
.unwrap();
|
|
151
|
+
|
|
152
|
+
let success = response.status().is_success();
|
|
153
|
+
let body: serde_json::Value = response.json().await.unwrap();
|
|
154
|
+
|
|
155
|
+
if success {
|
|
156
|
+
Ok(body["actor"]["actor_id"].as_str().unwrap().to_string())
|
|
157
|
+
} else {
|
|
158
|
+
Err(body)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// Spawns a task that makes a request to an actor via guard.
|
|
163
|
+
/// Returns a JoinHandle that resolves to the response.
|
|
164
|
+
fn request_guard(
|
|
165
|
+
guard_port: u16,
|
|
166
|
+
actor_id: String,
|
|
167
|
+
timeout_secs: u64,
|
|
168
|
+
) -> tokio::task::JoinHandle<Result<reqwest::Response, reqwest::Error>> {
|
|
169
|
+
tokio::spawn(async move {
|
|
170
|
+
let client = reqwest::Client::builder()
|
|
171
|
+
.timeout(Duration::from_secs(timeout_secs))
|
|
172
|
+
.build()
|
|
173
|
+
.unwrap();
|
|
174
|
+
|
|
175
|
+
client
|
|
176
|
+
.get(format!("http://127.0.0.1:{}/ping", guard_port))
|
|
177
|
+
.header("X-Rivet-Target", "actor")
|
|
178
|
+
.header("X-Rivet-Actor", &actor_id)
|
|
179
|
+
.send()
|
|
180
|
+
.await
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/// Fetches the actor error from the API.
|
|
185
|
+
/// Returns the error object if present, or None if not.
|
|
186
|
+
#[allow(dead_code)]
|
|
187
|
+
async fn get_actor_error(
|
|
188
|
+
guard_port: u16,
|
|
189
|
+
namespace: &str,
|
|
190
|
+
actor_id: &str,
|
|
191
|
+
) -> Option<rivet_types::actor::ActorError> {
|
|
192
|
+
get_actor(guard_port, namespace, actor_id)
|
|
193
|
+
.await
|
|
194
|
+
.and_then(|a| a.error)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/// Returns the full actor details, or None if not found.
|
|
198
|
+
#[allow(dead_code)]
|
|
199
|
+
async fn get_actor(
|
|
200
|
+
guard_port: u16,
|
|
201
|
+
namespace: &str,
|
|
202
|
+
actor_id: &str,
|
|
203
|
+
) -> Option<rivet_types::actors::Actor> {
|
|
204
|
+
let response = common::api::public::actors_list(
|
|
205
|
+
guard_port,
|
|
206
|
+
common::api_types::actors::list::ListQuery {
|
|
207
|
+
actor_ids: Some(actor_id.to_string()),
|
|
208
|
+
actor_id: vec![],
|
|
209
|
+
namespace: namespace.to_string(),
|
|
210
|
+
name: None,
|
|
211
|
+
key: None,
|
|
212
|
+
include_destroyed: Some(true),
|
|
213
|
+
limit: None,
|
|
214
|
+
cursor: None,
|
|
215
|
+
},
|
|
216
|
+
)
|
|
217
|
+
.await
|
|
218
|
+
.unwrap();
|
|
219
|
+
|
|
220
|
+
response.actors.into_iter().next()
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/// Waits for the actor error to be set, polling every 500ms up to the timeout.
|
|
224
|
+
/// Returns the error if found, or None if timeout is reached.
|
|
225
|
+
#[allow(dead_code)]
|
|
226
|
+
async fn wait_for_actor_error(
|
|
227
|
+
guard_port: u16,
|
|
228
|
+
namespace: &str,
|
|
229
|
+
actor_id: &str,
|
|
230
|
+
timeout: Duration,
|
|
231
|
+
) -> Option<rivet_types::actor::ActorError> {
|
|
232
|
+
let start = std::time::Instant::now();
|
|
233
|
+
while start.elapsed() < timeout {
|
|
234
|
+
if let Some(error) = get_actor_error(guard_port, namespace, actor_id).await {
|
|
235
|
+
return Some(error);
|
|
236
|
+
}
|
|
237
|
+
tokio::time::sleep(Duration::from_millis(500)).await;
|
|
238
|
+
}
|
|
239
|
+
None
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
#[test]
|
|
243
|
+
fn no_runners_available_error() {
|
|
244
|
+
common::run(common::TestOpts::new(1), |ctx| async move {
|
|
245
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
246
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
247
|
+
|
|
248
|
+
let error = create_actor(guard_port, &namespace, "nonexistent")
|
|
249
|
+
.await
|
|
250
|
+
.expect_err("actor creation should fail");
|
|
251
|
+
|
|
252
|
+
assert_eq!(error["code"], "no_runners_available");
|
|
253
|
+
assert_eq!(error["group"], "actor");
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
#[test]
|
|
258
|
+
fn serverless_http_404_error() {
|
|
259
|
+
common::run(
|
|
260
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
261
|
+
|ctx| async move {
|
|
262
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
263
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
264
|
+
|
|
265
|
+
let (mock_addr, _mock_handle) = start_mock_serverless(404).await;
|
|
266
|
+
let serverless_url = format!("http://{}", mock_addr);
|
|
267
|
+
|
|
268
|
+
let runner_name = format!("serverless-404-{}", rand::random::<u16>());
|
|
269
|
+
create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
|
|
270
|
+
.await;
|
|
271
|
+
|
|
272
|
+
let actor_id = create_actor(guard_port, &namespace, &runner_name)
|
|
273
|
+
.await
|
|
274
|
+
.expect("actor creation should succeed initially");
|
|
275
|
+
|
|
276
|
+
// Make a request to the actor via guard - this should timeout with actor_ready_timeout
|
|
277
|
+
let guard_response = request_guard(guard_port, actor_id.clone(), 25)
|
|
278
|
+
.await
|
|
279
|
+
.expect("guard request task panicked")
|
|
280
|
+
.expect("guard request failed");
|
|
281
|
+
|
|
282
|
+
assert!(
|
|
283
|
+
!guard_response.status().is_success(),
|
|
284
|
+
"guard request should have failed"
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
let guard_body: serde_json::Value = guard_response.json().await.unwrap();
|
|
288
|
+
// Guard should fail fast with actor_runner_failed when pool has errors
|
|
289
|
+
assert_eq!(
|
|
290
|
+
guard_body["code"], "actor_runner_failed",
|
|
291
|
+
"expected actor_runner_failed error (fail-fast), got: {:?}",
|
|
292
|
+
guard_body
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
// Verify the pool error via runner configs API
|
|
296
|
+
let pool_error = get_runner_config_pool_error(guard_port, &namespace, &runner_name)
|
|
297
|
+
.await
|
|
298
|
+
.expect("pool should have error after failed connection");
|
|
299
|
+
|
|
300
|
+
match &pool_error {
|
|
301
|
+
rivet_types::actor::RunnerPoolError::ServerlessHttpError {
|
|
302
|
+
status_code,
|
|
303
|
+
body: _,
|
|
304
|
+
} => {
|
|
305
|
+
assert_eq!(*status_code, 404, "expected HTTP 404 error");
|
|
306
|
+
}
|
|
307
|
+
other => panic!("expected ServerlessHttpError, got: {:?}", other),
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
#[test]
|
|
314
|
+
fn runner_disconnect_error() {
|
|
315
|
+
common::run(
|
|
316
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
317
|
+
|ctx| async move {
|
|
318
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
319
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
320
|
+
|
|
321
|
+
// 1. Connect a runner with key "test-runner"
|
|
322
|
+
let runner_key = "test-runner";
|
|
323
|
+
let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
|
|
324
|
+
builder
|
|
325
|
+
.with_runner_key(runner_key)
|
|
326
|
+
.with_version(1)
|
|
327
|
+
.with_total_slots(10)
|
|
328
|
+
.with_actor_behavior("test", |_config| Box::new(common::EchoActor::new()))
|
|
329
|
+
})
|
|
330
|
+
.await;
|
|
331
|
+
let runner_id = runner.wait_ready().await;
|
|
332
|
+
tracing::info!(?runner_id, "runner connected");
|
|
333
|
+
|
|
334
|
+
// 2. Create an actor on the runner (runner_name_selector must match runner key)
|
|
335
|
+
// Use sleep policy - when runner shuts down gracefully, actor sleeps without error
|
|
336
|
+
let actor_id = create_actor(guard_port, &namespace, runner_key)
|
|
337
|
+
.await
|
|
338
|
+
.expect("actor creation should succeed");
|
|
339
|
+
tracing::info!(%actor_id, "actor created");
|
|
340
|
+
|
|
341
|
+
// Wait for actor to be allocated to runner
|
|
342
|
+
tokio::time::sleep(Duration::from_millis(500)).await;
|
|
343
|
+
|
|
344
|
+
// Verify actor is on the runner
|
|
345
|
+
assert!(
|
|
346
|
+
runner.has_actor(&actor_id).await,
|
|
347
|
+
"actor should be on the runner"
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// 3. Stop the runner (graceful shutdown)
|
|
351
|
+
runner.shutdown().await;
|
|
352
|
+
tracing::info!("runner shutdown");
|
|
353
|
+
|
|
354
|
+
// Wait for runner to be detected as gone
|
|
355
|
+
tokio::time::sleep(Duration::from_millis(1000)).await;
|
|
356
|
+
|
|
357
|
+
// 4. Wait for actor state to update
|
|
358
|
+
// With sleep policy and graceful shutdown, the actor sleeps without an error.
|
|
359
|
+
tokio::time::sleep(Duration::from_secs(1)).await;
|
|
360
|
+
|
|
361
|
+
// 5. Verify actor state via /actors API
|
|
362
|
+
let actor = get_actor(guard_port, &namespace, &actor_id)
|
|
363
|
+
.await
|
|
364
|
+
.expect("actor should exist");
|
|
365
|
+
tracing::info!(?actor, "actor from API");
|
|
366
|
+
|
|
367
|
+
// Actor should NOT be destroyed (sleep policy keeps it alive)
|
|
368
|
+
assert!(
|
|
369
|
+
actor.destroy_ts.is_none(),
|
|
370
|
+
"actor should not be destroyed with sleep policy"
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
// With graceful shutdown, no error should be set
|
|
374
|
+
assert!(
|
|
375
|
+
actor.error.is_none(),
|
|
376
|
+
"graceful shutdown should not set an error, got: {:?}",
|
|
377
|
+
actor.error
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
tracing::info!(
|
|
381
|
+
sleep_ts = ?actor.sleep_ts,
|
|
382
|
+
connectable_ts = ?actor.connectable_ts,
|
|
383
|
+
"actor state after graceful runner shutdown"
|
|
384
|
+
);
|
|
385
|
+
},
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
#[test]
|
|
390
|
+
fn serverless_stream_ended_then_http_error() {
|
|
391
|
+
common::run(
|
|
392
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
393
|
+
|ctx| async move {
|
|
394
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
395
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
396
|
+
|
|
397
|
+
// Start mock that returns empty SSE stream on first connection (StreamEndedEarly),
|
|
398
|
+
// then returns 503 on subsequent connections
|
|
399
|
+
let (mock_addr, _mock_handle, connection_count) =
|
|
400
|
+
start_mock_serverless_stream_then_fail(503).await;
|
|
401
|
+
let serverless_url = format!("http://{}", mock_addr);
|
|
402
|
+
|
|
403
|
+
let runner_name = format!("serverless-stream-{}", rand::random::<u16>());
|
|
404
|
+
create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
|
|
405
|
+
.await;
|
|
406
|
+
|
|
407
|
+
let actor_id = create_actor(guard_port, &namespace, &runner_name)
|
|
408
|
+
.await
|
|
409
|
+
.expect("actor creation should succeed");
|
|
410
|
+
|
|
411
|
+
// Make a request to the actor via guard - this should timeout with actor_ready_timeout
|
|
412
|
+
let guard_response = request_guard(guard_port, actor_id.clone(), 25)
|
|
413
|
+
.await
|
|
414
|
+
.expect("guard request task panicked")
|
|
415
|
+
.expect("guard request failed");
|
|
416
|
+
|
|
417
|
+
assert!(
|
|
418
|
+
!guard_response.status().is_success(),
|
|
419
|
+
"guard request should have failed"
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
let guard_body: serde_json::Value = guard_response.json().await.unwrap();
|
|
423
|
+
// Guard should fail fast with actor_runner_failed when pool has errors
|
|
424
|
+
assert_eq!(
|
|
425
|
+
guard_body["code"], "actor_runner_failed",
|
|
426
|
+
"expected actor_runner_failed error (fail-fast), got: {:?}",
|
|
427
|
+
guard_body
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
// Verify multiple connections were made (retry after StreamEndedEarly)
|
|
431
|
+
assert!(
|
|
432
|
+
connection_count.load(Ordering::SeqCst) >= 2,
|
|
433
|
+
"expected at least 2 connections, got {}",
|
|
434
|
+
connection_count.load(Ordering::SeqCst)
|
|
435
|
+
);
|
|
436
|
+
|
|
437
|
+
// Verify the pool error via runner configs API - should show the most recent error (503)
|
|
438
|
+
let pool_error = get_runner_config_pool_error(guard_port, &namespace, &runner_name)
|
|
439
|
+
.await
|
|
440
|
+
.expect("pool should have error after failed connection");
|
|
441
|
+
|
|
442
|
+
match &pool_error {
|
|
443
|
+
rivet_types::actor::RunnerPoolError::ServerlessHttpError {
|
|
444
|
+
status_code,
|
|
445
|
+
body: _,
|
|
446
|
+
} => {
|
|
447
|
+
assert_eq!(*status_code, 503, "expected HTTP 503 error");
|
|
448
|
+
}
|
|
449
|
+
other => panic!("expected ServerlessHttpError, got: {:?}", other),
|
|
450
|
+
}
|
|
451
|
+
},
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/// Fetches runner config from the API and returns the pool_error if present.
|
|
456
|
+
async fn get_runner_config_pool_error(
|
|
457
|
+
guard_port: u16,
|
|
458
|
+
namespace: &str,
|
|
459
|
+
runner_name: &str,
|
|
460
|
+
) -> Option<rivet_types::actor::RunnerPoolError> {
|
|
461
|
+
let client = reqwest::Client::new();
|
|
462
|
+
let response = client
|
|
463
|
+
.get(format!(
|
|
464
|
+
"http://127.0.0.1:{}/runner-configs?namespace={}&runner_name={}",
|
|
465
|
+
guard_port, namespace, runner_name
|
|
466
|
+
))
|
|
467
|
+
.send()
|
|
468
|
+
.await
|
|
469
|
+
.unwrap();
|
|
470
|
+
|
|
471
|
+
if !response.status().is_success() {
|
|
472
|
+
panic!(
|
|
473
|
+
"failed to get runner config: {}",
|
|
474
|
+
response.text().await.unwrap()
|
|
475
|
+
);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
let body: serde_json::Value = response.json().await.unwrap();
|
|
479
|
+
let runner_configs = body["runner_configs"].as_object().unwrap();
|
|
480
|
+
let config = runner_configs.get(runner_name)?;
|
|
481
|
+
|
|
482
|
+
// The public API returns datacenters nested under each runner config
|
|
483
|
+
let dc_config = config["datacenters"]["dc-1"].as_object()?;
|
|
484
|
+
|
|
485
|
+
// Parse pool_error if present
|
|
486
|
+
// Handle both string format (for errors without fields) and object format (for errors with fields)
|
|
487
|
+
dc_config.get("runner_pool_error").map(|_| {
|
|
488
|
+
serde_json::from_value(config["datacenters"]["dc-1"]["runner_pool_error"].clone()).unwrap()
|
|
489
|
+
})
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/// Tests that both the runner configs API and actor API return pool errors for serverless configs.
|
|
493
|
+
#[test]
|
|
494
|
+
fn runner_config_returns_pool_error() {
|
|
495
|
+
common::run(
|
|
496
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
497
|
+
|ctx| async move {
|
|
498
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
499
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
500
|
+
|
|
501
|
+
// Start mock that always returns 500 error
|
|
502
|
+
let (mock_addr, _mock_handle) = start_mock_serverless(500).await;
|
|
503
|
+
let serverless_url = format!("http://{}", mock_addr);
|
|
504
|
+
|
|
505
|
+
let runner_name = format!("serverless-poolerror-{}", rand::random::<u16>());
|
|
506
|
+
create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
|
|
507
|
+
.await;
|
|
508
|
+
|
|
509
|
+
// Initially, there should be no pool error
|
|
510
|
+
let error = get_runner_config_pool_error(guard_port, &namespace, &runner_name).await;
|
|
511
|
+
assert!(error.is_none(), "should have no pool error initially");
|
|
512
|
+
|
|
513
|
+
// Create actor to trigger a serverless connection attempt
|
|
514
|
+
let _actor_id = create_actor(guard_port, &namespace, &runner_name)
|
|
515
|
+
.await
|
|
516
|
+
.expect("actor creation should succeed");
|
|
517
|
+
|
|
518
|
+
// Wait for the error tracker to be populated
|
|
519
|
+
tokio::time::sleep(Duration::from_millis(1000)).await;
|
|
520
|
+
|
|
521
|
+
// Now there should be a pool error in runner configs API
|
|
522
|
+
let pool_error =
|
|
523
|
+
get_runner_config_pool_error(guard_port, &namespace, &runner_name).await;
|
|
524
|
+
assert!(
|
|
525
|
+
pool_error.is_some(),
|
|
526
|
+
"should have pool error after failed connection"
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
match pool_error.unwrap() {
|
|
530
|
+
rivet_types::actor::RunnerPoolError::ServerlessHttpError {
|
|
531
|
+
status_code,
|
|
532
|
+
body: _,
|
|
533
|
+
} => {
|
|
534
|
+
assert_eq!(status_code, 500, "expected HTTP 500 error");
|
|
535
|
+
}
|
|
536
|
+
other => panic!("expected ServerlessHttpError, got: {:?}", other),
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/// Tests that the guard returns `actor_runner_failed` quickly when the serverless pool has errors.
|
|
543
|
+
/// This verifies the fail-fast behavior - guard should detect pool errors and fail within a few
|
|
544
|
+
/// seconds instead of waiting for the full timeout.
|
|
545
|
+
#[test]
|
|
546
|
+
fn guard_fails_fast_on_pool_error() {
|
|
547
|
+
common::run(
|
|
548
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
549
|
+
|ctx| async move {
|
|
550
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
551
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
552
|
+
|
|
553
|
+
// Start mock that always returns 500 error
|
|
554
|
+
let (mock_addr, _mock_handle) = start_mock_serverless(500).await;
|
|
555
|
+
let serverless_url = format!("http://{}", mock_addr);
|
|
556
|
+
|
|
557
|
+
let runner_name = format!("serverless-failfast-{}", rand::random::<u16>());
|
|
558
|
+
create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
|
|
559
|
+
.await;
|
|
560
|
+
|
|
561
|
+
// Create actor - this triggers the first serverless connection attempt which will fail
|
|
562
|
+
// and populate the error tracker
|
|
563
|
+
let actor_id = create_actor(guard_port, &namespace, &runner_name)
|
|
564
|
+
.await
|
|
565
|
+
.expect("actor creation should succeed initially");
|
|
566
|
+
|
|
567
|
+
// Wait a bit for the error tracker to be populated
|
|
568
|
+
tokio::time::sleep(Duration::from_millis(500)).await;
|
|
569
|
+
|
|
570
|
+
// Make a request to the actor via guard
|
|
571
|
+
// This should fail fast with actor_runner_failed (within ~3 seconds)
|
|
572
|
+
// instead of waiting for the full 10 second timeout
|
|
573
|
+
let start = std::time::Instant::now();
|
|
574
|
+
let guard_response = request_guard(guard_port, actor_id.clone(), 15)
|
|
575
|
+
.await
|
|
576
|
+
.expect("guard request task panicked")
|
|
577
|
+
.expect("guard request failed");
|
|
578
|
+
let elapsed = start.elapsed();
|
|
579
|
+
|
|
580
|
+
assert!(
|
|
581
|
+
!guard_response.status().is_success(),
|
|
582
|
+
"guard request should have failed"
|
|
583
|
+
);
|
|
584
|
+
|
|
585
|
+
let guard_body: serde_json::Value = guard_response.json().await.unwrap();
|
|
586
|
+
|
|
587
|
+
// Should be actor_runner_failed (fail-fast) not actor_ready_timeout
|
|
588
|
+
assert_eq!(
|
|
589
|
+
guard_body["code"], "actor_runner_failed",
|
|
590
|
+
"expected actor_runner_failed error (fail-fast), got: {:?}",
|
|
591
|
+
guard_body
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
// Should fail fast - within ~3 seconds (1s delay + 1 check cycle + buffer)
|
|
595
|
+
// Definitely should not take the full 10 second timeout
|
|
596
|
+
assert!(
|
|
597
|
+
elapsed.as_secs() < 5,
|
|
598
|
+
"guard should fail fast, but took {:?}",
|
|
599
|
+
elapsed
|
|
600
|
+
);
|
|
601
|
+
|
|
602
|
+
tracing::info!(?elapsed, "guard failed fast as expected");
|
|
603
|
+
},
|
|
604
|
+
);
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
/// Tests that the RunnerNoResponse error is set when a runner crashes (ungraceful disconnect)
|
|
608
|
+
/// while an actor is allocated to it.
|
|
609
|
+
#[test]
|
|
610
|
+
fn runner_no_response_error() {
|
|
611
|
+
common::run(
|
|
612
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
613
|
+
|ctx| async move {
|
|
614
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
615
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
616
|
+
|
|
617
|
+
// 1. Connect a runner
|
|
618
|
+
let runner_name = "crash-test-runner";
|
|
619
|
+
let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
|
|
620
|
+
builder
|
|
621
|
+
.with_runner_name(runner_name)
|
|
622
|
+
.with_version(1)
|
|
623
|
+
.with_total_slots(10)
|
|
624
|
+
// Actor that never sends running state (simulates being stuck)
|
|
625
|
+
.with_actor_behavior("test", |_config| Box::new(common::TimeoutActor))
|
|
626
|
+
})
|
|
627
|
+
.await;
|
|
628
|
+
let runner_id = runner.wait_ready().await;
|
|
629
|
+
tracing::info!(?runner_id, "runner connected");
|
|
630
|
+
|
|
631
|
+
// 2. Create an actor that will be allocated to the runner
|
|
632
|
+
// Use sleep policy - when runner crashes, actor sleeps with RunnerNoResponse error
|
|
633
|
+
let actor_id = create_actor(guard_port, &namespace, runner_name)
|
|
634
|
+
.await
|
|
635
|
+
.expect("actor creation should succeed");
|
|
636
|
+
tracing::info!(%actor_id, "actor created");
|
|
637
|
+
|
|
638
|
+
// Wait for actor to be allocated
|
|
639
|
+
tokio::time::sleep(Duration::from_millis(500)).await;
|
|
640
|
+
|
|
641
|
+
// Verify actor is on the runner
|
|
642
|
+
assert!(
|
|
643
|
+
runner.has_actor(&actor_id).await,
|
|
644
|
+
"actor should be on the runner"
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
// 3. Crash the runner (ungraceful disconnect without cleanup)
|
|
648
|
+
runner.crash().await;
|
|
649
|
+
tracing::info!("runner crashed");
|
|
650
|
+
|
|
651
|
+
// 4. Wait for actor to get RunnerNoResponse error
|
|
652
|
+
// With sleep policy, the actor gets RunnerNoResponse from the runner crash and sleeps
|
|
653
|
+
let actor_error =
|
|
654
|
+
wait_for_actor_error(guard_port, &namespace, &actor_id, Duration::from_secs(15))
|
|
655
|
+
.await
|
|
656
|
+
.expect("actor should have error after runner crash");
|
|
657
|
+
|
|
658
|
+
tracing::info!(?actor_error, "actor error received");
|
|
659
|
+
|
|
660
|
+
// The error is RunnerNoResponse because the runner crashed while actor was allocated
|
|
661
|
+
match actor_error {
|
|
662
|
+
rivet_types::actor::ActorError::RunnerNoResponse { runner_id } => {
|
|
663
|
+
tracing::info!(?runner_id, "got RunnerNoResponse error as expected");
|
|
664
|
+
}
|
|
665
|
+
other => panic!("expected RunnerNoResponse error, got: {:?}", other),
|
|
666
|
+
}
|
|
667
|
+
},
|
|
668
|
+
);
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/// Tests that an actor with "destroy" crash policy is destroyed when it crashes.
|
|
672
|
+
#[test]
|
|
673
|
+
fn actor_crash_destroy_policy() {
|
|
674
|
+
common::run(
|
|
675
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
676
|
+
|ctx| async move {
|
|
677
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
678
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
679
|
+
|
|
680
|
+
// 1. Connect a runner with an actor that crashes on start
|
|
681
|
+
let runner_name = "crash-destroy-runner";
|
|
682
|
+
let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
|
|
683
|
+
builder
|
|
684
|
+
.with_runner_name(runner_name)
|
|
685
|
+
.with_version(1)
|
|
686
|
+
.with_total_slots(10)
|
|
687
|
+
.with_actor_behavior("test", |_config| {
|
|
688
|
+
Box::new(common::CrashOnStartActor::new(1))
|
|
689
|
+
})
|
|
690
|
+
})
|
|
691
|
+
.await;
|
|
692
|
+
let runner_id = runner.wait_ready().await;
|
|
693
|
+
tracing::info!(?runner_id, "runner connected");
|
|
694
|
+
|
|
695
|
+
// 2. Create an actor with "destroy" crash policy
|
|
696
|
+
let actor_id = create_actor_with_policy(guard_port, &namespace, runner_name, "destroy")
|
|
697
|
+
.await
|
|
698
|
+
.expect("actor creation should succeed");
|
|
699
|
+
tracing::info!(%actor_id, "actor created");
|
|
700
|
+
|
|
701
|
+
// 3. Wait for actor to be destroyed
|
|
702
|
+
let start = std::time::Instant::now();
|
|
703
|
+
let timeout = Duration::from_secs(10);
|
|
704
|
+
loop {
|
|
705
|
+
if start.elapsed() > timeout {
|
|
706
|
+
panic!("timeout waiting for actor to be destroyed");
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
let actor = get_actor(guard_port, &namespace, &actor_id)
|
|
710
|
+
.await
|
|
711
|
+
.expect("actor should exist");
|
|
712
|
+
|
|
713
|
+
if actor.destroy_ts.is_some() {
|
|
714
|
+
tracing::info!(?actor.destroy_ts, "actor destroyed as expected");
|
|
715
|
+
// With destroy policy, no error should be set since actor is gone
|
|
716
|
+
assert!(
|
|
717
|
+
actor.error.is_none(),
|
|
718
|
+
"destroyed actor should not have error set: {:?}",
|
|
719
|
+
actor.error
|
|
720
|
+
);
|
|
721
|
+
break;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
tokio::time::sleep(Duration::from_millis(200)).await;
|
|
725
|
+
}
|
|
726
|
+
},
|
|
727
|
+
);
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/// Tests that an actor with "sleep" crash policy enters sleep state with Crashed error.
|
|
731
|
+
#[test]
|
|
732
|
+
fn actor_crash_sleep_policy() {
|
|
733
|
+
common::run(
|
|
734
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
735
|
+
|ctx| async move {
|
|
736
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
737
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
738
|
+
|
|
739
|
+
// 1. Connect a runner with an actor that crashes on start
|
|
740
|
+
let runner_name = "crash-sleep-runner";
|
|
741
|
+
let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
|
|
742
|
+
builder
|
|
743
|
+
.with_runner_name(runner_name)
|
|
744
|
+
.with_version(1)
|
|
745
|
+
.with_total_slots(10)
|
|
746
|
+
.with_actor_behavior("test", |_config| {
|
|
747
|
+
Box::new(common::CrashOnStartActor::new(1))
|
|
748
|
+
})
|
|
749
|
+
})
|
|
750
|
+
.await;
|
|
751
|
+
let runner_id = runner.wait_ready().await;
|
|
752
|
+
tracing::info!(?runner_id, "runner connected");
|
|
753
|
+
|
|
754
|
+
// 2. Create an actor with "sleep" crash policy
|
|
755
|
+
let actor_id = create_actor_with_policy(guard_port, &namespace, runner_name, "sleep")
|
|
756
|
+
.await
|
|
757
|
+
.expect("actor creation should succeed");
|
|
758
|
+
tracing::info!(%actor_id, "actor created");
|
|
759
|
+
|
|
760
|
+
// 3. Wait for actor to crash and enter sleep state with error
|
|
761
|
+
let start = std::time::Instant::now();
|
|
762
|
+
let timeout = Duration::from_secs(10);
|
|
763
|
+
loop {
|
|
764
|
+
if start.elapsed() > timeout {
|
|
765
|
+
panic!("timeout waiting for actor to enter sleep state");
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
let actor = get_actor(guard_port, &namespace, &actor_id)
|
|
769
|
+
.await
|
|
770
|
+
.expect("actor should exist");
|
|
771
|
+
|
|
772
|
+
if actor.sleep_ts.is_some() {
|
|
773
|
+
tracing::info!(?actor.sleep_ts, ?actor.error, "actor sleeping as expected");
|
|
774
|
+
|
|
775
|
+
// Verify it has a Crashed error
|
|
776
|
+
match actor.error {
|
|
777
|
+
Some(rivet_types::actor::ActorError::Crashed { message }) => {
|
|
778
|
+
tracing::info!(?message, "got Crashed error as expected");
|
|
779
|
+
assert!(
|
|
780
|
+
message.as_ref().map_or(false, |m| m.contains("crash")),
|
|
781
|
+
"crash message should mention crash: {:?}",
|
|
782
|
+
message
|
|
783
|
+
);
|
|
784
|
+
}
|
|
785
|
+
other => panic!("expected Crashed error, got: {:?}", other),
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
// Actor should not be destroyed
|
|
789
|
+
assert!(
|
|
790
|
+
actor.destroy_ts.is_none(),
|
|
791
|
+
"sleeping actor should not be destroyed"
|
|
792
|
+
);
|
|
793
|
+
break;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
tokio::time::sleep(Duration::from_millis(200)).await;
|
|
797
|
+
}
|
|
798
|
+
},
|
|
799
|
+
);
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
/// Tests that an actor with "restart" crash policy keeps restarting after crash.
|
|
803
|
+
#[test]
|
|
804
|
+
fn actor_crash_restart_policy() {
|
|
805
|
+
common::run(
|
|
806
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
807
|
+
|ctx| async move {
|
|
808
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
809
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
810
|
+
|
|
811
|
+
// 1. Connect a runner with an actor that crashes on start
|
|
812
|
+
// Track crash count to verify restarts
|
|
813
|
+
let crash_count = Arc::new(AtomicU32::new(0));
|
|
814
|
+
let crash_count_clone = crash_count.clone();
|
|
815
|
+
|
|
816
|
+
let runner_name = "crash-restart-runner";
|
|
817
|
+
let runner = common::setup_runner(ctx.leader_dc(), &namespace, |builder| {
|
|
818
|
+
builder
|
|
819
|
+
.with_runner_name(runner_name)
|
|
820
|
+
.with_version(1)
|
|
821
|
+
.with_total_slots(10)
|
|
822
|
+
.with_actor_behavior("test", move |_config| {
|
|
823
|
+
let crash_count = crash_count_clone.clone();
|
|
824
|
+
Box::new(common::CountingCrashActor::new(crash_count))
|
|
825
|
+
})
|
|
826
|
+
})
|
|
827
|
+
.await;
|
|
828
|
+
let runner_id = runner.wait_ready().await;
|
|
829
|
+
tracing::info!(?runner_id, "runner connected");
|
|
830
|
+
|
|
831
|
+
// 2. Create an actor with "restart" crash policy
|
|
832
|
+
let actor_id = create_actor_with_policy(guard_port, &namespace, runner_name, "restart")
|
|
833
|
+
.await
|
|
834
|
+
.expect("actor creation should succeed");
|
|
835
|
+
tracing::info!(%actor_id, "actor created");
|
|
836
|
+
|
|
837
|
+
// 3. Wait for multiple crashes to confirm restart behavior
|
|
838
|
+
let start = std::time::Instant::now();
|
|
839
|
+
let timeout = Duration::from_secs(10);
|
|
840
|
+
loop {
|
|
841
|
+
if start.elapsed() > timeout {
|
|
842
|
+
let count = crash_count.load(Ordering::SeqCst);
|
|
843
|
+
panic!(
|
|
844
|
+
"timeout waiting for restart behavior, crash count: {}",
|
|
845
|
+
count
|
|
846
|
+
);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
let count = crash_count.load(Ordering::SeqCst);
|
|
850
|
+
if count >= 2 {
|
|
851
|
+
tracing::info!(count, "actor restarted multiple times as expected");
|
|
852
|
+
|
|
853
|
+
// Verify actor is not destroyed or sleeping
|
|
854
|
+
let actor = get_actor(guard_port, &namespace, &actor_id)
|
|
855
|
+
.await
|
|
856
|
+
.expect("actor should exist");
|
|
857
|
+
|
|
858
|
+
assert!(
|
|
859
|
+
actor.destroy_ts.is_none(),
|
|
860
|
+
"restarting actor should not be destroyed"
|
|
861
|
+
);
|
|
862
|
+
assert!(
|
|
863
|
+
actor.sleep_ts.is_none(),
|
|
864
|
+
"restarting actor should not be sleeping"
|
|
865
|
+
);
|
|
866
|
+
|
|
867
|
+
break;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
tokio::time::sleep(Duration::from_millis(200)).await;
|
|
871
|
+
}
|
|
872
|
+
},
|
|
873
|
+
);
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/// Tests that ServerlessConnectionError is returned when the serverless URL refuses connections.
|
|
877
|
+
#[test]
|
|
878
|
+
fn serverless_connection_refused_error() {
|
|
879
|
+
common::run(
|
|
880
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
881
|
+
|ctx| async move {
|
|
882
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
883
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
884
|
+
|
|
885
|
+
// Use a URL that will refuse connections (bind to get a port, then drop the listener)
|
|
886
|
+
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
|
|
887
|
+
let addr = listener.local_addr().unwrap();
|
|
888
|
+
drop(listener); // Drop immediately so nothing is listening
|
|
889
|
+
|
|
890
|
+
let serverless_url = format!("http://{}", addr);
|
|
891
|
+
|
|
892
|
+
let runner_name = format!("serverless-connrefused-{}", rand::random::<u16>());
|
|
893
|
+
create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
|
|
894
|
+
.await;
|
|
895
|
+
|
|
896
|
+
// Create actor to trigger serverless connection attempt
|
|
897
|
+
let _actor_id = create_actor(guard_port, &namespace, &runner_name)
|
|
898
|
+
.await
|
|
899
|
+
.expect("actor creation should succeed");
|
|
900
|
+
|
|
901
|
+
// Wait for error to be tracked
|
|
902
|
+
tokio::time::sleep(Duration::from_millis(1500)).await;
|
|
903
|
+
|
|
904
|
+
// Verify pool error is a connection error
|
|
905
|
+
let pool_error = get_runner_config_pool_error(guard_port, &namespace, &runner_name)
|
|
906
|
+
.await
|
|
907
|
+
.expect("pool should have error after connection refused");
|
|
908
|
+
|
|
909
|
+
tracing::info!(?pool_error, "pool error received");
|
|
910
|
+
|
|
911
|
+
match pool_error {
|
|
912
|
+
rivet_types::actor::RunnerPoolError::ServerlessConnectionError { message } => {
|
|
913
|
+
tracing::info!(?message, "got ServerlessConnectionError as expected");
|
|
914
|
+
// Connection refused messages vary by OS
|
|
915
|
+
assert!(
|
|
916
|
+
message.to_lowercase().contains("connect")
|
|
917
|
+
|| message.to_lowercase().contains("refused")
|
|
918
|
+
|| message.to_lowercase().contains("error"),
|
|
919
|
+
"error message should mention connection issue: {}",
|
|
920
|
+
message
|
|
921
|
+
);
|
|
922
|
+
}
|
|
923
|
+
other => panic!("expected ServerlessConnectionError, got: {:?}", other),
|
|
924
|
+
}
|
|
925
|
+
},
|
|
926
|
+
);
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
/// Tests that ServerlessInvalidSsePayload error is returned when the serverless endpoint
|
|
930
|
+
/// returns malformed SSE data.
|
|
931
|
+
#[test]
|
|
932
|
+
fn serverless_invalid_payload_error() {
|
|
933
|
+
common::run(
|
|
934
|
+
common::TestOpts::new(1).with_timeout(30),
|
|
935
|
+
|ctx| async move {
|
|
936
|
+
let guard_port = ctx.leader_dc().guard_port();
|
|
937
|
+
let (namespace, _) = common::setup_test_namespace(ctx.leader_dc()).await;
|
|
938
|
+
|
|
939
|
+
// Start mock that returns valid SSE stream but with invalid JSON payload
|
|
940
|
+
let (mock_addr, _mock_handle) = start_mock_serverless_invalid_payload().await;
|
|
941
|
+
let serverless_url = format!("http://{}", mock_addr);
|
|
942
|
+
|
|
943
|
+
let runner_name = format!("serverless-invalid-{}", rand::random::<u16>());
|
|
944
|
+
create_serverless_runner_config(guard_port, &namespace, &runner_name, &serverless_url)
|
|
945
|
+
.await;
|
|
946
|
+
|
|
947
|
+
// Create actor to trigger serverless connection attempt
|
|
948
|
+
let _actor_id = create_actor(guard_port, &namespace, &runner_name)
|
|
949
|
+
.await
|
|
950
|
+
.expect("actor creation should succeed");
|
|
951
|
+
|
|
952
|
+
// Wait for error to be tracked
|
|
953
|
+
tokio::time::sleep(Duration::from_millis(1500)).await;
|
|
954
|
+
|
|
955
|
+
// Verify pool error is a base64 or payload error
|
|
956
|
+
let pool_error =
|
|
957
|
+
get_runner_config_pool_error(guard_port, &namespace, &runner_name).await;
|
|
958
|
+
|
|
959
|
+
let pool_error = pool_error.expect("pool should have error after invalid payload");
|
|
960
|
+
|
|
961
|
+
tracing::info!(?pool_error, "pool error received");
|
|
962
|
+
|
|
963
|
+
match pool_error {
|
|
964
|
+
rivet_types::actor::RunnerPoolError::ServerlessInvalidSsePayload {
|
|
965
|
+
message,
|
|
966
|
+
..
|
|
967
|
+
} => {
|
|
968
|
+
tracing::info!(?message, "got ServerlessInvalidSsePayload as expected");
|
|
969
|
+
}
|
|
970
|
+
other => panic!("expected ServerlessInvalidSsePayload, got: {:?}", other),
|
|
971
|
+
}
|
|
972
|
+
},
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/// Starts a mock serverless that returns valid SSE stream but with invalid JSON payload.
|
|
977
|
+
async fn start_mock_serverless_invalid_payload() -> (SocketAddr, tokio::task::JoinHandle<()>) {
|
|
978
|
+
use axum::{
|
|
979
|
+
Router,
|
|
980
|
+
body::Body,
|
|
981
|
+
http::{Response, StatusCode, header},
|
|
982
|
+
routing::any,
|
|
983
|
+
};
|
|
984
|
+
|
|
985
|
+
// Handle all routes with invalid SSE payload
|
|
986
|
+
let router = Router::new().fallback(any(|| async {
|
|
987
|
+
// Return valid SSE format but with invalid JSON in the data field
|
|
988
|
+
let invalid_sse = "data: not-valid-json\n\n";
|
|
989
|
+
Response::builder()
|
|
990
|
+
.status(StatusCode::OK)
|
|
991
|
+
.header(header::CONTENT_TYPE, "text/event-stream")
|
|
992
|
+
.header(header::CACHE_CONTROL, "no-cache")
|
|
993
|
+
.body(Body::from(invalid_sse))
|
|
994
|
+
.unwrap()
|
|
995
|
+
}));
|
|
996
|
+
|
|
997
|
+
let listener = tokio::net::TcpListener::bind("127.0.0.1:0").await.unwrap();
|
|
998
|
+
let addr = listener.local_addr().unwrap();
|
|
999
|
+
|
|
1000
|
+
let handle = tokio::spawn(async move {
|
|
1001
|
+
axum::serve(listener, router).await.unwrap();
|
|
1002
|
+
});
|
|
1003
|
+
|
|
1004
|
+
(addr, handle)
|
|
1005
|
+
}
|