Bug #8374

race condition when two threads require a gem

Added by Joel VanderWerf 12 months ago. Updated 10 months ago.

[ruby-core:54842]
Status:Closed
Priority:Normal
Assignee:Eric Hodel
Category:lib
Target version:-
ruby -v:ruby 2.0.0p0 (2013-02-24) [i686-linux] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

=begin
Requiring a gem with a C extension seems to be not threadsafe.

Any one of the require lines below will frequently (but not always) cause an error like the following:

/usr/local/lib/ruby/siteruby/2.0.0/rubygems/coreext/kernel_require.rb:45:in require': cannot load such file -- sqlite3 (LoadError)
from /usr/local/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in
require'
from thread.rb:7:in `block (2 levels) in '

Using one thread avoids the problem.

ths = (1..2).map do
Thread.new do
# require 'msgpack'
# require 'yajl'
# require 'sequel'
# require 'nio4r'
require 'sqlite3'
end
end

ths.each {|th| th.join}
=end

History

#1 Updated by Nobuyoshi Nakada 12 months ago

  • Description updated (diff)
  • Category set to lib
  • Status changed from Open to Assigned
  • Assignee set to Eric Hodel

Seems rubygems specific.

#2 Updated by Eric Hodel 10 months ago

  • Subject changed from race condition when two threads require a gem with a C extension to race condition when two threads require a gem

This is reproducible without a C extension, updated subject.

#3 Updated by Eric Hodel 10 months ago

  • Status changed from Assigned to Closed

This has been fixed in rubygems master and 2.0 branches.

Also available in: Atom PDF