Module MCollective::Cache
In: lib/mcollective/cache.rb

A class to manage a number of named caches. Each cache can have a unique timeout for keys in it and each cache has an independent Mutex protecting access to it.

This cache is setup early in the process of loading the mcollective libraries, before any threads are created etc making it suitable as a cross thread cache or just a store for Mutexes you need to use across threads like in an Agent or something.

   # sets up a new cache, noop if it already exist
   Cache.setup(:ddl, 600)
   => true

   # writes an item to the :ddl cache, this item will
   # be valid on the cache for 600 seconds
   Cache.write(:ddl, :something, "value")
   => "value"

   # reads from the cache, read failures due to non existing
   # data or expired data will raise an exception
   Cache.read(:ddl, :something)
   => "value"

   # time left till expiry, raises if nothing is found
   Cache.ttl(:ddl, :something)
   => 500

   # forcibly evict something from the cache
   Cache.invalidate!(:ddl, :something)
   => "value"

   # deletes an entire named cache and its mutexes
   Cache.delete!(:ddl)
   => true

   # you can also just use this cache as a global mutex store
   Cache.setup(:mylock)

   Cache.synchronize(:mylock) do
     do_something()
   end

Methods

delete!   has_cache?   invalidate!   read   setup   synchronize   ttl   write  

Public Class methods

[Source]

    # File lib/mcollective/cache.rb, line 74
74:     def self.delete!(cache_name)
75:       @locks_mutex.synchronize do
76:         raise("No cache called '%s'" % cache_name) unless @cache_locks.include?(cache_name)
77: 
78:         @cache_locks.delete(cache_name)
79:         @cache.delete(cache_name)
80:       end
81: 
82:       true
83:     end

[Source]

    # File lib/mcollective/cache.rb, line 68
68:     def self.has_cache?(cache_name)
69:       @locks_mutex.synchronize do
70:         @cache.include?(cache_name)
71:       end
72:     end

[Source]

     # File lib/mcollective/cache.rb, line 135
135:     def self.invalidate!(cache_name, key)
136:       raise("No cache called '%s'" % cache_name) unless @cache.include?(cache_name)
137: 
138:       @cache_locks[cache_name].synchronize do
139:         return false unless @cache[cache_name].include?(key)
140: 
141:         @cache[cache_name].delete(key)
142:       end
143:     end

[Source]

     # File lib/mcollective/cache.rb, line 97
 97:     def self.read(cache_name, key)
 98:       raise("No cache called '%s'" % cache_name) unless @cache.include?(cache_name)
 99: 
100:       unless ttl(cache_name, key) > 0
101:         Log.debug("Cache expired on '%s' key '%s'" % [cache_name, key])
102:         raise("Cache for item '%s' on cache '%s' has expired" % [key, cache_name])
103:       end
104: 
105:       Log.debug("Cache hit on '%s' key '%s'" % [cache_name, key])
106: 
107:       @cache_locks[cache_name].synchronize do
108:         @cache[cache_name][key][:value]
109:       end
110:     end

[Source]

    # File lib/mcollective/cache.rb, line 54
54:     def self.setup(cache_name, ttl=300)
55:       @locks_mutex.synchronize do
56:         break if @cache_locks.include?(cache_name)
57: 
58:         @cache_locks[cache_name] = Mutex.new
59: 
60:         @cache_locks[cache_name].synchronize do
61:           @cache[cache_name] = {:max_age => Float(ttl)}
62:         end
63:       end
64: 
65:       true
66:     end

[Source]

     # File lib/mcollective/cache.rb, line 125
125:     def self.synchronize(cache_name)
126:       raise("No cache called '%s'" % cache_name) unless @cache.include?(cache_name)
127: 
128:       raise ("No block supplied to synchronize") unless block_given?
129: 
130:       @cache_locks[cache_name].synchronize do
131:         yield
132:       end
133:     end

[Source]

     # File lib/mcollective/cache.rb, line 112
112:     def self.ttl(cache_name, key)
113:       raise("No cache called '%s'" % cache_name) unless @cache.include?(cache_name)
114: 
115:       @cache_locks[cache_name].synchronize do
116:         unless @cache[cache_name].include?(key)
117:           Log.debug("Cache miss on '%s' key '%s'" % [cache_name, key])
118:           raise("No item called '%s' for cache '%s'" % [key, cache_name])
119:         end
120: 
121:         @cache[cache_name][:max_age] - (Time.now - @cache[cache_name][key][:cache_create_time])
122:       end
123:     end

[Source]

    # File lib/mcollective/cache.rb, line 85
85:     def self.write(cache_name, key, value)
86:       raise("No cache called '%s'" % cache_name) unless @cache.include?(cache_name)
87: 
88:       @cache_locks[cache_name].synchronize do
89:         @cache[cache_name][key] ||= {}
90:         @cache[cache_name][key][:cache_create_time] = Time.now
91:         @cache[cache_name][key][:value] = value
92:       end
93: 
94:       value
95:     end

[Validate]