+1 This also mostly catches a race condition in the allocation of autoloader (with the small exception of the call in functiondocs).
On Sat, Oct 16, 2010 at 11:06 AM, Brice Figureau < [email protected]> wrote: > The autoloading is not thread safe, which means two threads could both > autoload the same function at the same time. > > Signed-off-by: Brice Figureau <[email protected]> > --- > lib/puppet/parser/functions.rb | 6 ++++-- > spec/integration/parser/functions_spec.rb | 21 +++++++++++++++++++++ > 2 files changed, 25 insertions(+), 2 deletions(-) > create mode 100644 spec/integration/parser/functions_spec.rb > > diff --git a/lib/puppet/parser/functions.rb > b/lib/puppet/parser/functions.rb > index b0deac5..5807c0b 100644 > --- a/lib/puppet/parser/functions.rb > +++ b/lib/puppet/parser/functions.rb > @@ -73,8 +73,10 @@ module Puppet::Parser::Functions > def self.function(name) > name = symbolize(name) > > - unless functions.include?(name) or > functions(Puppet::Node::Environment.root).include?(name) > - autoloader.load(name,Environment.current || Environment.root) > + @functions.synchronize do > + unless functions.include?(name) or > functions(Puppet::Node::Environment.root).include?(name) > + autoloader.load(name,Environment.current || Environment.root) > + end > end > > ( functions(Environment.root)[name] || functions[name] || {:name => > false} )[:name] > diff --git a/spec/integration/parser/functions_spec.rb > b/spec/integration/parser/functions_spec.rb > new file mode 100644 > index 0000000..cbfb4ac > --- /dev/null > +++ b/spec/integration/parser/functions_spec.rb > @@ -0,0 +1,21 @@ > +#!/usr/bin/env ruby > + > +require File.dirname(__FILE__) + '/../../spec_helper' > + > +describe Puppet::Parser::Functions do > + before :each do > + Puppet::Parser::Functions.rmfunction("template") if > Puppet::Parser::Functions.function("template") > + end > + > + it "should support multiple threads autoloading the same function" do > + threads = [] > + lambda { > + 10.times { |a| > + threads << Thread.new { > + Puppet::Parser::Functions.function("template") > + } > + } > + }.should_not raise_error > + threads.each { |t| t.join } > + end > +end > \ No newline at end of file > -- > 1.7.2.1 > > -- > You received this message because you are subscribed to the Google Groups > "Puppet Developers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<puppet-dev%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/puppet-dev?hl=en. > > -- ----------------------------------------------------------- The power of accurate observation is commonly called cynicism by those who have not got it. ~George Bernard Shaw ------------------------------------------------------------ -- You received this message because you are subscribed to the Google Groups "Puppet Developers" 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/puppet-dev?hl=en.
