1 <?xml version="1.0" encoding="iso-8859-1"?>
3 PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
6 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
8 <title>Module: MCollective::Cache</title>
9 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10 <meta http-equiv="Content-Script-Type" content="text/javascript" />
11 <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12 <script type="text/javascript">
15 function popupCode( url ) {
16 window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
19 function toggleCode( id ) {
20 if ( document.getElementById )
21 elem = document.getElementById( id );
22 else if ( document.all )
23 elem = eval( "document.all." + id );
27 elemStyle = elem.style;
29 if ( elemStyle.display != "block" ) {
30 elemStyle.display = "block"
32 elemStyle.display = "none"
38 // Make codeblocks hidden by default
39 document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
49 <div id="classHeader">
50 <table class="header-table">
51 <tr class="top-aligned-row">
52 <td><strong>Module</strong></td>
53 <td class="class-name-in-header">MCollective::Cache</td>
55 <tr class="top-aligned-row">
56 <td><strong>In:</strong></td>
58 <a href="../../files/lib/mcollective/cache_rb.html">
59 lib/mcollective/cache.rb
67 <!-- banner header -->
69 <div id="bodyContent">
73 <div id="contextContent">
75 <div id="description">
77 A class to manage a number of named caches. Each cache can have a unique
78 timeout for keys in it and each cache has an independent Mutex protecting
82 This cache is <a href="Cache.html#M000272">setup</a> early in the process
83 of loading the mcollective libraries, before any threads are created etc
84 making it suitable as a cross thread cache or just a store for Mutexes you
85 need to use across threads like in an <a href="Agent.html">Agent</a> or
89 # sets up a new cache, noop if it already exist
90 Cache.setup(:ddl, 600)
93 # writes an item to the :ddl cache, this item will
94 # be valid on the cache for 600 seconds
95 Cache.write(:ddl, :something, "value")
96 => "value"
98 # reads from the cache, read failures due to non existing
99 # data or expired data will raise an exception
100 Cache.read(:ddl, :something)
101 => "value"
103 # time left till expiry, raises if nothing is found
104 Cache.ttl(:ddl, :something)
107 # forcibly evict something from the cache
108 Cache.invalidate!(:ddl, :something)
109 => "value"
111 # deletes an entire named cache and its mutexes
115 # you can also just use this cache as a global mutex store
118 Cache.synchronize(:mylock) do
128 <div id="method-list">
129 <h3 class="section-bar">Methods</h3>
131 <div class="name-list">
132 <a href="#M000273">check_cache!</a>
133 <a href="#M000275">delete!</a>
134 <a href="#M000274">has_cache?</a>
135 <a href="#M000280">invalidate!</a>
136 <a href="#M000277">read</a>
137 <a href="#M000272">setup</a>
138 <a href="#M000279">synchronize</a>
139 <a href="#M000278">ttl</a>
140 <a href="#M000276">write</a>
158 <!-- if method_list -->
160 <h3 class="section-bar">Public Class methods</h3>
162 <div id="method-M000273" class="method-detail">
163 <a name="M000273"></a>
165 <div class="method-heading">
166 <a href="#M000273" class="method-signature">
167 <span class="method-name">check_cache!</span><span class="method-args">(cache_name)</span>
171 <div class="method-description">
172 <p><a class="source-toggle" href="#"
173 onclick="toggleCode('M000273-source');return false;">[Source]</a></p>
174 <div class="method-source-code" id="M000273-source">
176 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 70</span>
177 70: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
178 71: <span class="ruby-identifier">raise_code</span>(<span class="ruby-identifier">:PLMC13</span>, <span class="ruby-value str">"Could not find a cache called '%{cache_name}'"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:cache_name</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">cache_name</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">has_cache?</span>(<span class="ruby-identifier">cache_name</span>)
179 72: <span class="ruby-keyword kw">end</span>
185 <div id="method-M000275" class="method-detail">
186 <a name="M000275"></a>
188 <div class="method-heading">
189 <a href="#M000275" class="method-signature">
190 <span class="method-name">delete!</span><span class="method-args">(cache_name)</span>
194 <div class="method-description">
195 <p><a class="source-toggle" href="#"
196 onclick="toggleCode('M000275-source');return false;">[Source]</a></p>
197 <div class="method-source-code" id="M000275-source">
199 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 80</span>
200 80: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">delete!</span>(<span class="ruby-identifier">cache_name</span>)
201 81: <span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
203 83: <span class="ruby-ivar">@locks_mutex</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
204 84: <span class="ruby-ivar">@cache_locks</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">cache_name</span>)
205 85: <span class="ruby-ivar">@cache</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">cache_name</span>)
206 86: <span class="ruby-keyword kw">end</span>
208 88: <span class="ruby-keyword kw">true</span>
209 89: <span class="ruby-keyword kw">end</span>
215 <div id="method-M000274" class="method-detail">
216 <a name="M000274"></a>
218 <div class="method-heading">
219 <a href="#M000274" class="method-signature">
220 <span class="method-name">has_cache?</span><span class="method-args">(cache_name)</span>
224 <div class="method-description">
225 <p><a class="source-toggle" href="#"
226 onclick="toggleCode('M000274-source');return false;">[Source]</a></p>
227 <div class="method-source-code" id="M000274-source">
229 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 74</span>
230 74: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">has_cache?</span>(<span class="ruby-identifier">cache_name</span>)
231 75: <span class="ruby-ivar">@locks_mutex</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
232 76: <span class="ruby-ivar">@cache</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">cache_name</span>)
233 77: <span class="ruby-keyword kw">end</span>
234 78: <span class="ruby-keyword kw">end</span>
240 <div id="method-M000280" class="method-detail">
241 <a name="M000280"></a>
243 <div class="method-heading">
244 <a href="#M000280" class="method-signature">
245 <span class="method-name">invalidate!</span><span class="method-args">(cache_name, key)</span>
249 <div class="method-description">
250 <p><a class="source-toggle" href="#"
251 onclick="toggleCode('M000280-source');return false;">[Source]</a></p>
252 <div class="method-source-code" id="M000280-source">
254 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 139</span>
255 139: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">invalidate!</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">key</span>)
256 140: <span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
258 142: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
259 143: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>)
261 145: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">key</span>)
262 146: <span class="ruby-keyword kw">end</span>
263 147: <span class="ruby-keyword kw">end</span>
269 <div id="method-M000277" class="method-detail">
270 <a name="M000277"></a>
272 <div class="method-heading">
273 <a href="#M000277" class="method-signature">
274 <span class="method-name">read</span><span class="method-args">(cache_name, key)</span>
278 <div class="method-description">
279 <p><a class="source-toggle" href="#"
280 onclick="toggleCode('M000277-source');return false;">[Source]</a></p>
281 <div class="method-source-code" id="M000277-source">
283 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 103</span>
284 103: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">read</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">key</span>)
285 104: <span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
287 106: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">ttl</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">key</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
288 107: <span class="ruby-identifier">raise_code</span>(<span class="ruby-identifier">:PLMC11</span>, <span class="ruby-value str">"Cache expired on '%{cache_name}' key '%{item}'"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:cache_name</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">:item</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">key</span>)
289 108: <span class="ruby-keyword kw">end</span>
291 110: <span class="ruby-identifier">log_code</span>(<span class="ruby-identifier">:PLMC12</span>, <span class="ruby-value str">"Cache hit on '%{cache_name}' key '%{item}'"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:cache_name</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">:item</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">key</span>)
293 112: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
294 113: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>][<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:value</span>]
295 114: <span class="ruby-keyword kw">end</span>
296 115: <span class="ruby-keyword kw">end</span>
302 <div id="method-M000272" class="method-detail">
303 <a name="M000272"></a>
305 <div class="method-heading">
306 <a href="#M000272" class="method-signature">
307 <span class="method-name">setup</span><span class="method-args">(cache_name, ttl=300)</span>
311 <div class="method-description">
312 <p><a class="source-toggle" href="#"
313 onclick="toggleCode('M000272-source');return false;">[Source]</a></p>
314 <div class="method-source-code" id="M000272-source">
316 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 56</span>
317 56: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">setup</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">ttl</span>=<span class="ruby-value">300</span>)
318 57: <span class="ruby-ivar">@locks_mutex</span>.<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
319 58: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@cache_locks</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">cache_name</span>)
321 60: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>] = <span class="ruby-constant">Mutex</span>.<span class="ruby-identifier">new</span>
323 62: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
324 63: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>] = {<span class="ruby-identifier">:max_age</span> =<span class="ruby-operator">></span> <span class="ruby-constant">Float</span>(<span class="ruby-identifier">ttl</span>)}
325 64: <span class="ruby-keyword kw">end</span>
326 65: <span class="ruby-keyword kw">end</span>
328 67: <span class="ruby-keyword kw">true</span>
329 68: <span class="ruby-keyword kw">end</span>
335 <div id="method-M000279" class="method-detail">
336 <a name="M000279"></a>
338 <div class="method-heading">
339 <a href="#M000279" class="method-signature">
340 <span class="method-name">synchronize</span><span class="method-args">(cache_name) {|| ...}</span>
344 <div class="method-description">
345 <p><a class="source-toggle" href="#"
346 onclick="toggleCode('M000279-source');return false;">[Source]</a></p>
347 <div class="method-source-code" id="M000279-source">
349 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 129</span>
350 129: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">synchronize</span>(<span class="ruby-identifier">cache_name</span>)
351 130: <span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
353 132: <span class="ruby-identifier">raise_code</span>(<span class="ruby-identifier">:PLMC14</span>, <span class="ruby-value str">"No block supplied to synchronize on cache '%{cache_name}'"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:cache_name</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">cache_name</span>) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">block_given?</span>
355 134: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
356 135: <span class="ruby-keyword kw">yield</span>
357 136: <span class="ruby-keyword kw">end</span>
358 137: <span class="ruby-keyword kw">end</span>
364 <div id="method-M000278" class="method-detail">
365 <a name="M000278"></a>
367 <div class="method-heading">
368 <a href="#M000278" class="method-signature">
369 <span class="method-name">ttl</span><span class="method-args">(cache_name, key)</span>
373 <div class="method-description">
374 <p><a class="source-toggle" href="#"
375 onclick="toggleCode('M000278-source');return false;">[Source]</a></p>
376 <div class="method-source-code" id="M000278-source">
378 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 117</span>
379 117: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">ttl</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">key</span>)
380 118: <span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
382 120: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
383 121: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">key</span>)
384 122: <span class="ruby-identifier">raise_code</span>(<span class="ruby-identifier">:PLMC15</span>, <span class="ruby-value str">"No item called '%{item}' for cache '%{cache_name}'"</span>, <span class="ruby-identifier">:debug</span>, <span class="ruby-identifier">:cache_name</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">:item</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">key</span>)
385 123: <span class="ruby-keyword kw">end</span>
387 125: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>][<span class="ruby-identifier">:max_age</span>] <span class="ruby-operator">-</span> (<span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>][<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:cache_create_time</span>])
388 126: <span class="ruby-keyword kw">end</span>
389 127: <span class="ruby-keyword kw">end</span>
395 <div id="method-M000276" class="method-detail">
396 <a name="M000276"></a>
398 <div class="method-heading">
399 <a href="#M000276" class="method-signature">
400 <span class="method-name">write</span><span class="method-args">(cache_name, key, value)</span>
404 <div class="method-description">
405 <p><a class="source-toggle" href="#"
406 onclick="toggleCode('M000276-source');return false;">[Source]</a></p>
407 <div class="method-source-code" id="M000276-source">
409 <span class="ruby-comment cmt"># File lib/mcollective/cache.rb, line 91</span>
410 91: <span class="ruby-keyword kw">def</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">write</span>(<span class="ruby-identifier">cache_name</span>, <span class="ruby-identifier">key</span>, <span class="ruby-identifier">value</span>)
411 92: <span class="ruby-identifier">check_cache!</span>(<span class="ruby-identifier">cache_name</span>)
413 94: <span class="ruby-ivar">@cache_locks</span>[<span class="ruby-identifier">cache_name</span>].<span class="ruby-identifier">synchronize</span> <span class="ruby-keyword kw">do</span>
414 95: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>][<span class="ruby-identifier">key</span>] <span class="ruby-operator">||=</span> {}
415 96: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>][<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:cache_create_time</span>] = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
416 97: <span class="ruby-ivar">@cache</span>[<span class="ruby-identifier">cache_name</span>][<span class="ruby-identifier">key</span>][<span class="ruby-identifier">:value</span>] = <span class="ruby-identifier">value</span>
417 98: <span class="ruby-keyword kw">end</span>
419 100: <span class="ruby-identifier">value</span>
420 101: <span class="ruby-keyword kw">end</span>
433 <div id="validator-badges">
434 <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>