From 7b5a7401917ca990152ddca0982e8ddf1db49302 Mon Sep 17 00:00:00 2001 From: Drew Newberry Date: Fri, 13 Mar 2026 07:53:00 -0700 Subject: [PATCH] fix(sandbox): increase provisioning timeout from 120s to 300s Large sandbox images (e.g. 852MB base image) can take ~3 minutes to pull, exceeding the previous 120s timeout. Bump to 300s across all surfaces: CLI watch loop, server orphan grace period, TUI ready poll, Python SDK wait_ready default, and E2E test harness. --- crates/openshell-cli/src/run.rs | 2 +- crates/openshell-server/src/sandbox/mod.rs | 2 +- crates/openshell-tui/src/lib.rs | 2 +- e2e/rust/src/harness/sandbox.rs | 2 +- python/openshell/sandbox.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/openshell-cli/src/run.rs b/crates/openshell-cli/src/run.rs index 12b891da1..9e62e6455 100644 --- a/crates/openshell-cli/src/run.rs +++ b/crates/openshell-cli/src/run.rs @@ -1993,7 +1993,7 @@ pub async fn sandbox_create( // Track whether we have seen a non-Ready phase during the watch. let mut saw_non_ready = SandboxPhase::try_from(sandbox.phase) != Ok(SandboxPhase::Ready); let start_time = Instant::now(); - let provision_timeout = Duration::from_secs(120); + let provision_timeout = Duration::from_secs(300); // Track whether we saw the gateway become ready (from log messages). let mut saw_gateway_ready = false; diff --git a/crates/openshell-server/src/sandbox/mod.rs b/crates/openshell-server/src/sandbox/mod.rs index 2fd9b54b6..f8ab6a6dd 100644 --- a/crates/openshell-server/src/sandbox/mod.rs +++ b/crates/openshell-server/src/sandbox/mod.rs @@ -381,7 +381,7 @@ const RECONCILE_INTERVAL: Duration = Duration::from_secs(60); /// How long a sandbox can stay in `Provisioning` in the store without a /// corresponding Kubernetes resource before it is considered orphaned and /// removed. -const ORPHAN_GRACE_PERIOD: Duration = Duration::from_secs(120); +const ORPHAN_GRACE_PERIOD: Duration = Duration::from_secs(300); /// Periodically reconcile the store against Kubernetes to clean up orphaned /// sandbox records. A record is orphaned when it exists in the store but diff --git a/crates/openshell-tui/src/lib.rs b/crates/openshell-tui/src/lib.rs index 9255ae0b2..98f4ed0d6 100644 --- a/crates/openshell-tui/src/lib.rs +++ b/crates/openshell-tui/src/lib.rs @@ -1256,7 +1256,7 @@ fn spawn_create_sandbox(app: &mut App, tx: mpsc::UnboundedSender) { let mut attempts = 0; let sandbox_id = loop { attempts += 1; - if attempts > 60 { + if attempts > 150 { let _ = tx.send(Event::CreateResult(Err( "timed out waiting for sandbox to be ready".to_string(), ))); diff --git a/e2e/rust/src/harness/sandbox.rs b/e2e/rust/src/harness/sandbox.rs index da48c5ed2..7a942265d 100644 --- a/e2e/rust/src/harness/sandbox.rs +++ b/e2e/rust/src/harness/sandbox.rs @@ -25,7 +25,7 @@ fn extract_sandbox_name(output: &str) -> Option { } /// Default timeout for waiting for a sandbox to become ready. -const SANDBOX_READY_TIMEOUT: Duration = Duration::from_secs(120); +const SANDBOX_READY_TIMEOUT: Duration = Duration::from_secs(300); /// RAII guard that deletes a sandbox on drop. /// diff --git a/python/openshell/sandbox.py b/python/openshell/sandbox.py index 6507c9a45..7b48ab3b9 100644 --- a/python/openshell/sandbox.py +++ b/python/openshell/sandbox.py @@ -248,7 +248,7 @@ class SandboxClient: raise SandboxError(f"sandbox {sandbox_name} was not deleted within timeout") def wait_ready( - self, sandbox_name: str, *, timeout_seconds: float = 120.0 + self, sandbox_name: str, *, timeout_seconds: float = 300.0 ) -> SandboxRef: deadline = time.time() + timeout_seconds while time.time() < deadline: