summaryrefslogtreecommitdiffstats
path: root/lib/puppet
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet')
-rw-r--r--lib/puppet/util/cacher.rb38
1 files changed, 34 insertions, 4 deletions
diff --git a/lib/puppet/util/cacher.rb b/lib/puppet/util/cacher.rb
index a9fb890c6..ef619c9a6 100644
--- a/lib/puppet/util/cacher.rb
+++ b/lib/puppet/util/cacher.rb
@@ -36,11 +36,9 @@ module Puppet::Util::Cacher
# Methods that can get added to a class.
module ClassMethods
- private
-
# Provide a means of defining an attribute whose value will be cached.
# Must provide a block capable of defining the value if it's flushed..
- def cached_attr(name, &block)
+ def cached_attr(name, options = {}, &block)
init_method = "init_" + name.to_s
define_method(init_method, &block)
@@ -53,6 +51,20 @@ module Puppet::Util::Cacher
cache_timestamp
value_cache[name] = value
end
+
+ if ttl = options[:ttl]
+ set_attr_ttl(name, ttl)
+ end
+ end
+
+ def attr_ttl(name)
+ return nil unless @attr_ttls
+ @attr_ttls[name]
+ end
+
+ def set_attr_ttl(name, value)
+ @attr_ttls ||= {}
+ @attr_ttls[name] = Integer(value)
end
end
@@ -84,9 +96,11 @@ module Puppet::Util::Cacher
def cached_value(name)
# Allow a nil expirer, in which case we regenerate the value every time.
- if expirer.nil? or expirer.expired?(cache_timestamp)
+ if expired_by_expirer?(name)
value_cache.clear
@cache_timestamp = Time.now
+ elsif expired_by_ttl?(name)
+ value_cache.delete(name)
end
unless value_cache.include?(name)
value_cache[name] = send("init_%s" % name)
@@ -94,6 +108,22 @@ module Puppet::Util::Cacher
value_cache[name]
end
+ def expired_by_expirer?(name)
+ if expirer.nil?
+ return true unless self.class.attr_ttl(name)
+ end
+ return expirer.expired?(cache_timestamp)
+ end
+
+ def expired_by_ttl?(name)
+ return false unless ttl = self.class.attr_ttl(name)
+
+ @ttl_timestamps ||= {}
+ @ttl_timestamps[name] ||= Time.now
+
+ return (Time.now - @ttl_timestamps[name]) > ttl
+ end
+
def value_cache
unless defined?(@value_cache) and @value_cache
@value_cache = {}