Skip to content

Release the websocket promptly when a connection is disconnected#16

Merged
bforma merged 1 commit into
mainfrom
cancel-connection-task-on-disconnect
May 11, 2026
Merged

Release the websocket promptly when a connection is disconnected#16
bforma merged 1 commit into
mainfrom
cancel-connection-task-on-disconnect

Conversation

@bforma
Copy link
Copy Markdown
Contributor

@bforma bforma commented May 11, 2026

We+ CEM heeft StekkerS2 vorige week 20+ minuten geweerd met een 403 ("you already have an RM connection") terwijl wij in een reconnect-cyclus zaten. CEM-kant zag de oude TCP/WS-connectie nog als levend; pas toen onze app uiteindelijk een CLOSE 1000 verstuurde, lukte de eerstvolgende poging.

Oorzaak in deze gem: S2::Connection#disconnect zet @stopping = true en roept @session&.stop aan — maar tussen reconnect-iteraties is @session = nil (gezet in de ensure van connect_and_run), dus die roep is een no-op. De running async task (en daarmee de open WebSocket binnen Async::WebSocket::Client.connect(...) do |ws| ... end) blijft daardoor leven tot iets anders hem ontwart. CLOSE 1000 wordt pas verstuurd wanneer de block-form alsnog uitloopt, in productie minutenlang na de eigenlijke disconnect-call.

Fix:

  • task: is nu optioneel in S2::Connection.new. In connect lazy resolved naar Async::Task.current (= de task die connect daadwerkelijk draait).
  • disconnect roept @task&.stop aan. Dat raised Async::Stop in de task, ontwart sleep @backoff of een blocking @ws.read, de ensures vuren, de block-form sluit de WebSocket en stuurt CLOSE 1000 — direct in plaats van na een onbepaalde tijd.

Bestaande specs gaven task: Async::Task.current mee, wat feitelijk de OUTER spec-task was (niet de task die connect draait). Met de fix zou dat de spec laten crashen; daarom is het argument weggehaald. Nieuwe spec bewijst dat disconnect alleen al de task termineert terwijl die in sleep @backoff zit — red-green-bevestigd door de fix even terug te draaien.

Na merge: gem-pin in StekkerS2/Gemfile.lock bumpen, daar volgt aansluitend een PR voor.

@bforma bforma merged commit 1858331 into main May 11, 2026
2 checks passed
@bforma bforma deleted the cancel-connection-task-on-disconnect branch May 11, 2026 13:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant