JRuby (please use github issues at http://bugs.jruby.org)
  1. JRuby (please use github issues at http://bugs.jruby.org)
  2. JRUBY-7169

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


    • Type: Bug Bug
    • Status: Closed Closed
    • Priority: Major Major
    • Resolution: Incomplete
    • Affects Version/s: JRuby 1.7.3, JRuby 1.7.4
    • Fix Version/s: None
    • Component/s: None
    • Labels:
    • Environment:
      uname -a
      Linux donald 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux
      uname -a
      Linux donald 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2+deb7u2 x86_64 GNU/Linux
      but applies also to Windows/Netbeans 7.3 with jruby plug-in.
    • Number of attachments :


      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:


      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:


        Charles Oliver Nutter added a comment - Moved to https://github.com/jruby/jruby/issues/2363


          • Assignee:
            Charles Oliver Nutter
            Michael Josenhans


            • Created: