Misc #18662
closedFiber scheduling and Module#autoload
Description
Looks like Fiber context-switching does not synchronize constant reference access. This script using the async
gem demonstrates the issue:
require 'tempfile'
require 'async'
Tempfile.create(['foo', '.rb']) do |file|
file.write(<<~RUBY)
sleep 0.01
class C
end
RUBY
file.close
autoload :C, file.path
Async do |task|
3.times do |i|
task.async { p C }
end
end.wait
end
As you'll, it raises NameError
s.
The sleep
call in c.rb
is just an artificial way to trigger a context switch, but we learned that the debug
gem does trigger it due to a TracePoint on script_compiled
it installs. Check this other script that also reproduces the error:
require 'tempfile'
require 'async'
require 'debug'
Tempfile.create(['foo', '.rb']) do |file|
file.write(<<~RUBY)
class C
def self.call_me
end
end
RUBY
file.close
autoload :C, file.path
Async do |task|
5.times do |i|
task.async do
p C.call_me
end
end
end.wait
end
See https://github.com/ruby/debug/issues/580 for details.
I didn't tag this as "bug" because I do not know how you'd consider this. On one hand, blocking fibers are switched by the programmer, but non-blocking ones are by a contract interface + scheduler.
What do you think? Could something be done?
Updated by fxn (Xavier Noria) about 2 years ago
https://bugs.ruby-lang.org/issues/18663 is the same, human race condition :D. We could close one of the two, at your discretion.
Updated by ioquatix (Samuel Williams) about 2 years ago
- Status changed from Open to Closed
Thanks for your report.
Updated by Eregon (Benoit Daloze) about 2 years ago
- Is duplicate of Bug #18663: Autoload doesn't work with fiber context switch. added