cluster/websocket: Stop and wait for reply thread during Terminate()

The terminate-while-queueing test added for #4428 failed spuriously
indicating that sometimes WebSocket clients receive code 1000 instead of 1001.
This happens if the ixwebsocket server is shutdown before the reply thread had a
chance to process queued close messages.

Fix by signaling and waiting for the dispatcher's reply thread to terminate
before returning from Terminate().
This commit is contained in:
Arne Welzel 2025-05-07 12:40:13 +02:00
parent ac1230fcbe
commit ca02316671
2 changed files with 6 additions and 1 deletions

View file

@ -249,6 +249,11 @@ void WebSocketEventDispatcher::Terminate() {
clients.clear(); clients.clear();
onloop->Close(); onloop->Close();
// Wait for the reply_msg_thread to process any outstanding
// WebSocketReply messages before returning.
reply_msg_thread->SignalStop();
reply_msg_thread->WaitForStop();
} }
void WebSocketEventDispatcher::QueueForProcessing(WebSocketEvent&& event) { void WebSocketEventDispatcher::QueueForProcessing(WebSocketEvent&& event) {

View file

@ -89,7 +89,7 @@ def run(ws_url):
tc.send_json(wstest.build_event_v1("/test/pings/", "ping", [f"tc{idx}", i])) tc.send_json(wstest.build_event_v1("/test/pings/", "ping", [f"tc{idx}", i]))
except websockets.exceptions.ConnectionClosedOK as e: except websockets.exceptions.ConnectionClosedOK as e:
print("connection closed ok") print("connection closed ok")
assert e.code == 1001 # Remote going away assert e.code == 1001, f"expected code 1001, got {e.code} - {e}" # Remote going away
i -= 1 i -= 1
saw_closed_ok.add(idx) saw_closed_ok.add(idx)