From 14f943d802fa87bee63e950b5f5308f36eb87c57 Mon Sep 17 00:00:00 2001 From: Bruno Grbavac Date: Thu, 30 Oct 2025 17:31:15 +0000 Subject: [PATCH 1/2] fix(sdk): add timeout for pending_build state to prevent indefinite waits Signed-off-by: Bruno Grbavac --- libs/sdk-python/src/daytona/_async/daytona.py | 9 +++++++++ libs/sdk-python/src/daytona/_sync/daytona.py | 9 +++++++++ libs/sdk-typescript/src/Daytona.ts | 10 ++++++++++ 3 files changed, 28 insertions(+) diff --git a/libs/sdk-python/src/daytona/_async/daytona.py b/libs/sdk-python/src/daytona/_async/daytona.py index c26987a4c..f709fc59c 100644 --- a/libs/sdk-python/src/daytona/_async/daytona.py +++ b/libs/sdk-python/src/daytona/_async/daytona.py @@ -437,7 +437,16 @@ async def should_terminate(): SandboxState.BUILD_FAILED, ] + pending_build_start = time.time() + while response_ref["response"].state == SandboxState.PENDING_BUILD: + if timeout: + elapsed = time.time() - pending_build_start + if elapsed > timeout: + raise DaytonaError( + f"Sandbox build has been pending for more than {timeout} seconds." + f"Please check the sandbox state again later." + ) await asyncio.sleep(1) response_ref["response"] = await self._sandbox_api.get_sandbox(response_ref["response"].id) diff --git a/libs/sdk-python/src/daytona/_sync/daytona.py b/libs/sdk-python/src/daytona/_sync/daytona.py index 765304bf3..f295a626e 100644 --- a/libs/sdk-python/src/daytona/_sync/daytona.py +++ b/libs/sdk-python/src/daytona/_sync/daytona.py @@ -398,7 +398,16 @@ def should_terminate(): SandboxState.BUILD_FAILED, ] + pending_build_start = time.time() + while response_ref["response"].state == SandboxState.PENDING_BUILD: + if timeout: + elapsed = time.time() - pending_build_start + if elapsed > timeout: + raise DaytonaError( + f"Sandbox build has been pending for more than {timeout} seconds." + f"Please check the sandbox state again later." + ) time.sleep(1) response_ref["response"] = self._sandbox_api.get_sandbox(response_ref["response"].id) diff --git a/libs/sdk-typescript/src/Daytona.ts b/libs/sdk-typescript/src/Daytona.ts index 775379020..969d79fe4 100644 --- a/libs/sdk-typescript/src/Daytona.ts +++ b/libs/sdk-typescript/src/Daytona.ts @@ -505,7 +505,17 @@ export class Daytona { SandboxState.BUILD_FAILED, ] + const pendingBuildStart = Date.now() + while (sandboxInstance.state === SandboxState.PENDING_BUILD) { + if (options.timeout) { + const elapsed = (Date.now() - pendingBuildStart) / 1000 + if (elapsed > options.timeout) { + throw new DaytonaError( + `Sandbox build has been pending for more than ${options.timeout} seconds. Please check the sandbox state again later.`, + ) + } + } await new Promise((resolve) => setTimeout(resolve, 1000)) sandboxInstance = (await this.sandboxApi.getSandbox(sandboxInstance.id)).data } From e316ece3f300d743e3b027640b530da147edd776 Mon Sep 17 00:00:00 2001 From: Bruno Grbavac Date: Fri, 31 Oct 2025 02:07:13 +0000 Subject: [PATCH 2/2] fix(sdk): use existing start time Signed-off-by: Bruno Grbavac --- libs/sdk-python/src/daytona/_async/daytona.py | 4 +--- libs/sdk-python/src/daytona/_sync/daytona.py | 4 +--- libs/sdk-typescript/src/Daytona.ts | 4 +--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/libs/sdk-python/src/daytona/_async/daytona.py b/libs/sdk-python/src/daytona/_async/daytona.py index f709fc59c..d8a9110fd 100644 --- a/libs/sdk-python/src/daytona/_async/daytona.py +++ b/libs/sdk-python/src/daytona/_async/daytona.py @@ -437,11 +437,9 @@ async def should_terminate(): SandboxState.BUILD_FAILED, ] - pending_build_start = time.time() - while response_ref["response"].state == SandboxState.PENDING_BUILD: if timeout: - elapsed = time.time() - pending_build_start + elapsed = time.time() - start_time if elapsed > timeout: raise DaytonaError( f"Sandbox build has been pending for more than {timeout} seconds." diff --git a/libs/sdk-python/src/daytona/_sync/daytona.py b/libs/sdk-python/src/daytona/_sync/daytona.py index f295a626e..b88d80161 100644 --- a/libs/sdk-python/src/daytona/_sync/daytona.py +++ b/libs/sdk-python/src/daytona/_sync/daytona.py @@ -398,11 +398,9 @@ def should_terminate(): SandboxState.BUILD_FAILED, ] - pending_build_start = time.time() - while response_ref["response"].state == SandboxState.PENDING_BUILD: if timeout: - elapsed = time.time() - pending_build_start + elapsed = time.time() - start_time if elapsed > timeout: raise DaytonaError( f"Sandbox build has been pending for more than {timeout} seconds." diff --git a/libs/sdk-typescript/src/Daytona.ts b/libs/sdk-typescript/src/Daytona.ts index 969d79fe4..711c73d26 100644 --- a/libs/sdk-typescript/src/Daytona.ts +++ b/libs/sdk-typescript/src/Daytona.ts @@ -505,11 +505,9 @@ export class Daytona { SandboxState.BUILD_FAILED, ] - const pendingBuildStart = Date.now() - while (sandboxInstance.state === SandboxState.PENDING_BUILD) { if (options.timeout) { - const elapsed = (Date.now() - pendingBuildStart) / 1000 + const elapsed = (Date.now() - startTime) / 1000 if (elapsed > options.timeout) { throw new DaytonaError( `Sandbox build has been pending for more than ${options.timeout} seconds. Please check the sandbox state again later.`,