summaryrefslogtreecommitdiffstats
path: root/lib/puppet/node
diff options
context:
space:
mode:
authorJesse Wolfe <jes5199@gmail.com>2010-07-27 10:20:27 -0700
committerJesse Wolfe <jes5199@gmail.com>2010-07-27 10:20:45 -0700
commitd5db8db116aff58215ab0feebd7ec02086040f51 (patch)
tree58489a37bd0ee14b3d053a0e23f9638b4f6205e7 /lib/puppet/node
parent865282ae7b9332fdbdfa51b2814755b8a13d244b (diff)
parentb53e7d78e2e87571ae53170e9716b9ccd75da6e2 (diff)
downloadpuppet-d5db8db116aff58215ab0feebd7ec02086040f51.tar.gz
puppet-d5db8db116aff58215ab0feebd7ec02086040f51.tar.xz
puppet-d5db8db116aff58215ab0feebd7ec02086040f51.zip
Merge branch 'next'
This synchronizes the 2.7 master branch with 2.6.1RC1
Diffstat (limited to 'lib/puppet/node')
-rw-r--r--lib/puppet/node/environment.rb20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/puppet/node/environment.rb b/lib/puppet/node/environment.rb
index 762599cff..3f67474f9 100644
--- a/lib/puppet/node/environment.rb
+++ b/lib/puppet/node/environment.rb
@@ -1,4 +1,5 @@
require 'puppet/util/cacher'
+require 'monitor'
# Just define it, so this class has fewer load dependencies.
class Puppet::Node
@@ -67,14 +68,23 @@ class Puppet::Node::Environment
def initialize(name)
@name = name
+ extend MonitorMixin
end
def known_resource_types
- if @known_resource_types.nil? or @known_resource_types.stale?
- @known_resource_types = Puppet::Resource::TypeCollection.new(self)
- @known_resource_types.perform_initial_import
- end
- @known_resource_types
+ # This makes use of short circuit evaluation to get the right thread-safe
+ # per environment semantics with an efficient most common cases; we almost
+ # always just return our thread's known-resource types. Only at the start
+ # of a compilation (after our thread var has been set to nil) or when the
+ # environment has changed do we delve deeper.
+ Thread.current[:known_resource_types] = nil if (krt = Thread.current[:known_resource_types]) && krt.environment != self
+ Thread.current[:known_resource_types] ||= synchronize {
+ if @known_resource_types.nil? or @known_resource_types.stale?
+ @known_resource_types = Puppet::Resource::TypeCollection.new(self)
+ @known_resource_types.perform_initial_import
+ end
+ @known_resource_types
+ }
end
def module(name)