Skip to content

Commit b9657d2

Browse files
rapsealkclaude
andcommitted
refactor(agent): Tighten shutdown/startup cleanup in docker agent
- Narrow `except BaseException` to `except Exception` in __ainit__ cleanup: don't intercept KeyboardInterrupt/SystemExit propagation. - Drop the impossible `if self.docker is not None` guard in shutdown() (self.docker is non-Optional and set before any await in __ainit__). - Remove the ornamental docker parameter on _purge_image; its sole caller already passes self.docker. Refs #11218 Refs #11226 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 801ed1e commit b9657d2

1 file changed

Lines changed: 8 additions & 8 deletions

File tree

src/ai/backend/agent/docker/agent.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,7 +1563,7 @@ async def __ainit__(self) -> None:
15631563
allowlist=self.local_config.agent.allow_network_plugins,
15641564
blocklist=self.local_config.agent.block_network_plugins,
15651565
)
1566-
except BaseException:
1566+
except Exception:
15671567
# Release the shared aiodocker client if boot fails after its construction
15681568
# so the underlying aiohttp.ClientSession does not leak.
15691569
await self.docker.close()
@@ -1586,10 +1586,9 @@ async def shutdown(self, stop_signal: signal.Signals) -> None:
15861586
self.monitor_docker_task.cancel()
15871587
await self.monitor_docker_task
15881588
finally:
1589-
# Always release the shared aiodocker client so its aiohttp.ClientSession
1590-
# does not leak even when inner shutdown steps raise.
1591-
if self.docker is not None:
1592-
await self.docker.close()
1589+
# Outer finally guarantees the shared aiodocker client is released
1590+
# even if inner shutdown steps raise.
1591+
await self.docker.close()
15931592

15941593
@override
15951594
async def _load_kernel_registry_from_recovery(self) -> MutableMapping[KernelId, AbstractKernel]:
@@ -1925,9 +1924,11 @@ async def pull_image(
19251924
if error := result[-1].get("error"):
19261925
raise RuntimeError(f"Failed to pull image: {error}")
19271926

1928-
async def _purge_image(self, docker: Docker, request: DockerPurgeImageReq) -> PurgeImageResp:
1927+
async def _purge_image(self, request: DockerPurgeImageReq) -> PurgeImageResp:
19291928
try:
1930-
await docker.images.delete(request.image, force=request.force, noprune=request.noprune)
1929+
await self.docker.images.delete(
1930+
request.image, force=request.force, noprune=request.noprune
1931+
)
19311932
return PurgeImageResp.success(image=request.image)
19321933
except Exception as e:
19331934
log.error(f'Failed to purge image "{request.image}": {e}')
@@ -1939,7 +1940,6 @@ async def purge_images(self, request: PurgeImagesReq) -> PurgeImagesResp:
19391940
tasks = [
19401941
tg.create_task(
19411942
self._purge_image(
1942-
self.docker,
19431943
DockerPurgeImageReq(
19441944
image=image, force=request.force, noprune=request.noprune
19451945
),

0 commit comments

Comments
 (0)