From 4492665effde8e48b71725b507120cf6abcd5d89 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 27 Aug 2026 13:33:29 -0700 Subject: [PATCH 1/3] fix(rivetkit): restore local engine development thresholds --- .../packages/engine-process/src/lib.rs | 56 ++++++++++++++++++- scripts/run/dev-env.sh | 10 ++-- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/rivetkit-rust/packages/engine-process/src/lib.rs b/rivetkit-rust/packages/engine-process/src/lib.rs index 7e96885e48..1a837b24a1 100644 --- a/rivetkit-rust/packages/engine-process/src/lib.rs +++ b/rivetkit-rust/packages/engine-process/src/lib.rs @@ -367,7 +367,9 @@ fn pid_is_alive(_pid: u32) -> bool { /// /// Shared by the spawn path and by callers that exec the engine binary /// directly (for example the CLI `engine` proxy) so both operate on the same -/// database, guard, api-peer, and metrics ports. +/// database, guard, api-peer, and metrics ports. These callers are local +/// development processes, so the Engine recovery and shutdown thresholds are +/// intentionally shorter than the production defaults. pub fn engine_env(config: &EngineResolverConfig) -> Result> { let endpoint = &config.endpoint; let endpoint_url = @@ -400,6 +402,42 @@ pub fn engine_env(config: &EngineResolverConfig) -> Result "RIVET__FILE_SYSTEM__PATH".to_owned(), db_path.to_string_lossy().into_owned(), ), + ( + "RIVET__PEGBOARD__RETRY_RESET_DURATION".to_owned(), + "100".to_owned(), + ), + ( + "RIVET__PEGBOARD__BASE_RETRY_TIMEOUT".to_owned(), + "100".to_owned(), + ), + ( + "RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT".to_owned(), + "1".to_owned(), + ), + ( + "RIVET__PEGBOARD__ENVOY_ELIGIBLE_THRESHOLD".to_owned(), + "5000".to_owned(), + ), + ( + "RIVET__PEGBOARD__ENVOY_LOST_THRESHOLD".to_owned(), + "7000".to_owned(), + ), + ( + "RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL".to_owned(), + "1000".to_owned(), + ), + ( + "RIVET__RUNTIME__WORKER_SHUTDOWN_DURATION".to_owned(), + "1".to_owned(), + ), + ( + "RIVET__RUNTIME__GUARD_SHUTDOWN_DURATION".to_owned(), + "1".to_owned(), + ), + ( + "RIVET__RUNTIME__FORCE_SHUTDOWN_DURATION".to_owned(), + "2".to_owned(), + ), ]) } @@ -991,6 +1029,22 @@ mod tests { assert_eq!(resolve_bind_host(&config).unwrap(), "0.0.0.0"); } + #[test] + fn engine_env_uses_development_recovery_thresholds() { + let env = engine_env(&test_config(String::new(), false)).expect("build engine env"); + let env = env.into_iter().collect::>(); + + assert_eq!(env["RIVET__PEGBOARD__RETRY_RESET_DURATION"], "100"); + assert_eq!(env["RIVET__PEGBOARD__BASE_RETRY_TIMEOUT"], "100"); + assert_eq!(env["RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT"], "1"); + assert_eq!(env["RIVET__PEGBOARD__ENVOY_ELIGIBLE_THRESHOLD"], "5000"); + assert_eq!(env["RIVET__PEGBOARD__ENVOY_LOST_THRESHOLD"], "7000"); + assert_eq!(env["RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL"], "1000"); + assert_eq!(env["RIVET__RUNTIME__WORKER_SHUTDOWN_DURATION"], "1"); + assert_eq!(env["RIVET__RUNTIME__GUARD_SHUTDOWN_DURATION"], "1"); + assert_eq!(env["RIVET__RUNTIME__FORCE_SHUTDOWN_DURATION"], "2"); + } + #[cfg(unix)] #[test] fn pid_is_alive_true_for_self_false_for_missing() { diff --git a/scripts/run/dev-env.sh b/scripts/run/dev-env.sh index 355bd911ed..72d0ebb5ce 100644 --- a/scripts/run/dev-env.sh +++ b/scripts/run/dev-env.sh @@ -1,17 +1,17 @@ # Development environment variables for running the Rivet engine locally. # Source this file before running the engine: source scripts/run/dev-env.sh # -# NOTE: When modifying these env vars, also update the env block in -# rivetkit-typescript/packages/rivetkit/src/engine-process/mod.ts to keep them in sync. +# NOTE: When modifying these env vars, also update `engine_env` in +# rivetkit-rust/packages/engine-process/src/lib.rs to keep them in sync. -# Reduce backoff for runner recovery (in milliseconds) +# Reduce backoff for actor recovery (in milliseconds) export RIVET__PEGBOARD__RETRY_RESET_DURATION="100" export RIVET__PEGBOARD__BASE_RETRY_TIMEOUT="100" export RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT="1" # Reduce thresholds for faster development iteration (in milliseconds) -export RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD="5000" -export RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD="7000" +export RIVET__PEGBOARD__ENVOY_ELIGIBLE_THRESHOLD="5000" +export RIVET__PEGBOARD__ENVOY_LOST_THRESHOLD="7000" # Allow faster metadata polling for hot-reload in development (in milliseconds) export RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL="1000" From 96de4572a5bd5955005d8ab47ba9112c54eed9c7 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 27 Aug 2026 15:15:37 -0700 Subject: [PATCH 2/3] fix(release): publish engine checksum manifest --- .github/workflows/publish.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 72473cafc8..05a0e62112 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -580,6 +580,13 @@ jobs: --retries 3 \ ${{ needs.context.outputs.trigger == 'release' && '--release-mode' || '' }} + - name: Generate engine checksum manifest + run: | + ( + cd engine-artifacts + sha256sum rivet-engine-* > SHA256SUMS + ) + - name: Upload engine binaries to R2 env: R2_RELEASES_ACCESS_KEY_ID: ${{ secrets.R2_RELEASES_ACCESS_KEY_ID }} From b5cac54a50103c0739b618f519ce32778119c3b4 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Thu, 27 Aug 2026 15:16:53 -0700 Subject: [PATCH 3/3] fix(rivetkit): tune legacy runner thresholds in development --- rivetkit-rust/packages/engine-process/src/lib.rs | 10 ++++++++++ scripts/run/dev-env.sh | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/rivetkit-rust/packages/engine-process/src/lib.rs b/rivetkit-rust/packages/engine-process/src/lib.rs index 1a837b24a1..43eb87d0b7 100644 --- a/rivetkit-rust/packages/engine-process/src/lib.rs +++ b/rivetkit-rust/packages/engine-process/src/lib.rs @@ -414,6 +414,14 @@ pub fn engine_env(config: &EngineResolverConfig) -> Result "RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT".to_owned(), "1".to_owned(), ), + ( + "RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD".to_owned(), + "5000".to_owned(), + ), + ( + "RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD".to_owned(), + "7000".to_owned(), + ), ( "RIVET__PEGBOARD__ENVOY_ELIGIBLE_THRESHOLD".to_owned(), "5000".to_owned(), @@ -1037,6 +1045,8 @@ mod tests { assert_eq!(env["RIVET__PEGBOARD__RETRY_RESET_DURATION"], "100"); assert_eq!(env["RIVET__PEGBOARD__BASE_RETRY_TIMEOUT"], "100"); assert_eq!(env["RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT"], "1"); + assert_eq!(env["RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD"], "5000"); + assert_eq!(env["RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD"], "7000"); assert_eq!(env["RIVET__PEGBOARD__ENVOY_ELIGIBLE_THRESHOLD"], "5000"); assert_eq!(env["RIVET__PEGBOARD__ENVOY_LOST_THRESHOLD"], "7000"); assert_eq!(env["RIVET__PEGBOARD__MIN_METADATA_POLL_INTERVAL"], "1000"); diff --git a/scripts/run/dev-env.sh b/scripts/run/dev-env.sh index 72d0ebb5ce..1fffc73799 100644 --- a/scripts/run/dev-env.sh +++ b/scripts/run/dev-env.sh @@ -10,6 +10,10 @@ export RIVET__PEGBOARD__BASE_RETRY_TIMEOUT="100" export RIVET__PEGBOARD__RESCHEDULE_BACKOFF_MAX_EXPONENT="1" # Reduce thresholds for faster development iteration (in milliseconds) +# Legacy runner paths still exist in older Engine builds, while RivetKit uses +# the Envoy path. Keep both tuned for local development. +export RIVET__PEGBOARD__RUNNER_ELIGIBLE_THRESHOLD="5000" +export RIVET__PEGBOARD__RUNNER_LOST_THRESHOLD="7000" export RIVET__PEGBOARD__ENVOY_ELIGIBLE_THRESHOLD="5000" export RIVET__PEGBOARD__ENVOY_LOST_THRESHOLD="7000"