fix(exec): retain stale sessions after cleanup failure

Only remove idle exec sessions after process termination succeeds so later cleanup and shutdown paths can retry failed kills.
This commit is contained in:
KDB
2026-07-23 23:55:00 +08:00
committed by chengyongru
parent 274613f064
commit 648fc92673
2 changed files with 26 additions and 1 deletions
+2 -1
View File
@@ -370,8 +370,9 @@ class ExecSessionManager:
if now - session.last_access > self.idle_timeout
]
for session_id in stale:
session = self._sessions.pop(session_id)
session = self._sessions[session_id]
await session.kill()
self._sessions.pop(session_id, None)
async def _spawn(
self,
+24
View File
@@ -702,6 +702,30 @@ def test_terminate_by_owner_retains_failed_sessions():
asyncio.run(run())
def test_stale_cleanup_retains_session_when_kill_fails():
async def run() -> None:
manager = ExecSessionManager(idle_timeout=1)
session = SimpleNamespace(
session_id="stale-failed",
owner_session_key="cli:a",
last_access=time.monotonic() - 10,
kill=AsyncMock(side_effect=OSError("termination failed")),
)
manager._sessions[session.session_id] = session
with pytest.raises(OSError, match="termination failed"):
await manager.list(owner_session_key="cli:a")
assert manager._sessions == {session.session_id: session}
session.kill.assert_awaited_once()
session.kill.side_effect = None
assert await manager.list(owner_session_key="cli:a") == []
assert manager._sessions == {}
asyncio.run(run())
def test_terminate_by_owner_skips_sessions_without_owner_key(tmp_path):
async def run() -> None:
manager = ExecSessionManager()