From: mame@... Date: 2021-05-21T05:38:19+00:00 Subject: [ruby-core:103934] [Ruby master Bug#13876] Tempfile's finalizer can be interrupted by a Timeout exception which can cause the process to hang Issue #13876 has been updated by mame (Yusuke Endoh). I'm neutral for this proposal, but just like to add two comments. 1. The proposed change will break a program that uses `Timeout.timeout` in a finalizer. Such a program may get stuck. I don't think that it is a good program, though. 2. The patch adds an ad-hoc field to disable interrupt, but it may be good to reuse the mechanism of `handle_interrupt`. ---------------------------------------- Bug #13876: Tempfile's finalizer can be interrupted by a Timeout exception which can cause the process to hang https://bugs.ruby-lang.org/issues/13876#change-92064 * Author: jrafanie (Joe Rafaniello) * Status: Open * Priority: Normal * ruby -v: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin15] * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Ruby hangs if a Timeout is raised when a Tempfile's finalizer is run. This also happens on ruby 2.3.4 on OSX. I could only recreate this on linux once but not reliably. Maybe the finalizer runs at a different and unpredictable time on Linux. See the following script: ```ruby require 'tempfile' require 'timeout' Tempfile.new("x") # this empty method is needed for some reason, maybe scope/GC related def stuff "" end 2.times do |i| begin Timeout.timeout(1e-9) do loop do begin "result" ensure end end end rescue Timeout::Error end end ``` When run, I get the following output and it hangs ~4 out of 5 times on OSX: ``` $ ruby -d test.rb Exception `LoadError' at /Users/joerafaniello/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems.rb:1345 - cannot load such file -- rubygems/defaults/operating_system Exception `LoadError' at /Users/joerafaniello/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems.rb:1354 - cannot load such file -- rubygems/defaults/ruby removing /var/folders/fq/blrz820d3qz7nm7vj8mbtfs40000gq/T/x20170906-72981-1ttdgpr... ``` When it doesn't hang (~1 in 5 tries), it looks like this (the exception seems to be raised after the file cleanup is done): ``` $ ruby -d test.rb Exception `LoadError' at /Users/joerafaniello/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems.rb:1345 - cannot load such file -- rubygems/defaults/operating_system Exception `LoadError' at /Users/joerafaniello/.rubies/ruby-2.4.1/lib/ruby/2.4.0/rubygems.rb:1354 - cannot load such file -- rubygems/defaults/ruby removing /var/folders/fq/blrz820d3qz7nm7vj8mbtfs40000gq/T/x20170906-72963-164cw8j... done Exception `Timeout::Error' at /Users/joerafaniello/.rubies/ruby-2.4.1/lib/ruby/2.4.0/timeout.rb:114 - execution expired Exception `Timeout::Error' at /Users/joerafaniello/.rubies/ruby-2.4.1/lib/ruby/2.4.0/timeout.rb:114 - execution expired ``` When it hangs, it seems to be this code: https://github.com/ruby/ruby/blob/0f25c6d7d59ff9744d1ca5dc908cc12c8ce79e25/lib/tempfile.rb#L253-L261 -- https://bugs.ruby-lang.org/ Unsubscribe: