debug: add loop exit logging to terminal WebSocket handler

This commit is contained in:
Fusion
2026-05-24 16:13:44 +02:00
parent f59274ae64
commit fa20d00d14
+24 -5
View File
@@ -97,6 +97,11 @@ async def terminal_websocket(
return_when=asyncio.FIRST_COMPLETED,
)
# Log which task completed
for task in done:
task_name = "read" if task == read_task else "write" if task == write_task else "heartbeat"
logger.info(f"Task '{task_name}' completed first for instance {instance_id}")
# Cancel remaining tasks
for task in pending:
task.cancel()
@@ -116,24 +121,35 @@ async def terminal_websocket(
async def _read_loop(session, websocket) -> None:
"""Read output from the container and send to WebSocket."""
loop_count = 0
try:
while session.is_alive() and not session._closed:
loop_count += 1
if loop_count == 1:
logger.info(f"Read loop started for session {session.session_id}, alive={session.is_alive()}, closed={session._closed}")
data = await session.read_output()
if data:
try:
await websocket.send_bytes(data)
except Exception:
except Exception as e:
logger.warning(f"Read loop send_bytes failed: {e}")
break
else:
await asyncio.sleep(0.01)
except Exception:
pass
except Exception as e:
logger.warning(f"Read loop exception: {e}")
finally:
logger.info(f"Read loop exited after {loop_count} iterations, alive={session.is_alive()}, closed={session._closed}")
async def _write_loop(session, websocket) -> None:
"""Read input from WebSocket and send to container."""
loop_count = 0
try:
while session.is_alive() and not session._closed:
loop_count += 1
if loop_count == 1:
logger.info(f"Write loop started for session {session.session_id}, alive={session.is_alive()}, closed={session._closed}")
message = await websocket.receive()
if message["type"] == "websocket.receive":
if "bytes" in message:
@@ -177,9 +193,12 @@ async def _write_loop(session, websocket) -> None:
else:
await session.write_input(text.encode("utf-8"))
elif message["type"] == "websocket.disconnect":
logger.info(f"Write loop: websocket.disconnect received for session {session.session_id}")
break
except Exception:
pass
except Exception as e:
logger.warning(f"Write loop exception for session {session.session_id}: {e}")
finally:
logger.info(f"Write loop exited after {loop_count} iterations, alive={session.is_alive()}, closed={session._closed}")
async def _heartbeat_loop(websocket: WebSocket) -> None: