+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.

Reply via email to