From dcb3114d8cc0a76cbbff2218d5094eb28abb9d23 Mon Sep 17 00:00:00 2001 From: ABCxFF <79597906+abcxff@users.noreply.github.com> Date: Thu, 7 May 2026 20:13:26 +0000 Subject: [PATCH] fix(pegboard): validate drain_grace_period < request_lifespan --- .../packages/pegboard/src/ops/runner_config/upsert.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engine/packages/pegboard/src/ops/runner_config/upsert.rs b/engine/packages/pegboard/src/ops/runner_config/upsert.rs index 51eb91ff94..094b68e16c 100644 --- a/engine/packages/pegboard/src/ops/runner_config/upsert.rs +++ b/engine/packages/pegboard/src/ops/runner_config/upsert.rs @@ -29,6 +29,7 @@ pub async fn pegboard_runner_config_upsert(ctx: &OperationCtx, input: &Input) -> RunnerConfigKind::Serverless { url, headers, + request_lifespan, drain_grace_period, slots_per_runner, .. @@ -81,6 +82,15 @@ pub async fn pegboard_runner_config_upsert(ctx: &OperationCtx, input: &Input) -> .build()); } + if *drain_grace_period >= *request_lifespan { + return Err(errors::RunnerConfig::Invalid { + reason: format!( + "`drain_grace_period` must be less than `request_lifespan` ({drain_grace_period}s >= {request_lifespan}s)" + ), + } + .build()); + } + let actor_stop_threshold_ms = ctx.config().pegboard().actor_stop_threshold(); let drain_grace_period_ms = i64::from(*drain_grace_period) * 1000; if drain_grace_period_ms > actor_stop_threshold_ms {