From: eregontp@... Date: 2021-05-22T20:00:09+00:00 Subject: [ruby-core:103987] [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 Eregon (Benoit Daloze). Option 1 would be useful, might avoid delaying finalizers if the main thread is for a while in native code, and it is already what JRuby (IIRC) and TruffleRuby currently do. There is potentially some incompatibility, but it seems pretty low given AFAIK we've seen no issue with that approach on JRuby & TruffleRuby (@headius might know some?). Option 3 seems a good way too. Related: https://bugs.ruby-lang.org/issues/17849#note-16 ---------------------------------------- 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-92120 * 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: