On 23 Apr 2008, at 10:20, Tarmo Tänav wrote:
> > There was a Trac ticket about this: > http://dev.rubyonrails.org/ticket/9155 > > The problem could probably be fixed with one or more carefully placed > Thread#exclusive blocks. I don't think there is a good reason why > several threads have to be able to load new constants in parallel. > D'oh, so hell bent in working out exactly why my particular problem was happening that I didn't think to check trac. Fred > > On K, 2008-04-23 at 10:04 +0100, Frederick Cheung wrote: >> Are there any claims as to whether Dependencies is thread safe? I was >> working on an odd startup problem one of our scripts has and it turns >> out that there seems to be a race condition: >> >> 2 threads spawn >> >> Thread 1 tries to reference Foo, hits const_missing >> Thread 2 tries to reference Foo, hits const_missing >> Thread 1 enters require_or_load (in dependencies.rb) and adds foo.rb >> to the loaded set >> Thread 2 performs the test on line 247 (if file_path && ! >> loaded.include?(File.expand_path(file_path))) which fails because >> loaded does now contain foo.rb >> Thread 1 completes loading of foo.rb, Object.const_defined?(:Foo) now >> returns true >> Thread 2 hits line 253: >> elsif (parent = from_mod.parent) && parent != from_mod && >> ! from_mod.parents.any? { |p| p.const_defined? >> (const_name) } >> >> which is also false since either from_mod is Object (in which case >> parent == from_mod) or from_mod.parents contains Object in which case >> the second part of the test >> Thread 2 then raises name_error. >> >> I've added some appropriately placed sleep statements into >> dependencies.rb to make this happen systematically rather than it >> just >> being blind luck. In my particular case we can probably work around >> this by explicitly requiring stuff, but this may be of interest to >> people thinking about thread safety in rails. >> >> >> >> Fred >> >> >>> > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
