debug: add loop exit logging to terminal WebSocket handler
This commit is contained in:
@@ -97,6 +97,11 @@ async def terminal_websocket(
|
|||||||
return_when=asyncio.FIRST_COMPLETED,
|
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
|
# Cancel remaining tasks
|
||||||
for task in pending:
|
for task in pending:
|
||||||
task.cancel()
|
task.cancel()
|
||||||
@@ -116,24 +121,35 @@ async def terminal_websocket(
|
|||||||
|
|
||||||
async def _read_loop(session, websocket) -> None:
|
async def _read_loop(session, websocket) -> None:
|
||||||
"""Read output from the container and send to WebSocket."""
|
"""Read output from the container and send to WebSocket."""
|
||||||
|
loop_count = 0
|
||||||
try:
|
try:
|
||||||
while session.is_alive() and not session._closed:
|
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()
|
data = await session.read_output()
|
||||||
if data:
|
if data:
|
||||||
try:
|
try:
|
||||||
await websocket.send_bytes(data)
|
await websocket.send_bytes(data)
|
||||||
except Exception:
|
except Exception as e:
|
||||||
|
logger.warning(f"Read loop send_bytes failed: {e}")
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
await asyncio.sleep(0.01)
|
await asyncio.sleep(0.01)
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
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:
|
async def _write_loop(session, websocket) -> None:
|
||||||
"""Read input from WebSocket and send to container."""
|
"""Read input from WebSocket and send to container."""
|
||||||
|
loop_count = 0
|
||||||
try:
|
try:
|
||||||
while session.is_alive() and not session._closed:
|
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()
|
message = await websocket.receive()
|
||||||
if message["type"] == "websocket.receive":
|
if message["type"] == "websocket.receive":
|
||||||
if "bytes" in message:
|
if "bytes" in message:
|
||||||
@@ -177,9 +193,12 @@ async def _write_loop(session, websocket) -> None:
|
|||||||
else:
|
else:
|
||||||
await session.write_input(text.encode("utf-8"))
|
await session.write_input(text.encode("utf-8"))
|
||||||
elif message["type"] == "websocket.disconnect":
|
elif message["type"] == "websocket.disconnect":
|
||||||
|
logger.info(f"Write loop: websocket.disconnect received for session {session.session_id}")
|
||||||
break
|
break
|
||||||
except Exception:
|
except Exception as e:
|
||||||
pass
|
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:
|
async def _heartbeat_loop(websocket: WebSocket) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user