You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The error occurs with the method "sendmesg" (blocking) of class BasicSocket on Ruby jruby, but does not occur on RMI Ruby 1.9.3-p392 (rvm). RMI Ruby 2.0.0-p0 (rvm) works partially.
The error does not occur with the method "send" (non-blocking) of class BasicSocket on above Jrubby versions (rvm), Ruby 1.9.3-p392 (rvm) and Ruby 2.0.0-p0 (rvm).
The bug can be reproduced with the code attached.
How to reproduce the error:
run:
ruby halfsync_halfasync.rb
on second terminal (unix):
telnet localhost 10001
on Windows use telnet client e.g. putty and make sure to configure putty as passive ("Connection->Telnet->Telnet negotiation mode: Passive")
What the code does:
It implements the halfsync_halfasync design-pattern (see references in the code).
An EchoAcceptor is registered with the reactor to accept connection setup.
A thread pool is started waiting for tasks to be retrieved from a shared queue
Upon connection-setup of the telnet the EchoAcceptor is called and registers an EchoServerHandler with the Reactor to handle data received via the connection from the telnet client.
Upon reception of data via the telent connection, the EchoServerHandler assembles data until a newline (\n or \r\n) is received. When that is received, the whole line is put into the shared queue.
The first thread from the thread pool waiting grabs the received data and the socket from the shared queue and in line 50/51 adds the thread-ID, the number of messages handled by that thread and sends it as a reply to the sender using the received socket.
What to expect as output:
Upon entering e.g. text "!1234" and pressing return
On Ruby 1.9.3-p392 on Linux:
See the as response the thread ID, the number of messages within the thread and the text.
On jruby 1.7.3. & 1.7.4:
No response to telnet is sent, but the sending thread crashes.
Everything works fine, if instead of blocking sendmesg (line 50/51) the non-blocking send (line 52/53) is used. However correct implementation of the halfsync-halfasync pattern, requires reasonably the usage of blocking "sendmesg" in thread pool.
I have to apologize that the program to reproduce the error is slightly large and complicated, but I believe that there is value, when ruby is able to run well known design patterns correctly.
From http://jira.codehaus.org/browse/JRUBY-7169
Original report
The error occurs with the method "sendmesg" (blocking) of class BasicSocket on Ruby jruby, but does not occur on RMI Ruby 1.9.3-p392 (rvm). RMI Ruby 2.0.0-p0 (rvm) works partially.
The error does not occur with the method "send" (non-blocking) of class BasicSocket on above Jrubby versions (rvm), Ruby 1.9.3-p392 (rvm) and Ruby 2.0.0-p0 (rvm).
The bug can be reproduced with the code attached.
How to reproduce the error:
run:
ruby halfsync_halfasync.rb
on second terminal (unix):
telnet localhost 10001
on Windows use telnet client e.g. putty and make sure to configure putty as passive ("Connection->Telnet->Telnet negotiation mode: Passive")
What the code does:
Upon entering e.g. text "!1234" and pressing return
See the as response the thread ID, the number of messages within the thread and the text.
No response to telnet is sent, but the sending thread crashes.
Everything works fine, if instead of blocking sendmesg (line 50/51) the non-blocking send (line 52/53) is used. However correct implementation of the halfsync-halfasync pattern, requires reasonably the usage of blocking "sendmesg" in thread pool.
A similar bugs have been filed for Ruby MRI and Rubinius here:
http://bugs.ruby-lang.org/issues/8442
rubinius/rubinius#2362
Here's the script: https://gist.github.com/headius/0d14997b4758bf0cb128
The text was updated successfully, but these errors were encountered: