Instances of this class are LRU caches for disk-based objects which keep track of the cached object‘s modification time, expiring the cached version when the disk-based version changes..
(Not documented)
Create a new cache. This merges the DefaultConfig with the specified values and transforms camelCased keys into under_barred ones.
# File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 62 62: def initialize( name, config={}, &cleanup ) 63: @name = name 64: 65: # Merge defaults and specified values 66: merged = DefaultConfig.merge( config ) 67: 68: # Transform the config hash into the form the superclass expects 69: merged.each_key do |key| 70: lckey = key.to_s.gsub( /(.)([A-Z])/ ) {|match| 71: match[0,1] + "_" + match[1,1].downcase 72: }.intern 73: 74: next if key == lckey 75: merged[ lckey ] = merged.delete( key ) 76: end 77: 78: # Register this instance with the class for introspection (costs 79: # much less than ObjectSpace.each_object). 80: obj = super( merged, &cleanup ) 81: self.class.extent << obj 82: 83: return obj 84: end
Overridden from the superclass to prevent .to_s from being called on objects to determine their size if the object supports a #memsize method. This is mostly to stop templates from being rendered every time they‘re cached.
# File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 136 136: def []=( key, obj ) 137: self.expire 138: 139: self.invalidate( key ) if self.cached?( key ) 140: 141: if obj.respond_to?( :memsize ) 142: size = obj.memsize 143: else 144: size = obj.to_s.size 145: end 146: 147: # Test against size threshold 148: if @max_obj_size && size > @max_obj_size 149: Arrow::Logger[self.class].debug \ 150: "%p not cached: size exceeds maxObjSize: %d" % 151: [ obj, @max_obj_size ] 152: return obj 153: end 154: if @max_obj_size.nil? && @max_size && size > @max_size 155: Arrow::Logger[self.class].debug \ 156: "%p not cached: size exceeds maxSize: %d" % 157: [ obj, @max_size ] 158: return obj 159: end 160: 161: if @max_num && @list.size >= @max_num 162: Arrow::Logger[self.class].debug \ 163: "Dropping %p from the cache: count exceeds maxNum: %d" % 164: [ @list.first, @max_num ] 165: self.invalidate( @list.first ) 166: end 167: 168: @size += size 169: if @max_size 170: while @size > @max_size 171: Arrow::Logger[self.class].debug \ 172: "Dropping %p from the cache: size exceeds maxSize: %d" % 173: [ @list.first, @max_size ] 174: self.invalidate( @list.first ) 175: end 176: end 177: 178: @objs[ key ] = Cache::CACHE_OBJECT.new( obj, size, Time.now.to_i ) 179: @list.push( key ) 180: 181: return obj 182: end
Overridden to provide logging of expire phase.
# File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 126 126: def expire 127: self.log.debug "looking for expired entries in %s" % [self.name] 128: super 129: end
--- SEC00027
--- ""
--- - name: extent rw: R a_desc: "" - name: hits rw: R a_desc: |+ Total count of cache hits - name: list rw: R a_desc: |+ The list of cached objects - name: misses rw: R a_desc: |+ Total count of cache misses - name: name rw: R a_desc: |+ The name of the cache; used in introspection - name: size rw: R a_desc: |+ <a href="Cache.html">Cache</a> size in bytes
--- - methods: - visibility: public aref: M000405 name: new sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 62</span>\n\ 62: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">initialize</span>( <span class=\"ruby-identifier\">name</span>, <span class=\"ruby-identifier\">config</span>={}, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">cleanup</span> )\n\ 63: <span class=\"ruby-ivar\">@name</span> = <span class=\"ruby-identifier\">name</span>\n\ 64: \n\ 65: <span class=\"ruby-comment cmt\"># Merge defaults and specified values</span>\n\ 66: <span class=\"ruby-identifier\">merged</span> = <span class=\"ruby-constant\">DefaultConfig</span>.<span class=\"ruby-identifier\">merge</span>( <span class=\"ruby-identifier\">config</span> )\n\ 67: \n\ 68: <span class=\"ruby-comment cmt\"># Transform the config hash into the form the superclass expects</span>\n\ 69: <span class=\"ruby-identifier\">merged</span>.<span class=\"ruby-identifier\">each_key</span> <span class=\"ruby-keyword kw\">do</span> <span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">key</span><span class=\"ruby-operator\">|</span>\n\ 70: <span class=\"ruby-identifier\">lckey</span> = <span class=\"ruby-identifier\">key</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">gsub</span>( <span class=\"ruby-regexp re\">/(.)([A-Z])/</span> ) {<span class=\"ruby-operator\">|</span><span class=\"ruby-identifier\">match</span><span class=\"ruby-operator\">|</span>\n\ 71: <span class=\"ruby-identifier\">match</span>[<span class=\"ruby-value\">0</span>,<span class=\"ruby-value\">1</span>] <span class=\"ruby-operator\">+</span> <span class=\"ruby-value str\">"_"</span> <span class=\"ruby-operator\">+</span> <span class=\"ruby-identifier\">match</span>[<span class=\"ruby-value\">1</span>,<span class=\"ruby-value\">1</span>].<span class=\"ruby-identifier\">downcase</span>\n\ 72: }.<span class=\"ruby-identifier\">intern</span>\n\ 73: \n\ 74: <span class=\"ruby-keyword kw\">next</span> <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">key</span> <span class=\"ruby-operator\">==</span> <span class=\"ruby-identifier\">lckey</span>\n\ 75: <span class=\"ruby-identifier\">merged</span>[ <span class=\"ruby-identifier\">lckey</span> ] = <span class=\"ruby-identifier\">merged</span>.<span class=\"ruby-identifier\">delete</span>( <span class=\"ruby-identifier\">key</span> )\n\ 76: <span class=\"ruby-keyword kw\">end</span>\n\ 77: \n\ 78: <span class=\"ruby-comment cmt\"># Register this instance with the class for introspection (costs</span>\n\ 79: <span class=\"ruby-comment cmt\"># much less than ObjectSpace.each_object).</span>\n\ 80: <span class=\"ruby-identifier\">obj</span> = <span class=\"ruby-keyword kw\">super</span>( <span class=\"ruby-identifier\">merged</span>, <span class=\"ruby-operator\">&</span><span class=\"ruby-identifier\">cleanup</span> )\n\ 81: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>.<span class=\"ruby-identifier\">extent</span> <span class=\"ruby-operator\"><<</span> <span class=\"ruby-identifier\">obj</span>\n\ 82: \n\ 83: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">obj</span>\n\ 84: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Create a <a href="Cache.html#M000405">new</a> cache. This merges the DefaultConfig with the specified values and transforms camelCased keys into under_barred ones. </p> params: ( name, config={}, &cleanup ) category: Class type: Public - methods: - visibility: public aref: M000409 name: "[]=" sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 136</span>\n\ 136: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-operator\">[]=</span>( <span class=\"ruby-identifier\">key</span>, <span class=\"ruby-identifier\">obj</span> )\n\ 137: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">expire</span>\n\ 138: \n\ 139: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">invalidate</span>( <span class=\"ruby-identifier\">key</span> ) <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">cached?</span>( <span class=\"ruby-identifier\">key</span> )\n\ 140: \n\ 141: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-identifier\">obj</span>.<span class=\"ruby-identifier\">respond_to?</span>( <span class=\"ruby-identifier\">:memsize</span> )\n\ 142: <span class=\"ruby-identifier\">size</span> = <span class=\"ruby-identifier\">obj</span>.<span class=\"ruby-identifier\">memsize</span>\n\ 143: <span class=\"ruby-keyword kw\">else</span>\n\ 144: <span class=\"ruby-identifier\">size</span> = <span class=\"ruby-identifier\">obj</span>.<span class=\"ruby-identifier\">to_s</span>.<span class=\"ruby-identifier\">size</span>\n\ 145: <span class=\"ruby-keyword kw\">end</span>\n\ 146: \n\ 147: <span class=\"ruby-comment cmt\"># Test against size threshold</span>\n\ 148: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@max_obj_size</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-identifier\">size</span> <span class=\"ruby-operator\">></span> <span class=\"ruby-ivar\">@max_obj_size</span>\n\ 149: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>].<span class=\"ruby-identifier\">debug</span> \\\n\ 150: <span class=\"ruby-value str\">"%p not cached: size exceeds maxObjSize: %d"</span> <span class=\"ruby-operator\">%</span>\n\ 151: [ <span class=\"ruby-identifier\">obj</span>, <span class=\"ruby-ivar\">@max_obj_size</span> ]\n\ 152: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">obj</span>\n\ 153: <span class=\"ruby-keyword kw\">end</span>\n\ 154: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@max_obj_size</span>.<span class=\"ruby-identifier\">nil?</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-ivar\">@max_size</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-identifier\">size</span> <span class=\"ruby-operator\">></span> <span class=\"ruby-ivar\">@max_size</span>\n\ 155: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>].<span class=\"ruby-identifier\">debug</span> \\\n\ 156: <span class=\"ruby-value str\">"%p not cached: size exceeds maxSize: %d"</span> <span class=\"ruby-operator\">%</span>\n\ 157: [ <span class=\"ruby-identifier\">obj</span>, <span class=\"ruby-ivar\">@max_size</span> ]\n\ 158: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">obj</span>\n\ 159: <span class=\"ruby-keyword kw\">end</span>\n\ 160: \n\ 161: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@max_num</span> <span class=\"ruby-operator\">&&</span> <span class=\"ruby-ivar\">@list</span>.<span class=\"ruby-identifier\">size</span> <span class=\"ruby-operator\">>=</span> <span class=\"ruby-ivar\">@max_num</span>\n\ 162: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>].<span class=\"ruby-identifier\">debug</span> \\\n\ 163: <span class=\"ruby-value str\">"Dropping %p from the cache: count exceeds maxNum: %d"</span> <span class=\"ruby-operator\">%</span>\n\ 164: [ <span class=\"ruby-ivar\">@list</span>.<span class=\"ruby-identifier\">first</span>, <span class=\"ruby-ivar\">@max_num</span> ]\n\ 165: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">invalidate</span>( <span class=\"ruby-ivar\">@list</span>.<span class=\"ruby-identifier\">first</span> )\n\ 166: <span class=\"ruby-keyword kw\">end</span>\n\ 167: \n\ 168: <span class=\"ruby-ivar\">@size</span> <span class=\"ruby-operator\">+=</span> <span class=\"ruby-identifier\">size</span>\n\ 169: <span class=\"ruby-keyword kw\">if</span> <span class=\"ruby-ivar\">@max_size</span>\n\ 170: <span class=\"ruby-keyword kw\">while</span> <span class=\"ruby-ivar\">@size</span> <span class=\"ruby-operator\">></span> <span class=\"ruby-ivar\">@max_size</span>\n\ 171: <span class=\"ruby-constant\">Arrow</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">Logger</span>[<span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">class</span>].<span class=\"ruby-identifier\">debug</span> \\\n\ 172: <span class=\"ruby-value str\">"Dropping %p from the cache: size exceeds maxSize: %d"</span> <span class=\"ruby-operator\">%</span>\n\ 173: [ <span class=\"ruby-ivar\">@list</span>.<span class=\"ruby-identifier\">first</span>, <span class=\"ruby-ivar\">@max_size</span> ]\n\ 174: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">invalidate</span>( <span class=\"ruby-ivar\">@list</span>.<span class=\"ruby-identifier\">first</span> )\n\ 175: <span class=\"ruby-keyword kw\">end</span>\n\ 176: <span class=\"ruby-keyword kw\">end</span>\n\ 177: \n\ 178: <span class=\"ruby-ivar\">@objs</span>[ <span class=\"ruby-identifier\">key</span> ] = <span class=\"ruby-constant\">Cache</span><span class=\"ruby-operator\">::</span><span class=\"ruby-constant\">CACHE_OBJECT</span>.<span class=\"ruby-identifier\">new</span>( <span class=\"ruby-identifier\">obj</span>, <span class=\"ruby-identifier\">size</span>, <span class=\"ruby-constant\">Time</span>.<span class=\"ruby-identifier\">now</span>.<span class=\"ruby-identifier\">to_i</span> )\n\ 179: <span class=\"ruby-ivar\">@list</span>.<span class=\"ruby-identifier\">push</span>( <span class=\"ruby-identifier\">key</span> )\n\ 180: \n\ 181: <span class=\"ruby-keyword kw\">return</span> <span class=\"ruby-identifier\">obj</span>\n\ 182: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Overridden from the superclass to prevent .to_s from being called on objects to determine their size if the object supports a #memsize method. This is mostly to stop templates from being rendered every time they‘re cached. </p> params: ( key, obj ) - visibility: public aref: M000408 name: expire sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 126</span>\n\ 126: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">expire</span>\n\ 127: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"looking for expired entries in %s"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>]\n\ 128: <span class=\"ruby-keyword kw\">super</span>\n\ 129: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Overridden to provide logging of <a href="Cache.html#M000408">expire</a> phase. </p> params: () - visibility: public aref: M000406 name: invalidate sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 112</span>\n\ 112: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">invalidate</span>( <span class=\"ruby-identifier\">key</span> )\n\ 113: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"invalidating cache key '%p' for %s"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-identifier\">key</span>, <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>]\n\ 114: <span class=\"ruby-keyword kw\">super</span>\n\ 115: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Overridden to provide logging of invalidated keys. </p> params: ( key ) - visibility: public aref: M000407 name: invalidate_all sourcecode: " <span class=\"ruby-comment cmt\"># File /Users/ged/source/ruby/Arrow/lib/arrow/cache.rb, line 119</span>\n\ 119: <span class=\"ruby-keyword kw\">def</span> <span class=\"ruby-identifier\">invalidate_all</span>\n\ 120: <span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">log</span>.<span class=\"ruby-identifier\">debug</span> <span class=\"ruby-value str\">"invalidating all cached objects for %s"</span> <span class=\"ruby-operator\">%</span> [<span class=\"ruby-keyword kw\">self</span>.<span class=\"ruby-identifier\">name</span>]\n\ 121: <span class=\"ruby-keyword kw\">super</span>\n\ 122: <span class=\"ruby-keyword kw\">end</span>" m_desc: |- <p> Overridden for logging. </p> params: () category: Instance type: Public
---
--- - name: DefaultConfig desc: |+ Default configuration values value: "{ :maxNum => 10, :maxObjSize => nil, :maxSize => nil, :expiration => 3600, }"
Generated with the Darkfish Rdoc Generator.