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