Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sendmesg (blocking) of class BasicSocket crashes the thread of the thread pool #2363

Open
headius opened this issue Dec 29, 2014 · 0 comments

Comments

@headius
Copy link
Member

headius commented Dec 29, 2014

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:

  • 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.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant