From a66843714d01d163e2ce17dd4399a0fa64d2be65 Mon Sep 17 00:00:00 2001 From: Mathieu Virbel Date: Thu, 25 Sep 2025 15:28:35 -0600 Subject: [PATCH] fix: remove container even if already removed --- cubbi/container.py | 46 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/cubbi/container.py b/cubbi/container.py index 02f9240..c901c1c 100644 --- a/cubbi/container.py +++ b/cubbi/container.py @@ -915,8 +915,21 @@ class ContainerManager: self.session_manager.remove_session(session.id) return True except DockerException as e: - print(f"Error closing session {session.id}: {e}") - return False + error_message = str(e).lower() + # If container is not running or already removed, still remove it from session list + if ( + "is not running" in error_message + or "no such container" in error_message + or "not found" in error_message + ): + print( + f"Container already stopped/removed, removing session {session.id} from list" + ) + self.session_manager.remove_session(session.id) + return True + else: + print(f"Error closing session {session.id}: {e}") + return False def close_all_sessions( self, progress_callback=None, kill: bool = False @@ -980,11 +993,30 @@ class ContainerManager: return True except DockerException as e: - error_msg = f"Error: {str(e)}" - if progress_callback: - progress_callback(session.id, "failed", error_msg) - print(f"Error closing session {session.id}: {e}") - return False + error_message = str(e).lower() + # If container is not running or already removed, still remove it from session list + if ( + "is not running" in error_message + or "no such container" in error_message + or "not found" in error_message + ): + print( + f"Container already stopped/removed, removing session {session.id} from list" + ) + self.session_manager.remove_session(session.id) + if progress_callback: + progress_callback( + session.id, + "completed", + f"{session.name} removed from list (container already stopped)", + ) + return True + else: + error_msg = f"Error: {str(e)}" + if progress_callback: + progress_callback(session.id, "failed", error_msg) + print(f"Error closing session {session.id}: {e}") + return False # Use ThreadPoolExecutor to close sessions in parallel with concurrent.futures.ThreadPoolExecutor(