From 3752b2bac8062b5ac58a1a93ff92b2a4ad469a67 Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Fri, 8 May 2026 23:26:00 +0800 Subject: [PATCH] fix: Handle connection errors when stopping node console Add exception handling in stop_wrap_console to gracefully handle ConnectionResetError, BrokenPipeError, and OSError when waiting for console writer to close. This prevents 500 errors when stopping QEMU nodes if the console connection is reset before the writer finishes closing. Fixes race condition where QEMU process exits and closes connections before the console writer cleanup completes. --- gns3server/compute/base_node.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gns3server/compute/base_node.py b/gns3server/compute/base_node.py index a56c8bf85..8e7681d9e 100644 --- a/gns3server/compute/base_node.py +++ b/gns3server/compute/base_node.py @@ -474,10 +474,18 @@ class BaseNode: if self._wrap_console_writer: self._wrap_console_writer.close() - await self._wrap_console_writer.wait_closed() + try: + await self._wrap_console_writer.wait_closed() + except (ConnectionResetError, BrokenPipeError, OSError): + # Connection already closed, ignore error + pass for telnet_proxy_server in self._wrapper_telnet_servers: telnet_proxy_server.close() - await telnet_proxy_server.wait_closed() + try: + await telnet_proxy_server.wait_closed() + except (ConnectionResetError, BrokenPipeError, OSError): + # Connection already closed, ignore error + pass self._wrapper_telnet_servers = [] async def reset_wrap_console(self):