Project

General

Profile

Bug #15509

TCPServer#accept isn't interrupted

Added by larskanis (Lars Kanis) 10 months ago. Updated about 2 months ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
[ruby-core:90900]

Description

This is another issue I noticed with Eventbox:

This script tries to stop TCPServer#accept with Thread#raise:

require "socket"
Thread.abort_on_exception = true

class Stop < RuntimeError
end

serv = TCPServer.new("localhost", 12345)

th = Thread.handle_interrupt(Exception => :never) do
  Thread.new do
    begin
      Thread.handle_interrupt(Stop => :on_blocking) do
#         sleep      # sleep is aborted
        serv.accept  # but accept isn't
      end
    rescue Stop
    end
  end
end

th.raise Stop
th.join
serv.close

The program freezes and if stopped per CTRL-C the output looks similar to:

$ ruby -d --disable-gems no-interrupt-while-accept.rb
^CException `Interrupt' at no-interrupt-while-accept.rb:23 -
Exception `Stop' at no-interrupt-while-accept.rb:15 - Stop
Traceback (most recent call last):
    1: from no-interrupt-while-accept.rb:23:in `<main>'
no-interrupt-while-accept.rb:23:in `join': Interrupt

The debug output shows, that the Stop exception is delivered after the Interrupt exception has been delivered to the main thread. However it should be delivered immediately, since it's a blocking operation. In contrast sleep is aborted as expected.

This issue is present on all older MRI versions. However it doesn't appear on JRuby-9.2.5.0.

History

Updated by jeremyevans0 (Jeremy Evans) about 2 months ago

  • Status changed from Open to Closed

This problem appears fixed in 2.6.4 and 2.7.0-preview1 in my environment (OpenBSD-amd64). It still occurs in 2.5.6. If it still occurs for you in 2.6.4, please reopen.

Also available in: Atom PDF