-
Notifications
You must be signed in to change notification settings - Fork 6
Description
Context
Using the client for short-lived RPC like connections, I need to:
- Establishing a connection.
- Sending data.
- Waiting for and reading a response.
- Disconnecting.
Expected
The disconnection process should complete without exceptions.
Actual
We intermittently observe an IOError: stream closed in another thread exception during the disconnection phase.
[
[0] "org/jruby/RubyIO.java:3011:in `getc'",
[1] "[..]/.rvm/gems/jruby-9.4.12.0/gems/websocket-client-simple-0.8.0/lib/websocket-client-simple/client.rb:48:in `block in connect'"
]
The bug
I believe this issue stems from a race condition during the close operation. The Client#close method directly calls @socket.close. Concurrently, the dedicated reader thread (@thread) might still be actively performing a blocking read operation, such as @socket.getc, within its loop.
If @socket.close is executed before the reader thread has a chance to check its termination condition (e.g., a @closed flag) or before it's forcefully shut down, the getc call on the now-closed socket results in the IOError: stream closed in another thread.
Possible fix
def close
[..]
@closed = true # first mark as closed
@thread.join(1) if @thread # allow thread loop to finish interacting with the socket
@socket.close if @socket # only now close the socket to prevent "stream closed in another thread"
@socket = nil
emit :__close
endI'm willing to submit a PR if you think this is the way to go here.
Environment
jruby 9.4.12.0 (3.1.4) 2025-02-11 f4ab75096a OpenJDK 64-Bit Server VM 17.0.3+7 on 17.0.3+7 [x86_64-darwin]