ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:90900] [Ruby trunk Bug#15509] TCPServer#accept isn't interrupted
       [not found] <redmine.issue-15509.20190105180924@ruby-lang.org>
@ 2019-01-05 18:09 ` lars
  2019-08-28 18:32 ` [ruby-core:94633] [Ruby master " merch-redmine
  2020-01-14 10:38 ` [ruby-core:96849] " lars
  2 siblings, 0 replies; 3+ messages in thread
From: lars @ 2019-01-05 18:09 UTC (permalink / raw
  To: ruby-core

Issue #15509 has been reported by larskanis (Lars Kanis).

----------------------------------------
Bug #15509: TCPServer#accept isn't interrupted
https://bugs.ruby-lang.org/issues/15509

* Author: larskanis (Lars Kanis)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
This is another issue I noticed with [Eventbox](https://github.com/larskanis/eventbox):

This script tries to stop `TCPServer#accept` with `Thread#raise`:
```ruby
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:
```sh
$ 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.




-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:94633] [Ruby master Bug#15509] TCPServer#accept isn't interrupted
       [not found] <redmine.issue-15509.20190105180924@ruby-lang.org>
  2019-01-05 18:09 ` [ruby-core:90900] [Ruby trunk Bug#15509] TCPServer#accept isn't interrupted lars
@ 2019-08-28 18:32 ` merch-redmine
  2020-01-14 10:38 ` [ruby-core:96849] " lars
  2 siblings, 0 replies; 3+ messages in thread
From: merch-redmine @ 2019-08-28 18:32 UTC (permalink / raw
  To: ruby-core

Issue #15509 has been updated by jeremyevans0 (Jeremy Evans).

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.

----------------------------------------
Bug #15509: TCPServer#accept isn't interrupted
https://bugs.ruby-lang.org/issues/15509#change-81230

* Author: larskanis (Lars Kanis)
* Status: Closed
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
This is another issue I noticed with [Eventbox](https://github.com/larskanis/eventbox):

This script tries to stop `TCPServer#accept` with `Thread#raise`:
```ruby
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:
```sh
$ 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.




-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [ruby-core:96849] [Ruby master Bug#15509] TCPServer#accept isn't interrupted
       [not found] <redmine.issue-15509.20190105180924@ruby-lang.org>
  2019-01-05 18:09 ` [ruby-core:90900] [Ruby trunk Bug#15509] TCPServer#accept isn't interrupted lars
  2019-08-28 18:32 ` [ruby-core:94633] [Ruby master " merch-redmine
@ 2020-01-14 10:38 ` lars
  2 siblings, 0 replies; 3+ messages in thread
From: lars @ 2020-01-14 10:38 UTC (permalink / raw
  To: ruby-core

Issue #15509 has been updated by larskanis (Lars Kanis).

Status changed from Closed to Open

Thank you @jeremyevans0 for checking this! Unfortunately it still fails on Linux. I tried the following recent ruby versions and they all block infinitely:
```
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
ruby 2.5.7p206 (2019-10-01 revision 67816) [x86_64-linux]
```
It however stops as expected on Windows:
```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [i386-mingw32]
$ ruby -d --disable-gems bug_15509.rb
Exception `Stop' at bug_15509.rb:14 - Stop
```


----------------------------------------
Bug #15509: TCPServer#accept isn't interrupted
https://bugs.ruby-lang.org/issues/15509#change-83853

* Author: larskanis (Lars Kanis)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]
* Backport: 2.4: UNKNOWN, 2.5: UNKNOWN, 2.6: UNKNOWN
----------------------------------------
This is another issue I noticed with [Eventbox](https://github.com/larskanis/eventbox):

This script tries to stop `TCPServer#accept` with `Thread#raise`:
```ruby
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:
```sh
$ 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.




-- 
https://bugs.ruby-lang.org/

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-01-14 10:38 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <redmine.issue-15509.20190105180924@ruby-lang.org>
2019-01-05 18:09 ` [ruby-core:90900] [Ruby trunk Bug#15509] TCPServer#accept isn't interrupted lars
2019-08-28 18:32 ` [ruby-core:94633] [Ruby master " merch-redmine
2020-01-14 10:38 ` [ruby-core:96849] " lars

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).