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
-~----------~----~----~----~------~----~------~--~---

Reply via email to