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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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