Project

General

Profile

Actions

Bug #7530

closed

Concurrent loads fail with mutex errors

Bug #7530: Concurrent loads fail with mutex errors

Added by headius (Charles Nutter) almost 13 years ago. Updated over 10 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.0.0dev (2012-12-01 trunk 38126) [x86_64-darwin11.4.2]
Backport:
[ruby-core:50645]

Description

I have no idea what's going on here.

jruby-1.7.0 ~/projects/vts-jruby $ cat bench_load_path.rb require 'benchmark' FAKE_PATHS = ARGV[0].to_i || 100 THREADS = 8 ITERATIONS_PER_THREAD = 1000 FAKE_PATHS.times do |i| $:.unshift "foo#{i}" end $: << '.' system 'touch __load_path_bench_script__.rb' puts Benchmark.measure { @threads = THREADS.times.map do Thread.new { ITERATIONS_PER_THREAD.times do require '__load_path_bench_script__' $".pop end } end @threads.each { |t| t.join } } system 'rm __load_path_bench_script__.rb' jruby-1.7.0 ~/projects/vts-jruby $ ruby-2.0.0 -rubygems bench_load_path.rb 100 /usr/local/lib/ruby/2.0.0/rubygems/custom_require.rb:36:in `require': wrong argument type false (expected mutex) (TypeError)	from /usr/local/lib/ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:17:in `block (3 levels) in <main>' jruby-1.7.0 ~/projects/vts-jruby $ ruby-2.0.0 --disable-gems bench_load_path.rb 100 bench_load_path.rb:18:in `require': wrong argument type false (expected mutex) (TypeError)	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:17:in `block (3 levels) in <main>' With verbose on, I get this error and a bunch of circular require warnings, even though I'm not doing any circular requires here. ruby-2.0.0-preview2 ~/projects/vts-jruby $ ruby -v bench_load_path.rb ruby 2.0.0dev (2012-12-01 trunk 38126) [x86_64-darwin11.4.2] /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36: warning: loading in progress, circular require considered harmful - /Users/headius/projects/vts-jruby/__load_path_bench_script__.rb	from bench_load_path.rb:17:in `block (3 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require' /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require': Attempt to unlock a mutex which is locked by another thread (ThreadError)	from /Users/headius/.rvm/rubies/ruby-2.0.0-preview2/lib/ruby/site_ruby/2.0.0/rubygems/custom_require.rb:36:in `require'	from bench_load_path.rb:18:in `block (4 levels) in <main>'	from bench_load_path.rb:17:in `times'	from bench_load_path.rb:17:in `block (3 levels) in <main>' 

Related issues 2 (0 open2 closed)

Updated by usa (Usaku NAKAMURA) almost 13 years ago Actions #1

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to kosaki (Motohiro KOSAKI)
  • Target version set to 2.0.0

Updated by kosaki (Motohiro KOSAKI) almost 13 years ago Actions #2 [ruby-core:51078]

  • Assignee changed from kosaki (Motohiro KOSAKI) to nobu (Nobuyoshi Nakada)

When removing $".pop likes following, this issue never happen.
So, I suspect this is require and threadshield issue.


require 'benchmark' FAKE_PATHS = ARGV[0].to_i || 100 THREADS = 2 ITERATIONS_PER_THREAD = 1000 FAKE_PATHS.times do |i| $:.unshift "foo#{i}" end $: << '.' ITERATIONS_PER_THREAD.times {|i| system "touch __load_path_bench_script__#{i}.rb" } puts Benchmark.measure { @threads = THREADS.times.map do Thread.new { ITERATIONS_PER_THREAD.times do |i| require "__load_path_bench_script__#{i}" end } end @threads.each { |t| t.join } } ITERATIONS_PER_THREAD.times {|i| system "rm __load_path_bench_script__#{i}.rb" } 

Updated by nobu (Nobuyoshi Nakada) almost 13 years ago Actions #3 [ruby-core:51136]

  • Priority changed from Normal to 5

Updated by Glass_saga (Masaki Matsushita) almost 13 years ago Actions #4 [ruby-core:51309]

Here is the minimal code:

THREADS = 2 ITERATIONS_PER_THREAD = 1000 system 'touch __load_path_bench_script__.rb' THREADS.times.map { Thread.new do ITERATIONS_PER_THREAD.times do require_relative '__load_path_bench_script__' $".pop end end }.each(&:join) system 'rm __load_path_bench_script__.rb' 

Updated by Glass_saga (Masaki Matsushita) almost 13 years ago Actions #5 [ruby-core:51312]

  • Assignee changed from nobu (Nobuyoshi Nakada) to Glass_saga (Masaki Matsushita)

Updated by Anonymous almost 13 years ago Actions #6

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r38744.
Charles, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • load.c (load_lock): fix not to delete thread shield twice.
    it may break the shield locked by another thread.
    [Bug #7530] [ruby-core:50645]

  • test/ruby/test_require.rb: a test for above.

Updated by nobu (Nobuyoshi Nakada) over 10 years ago Actions #7

  • Related to Bug #10892: Deadlock in autoload added

Updated by nobu (Nobuyoshi Nakada) over 10 years ago Actions #8 [ruby-core:70198]

  • Description updated (diff)

Updated by shugo (Shugo Maeda) almost 9 years ago Actions #9

  • Related to Bug #12999: there still exist race conditions in require added
Actions

Also available in: PDF Atom