UNPKG

28.6 kBHTMLView Raw
1<!DOCTYPE html> <html> <head> <title>LogCache.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <div id="jump_to"> Jump To &hellip; <div id="jump_wrapper"> <div id="jump_page"> <a class="source" href="ByteIterable.html"> ByteIterable.coffee </a> <a class="source" href="ByteIterator.html"> ByteIterator.coffee </a> <a class="source" href="ArrayByteIterable.html"> ArrayByteIterable.coffee </a> <a class="source" href="ByteIterableBase.html"> ByteIterableBase.coffee </a> <a class="source" href="ByteIterableUtil.html"> ByteIterableUtil.coffee </a> <a class="source" href="LightOutputStream.html"> LightOutputStream.coffee </a> <a class="source" href="StoreConfiguration.html"> StoreConfiguration.coffee </a> <a class="source" href="Reader.html"> Reader.coffee </a> <a class="source" href="Writer.html"> Writer.coffee </a> <a class="source" href="List.html"> List.coffee </a> <a class="source" href="ListNode.html"> ListNode.coffee </a> <a class="source" href="Cursor.html"> Cursor.coffee </a> <a class="source" href="DatabaseRoot.html"> DatabaseRoot.coffee </a> <a class="source" href="Environment.html"> Environment.coffee </a> <a class="source" href="EnvironmentConfig.html"> EnvironmentConfig.coffee </a> <a class="source" href="Store.html"> Store.coffee </a> <a class="source" href="Transaction.html"> Transaction.coffee </a> <a class="source" href="Addr64.html"> Addr64.coffee </a> <a class="source" href="DataIterator.html"> DataIterator.coffee </a> <a class="source" href="Log.html"> Log.coffee </a> <a class="source" href="LogCache.html"> LogCache.coffee </a> <a class="source" href="LogConfig.html"> LogConfig.coffee </a> <a class="source" href="LogUtil.html"> LogUtil.coffee </a> <a class="source" href="Loggable.html"> Loggable.coffee </a> <a class="source" href="LoggableFactory.html"> LoggableFactory.coffee </a> <a class="source" href="LoggableIterator.html"> LoggableIterator.coffee </a> <a class="source" href="LoggableToWrite.html"> LoggableToWrite.coffee </a> <a class="source" href="NullLoggable.html"> NullLoggable.coffee </a> <a class="source" href="RandomAccessByteIterable.html"> RandomAccessByteIterable.coffee </a> <a class="source" href="RandomAccessLoggable.html"> RandomAccessLoggable.coffee </a> <a class="source" href="RandomAccessLoggableIterator.html"> RandomAccessLoggableIterator.coffee </a> <a class="source" href="StackList.html"> StackList.coffee </a> <a class="source" href="CompoundByteIterable.html"> CompoundByteIterable.coffee </a> <a class="source" href="CompoundByteIteratorBase.html"> CompoundByteIteratorBase.coffee </a> <a class="source" href="CompressedUnsignedLongByteIterable.html"> CompressedUnsignedLongByteIterable.coffee </a> <a class="source" href="FixedLengthByteIterable.html"> FixedLengthByteIterable.coffee </a> </div> </div> </div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> LogCache.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">&#182;</a> </div> </td> <td class="code"> <div class="highlight"><pre><span class="nv">fs = </span><span class="nx">require</span> <span class="s1">&#39;fs&#39;</span>
2<span class="nv">Addr64 = </span><span class="p">(</span><span class="nx">require</span> <span class="s1">&#39;./Addr64.coffee&#39;</span><span class="p">).</span><span class="nx">Addr64</span>
3<span class="nv">LogUtil = </span><span class="p">(</span><span class="nx">require</span> <span class="s1">&#39;./LogUtil.coffee&#39;</span><span class="p">).</span><span class="nx">LogUtil</span>
4<span class="nv">StackList = </span><span class="p">(</span><span class="nx">require</span> <span class="s1">&#39;./StackList.coffee&#39;</span><span class="p">).</span><span class="nx">StackList</span>
5<span class="nv">EventEmitter = </span><span class="p">(</span><span class="nx">require</span> <span class="s1">&#39;events&#39;</span><span class="p">).</span><span class="nx">EventEmitter</span></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>This class provides cache for reading data from disk. It is connected with
6some directory on disk that contains files that all but one have fixed size.
7Every file contain several pages of fixed size. Cache provides rapid access
8to often asked pages and slow access for rearly used pages. Page size is
9expected to be less or equal to file size. Cache is used by Log for reading
10data.</p> </td> <td class="code"> <div class="highlight"><pre><span class="k">class</span> <span class="nx">LogCache</span> <span class="k">extends</span> <span class="nx">EventEmitter</span>
11 <span class="vi">@MINIMUM_PAGE_SIZE: </span><span class="nx">LogUtil</span><span class="p">.</span><span class="nx">LOG_BLOCK_ALIGNMENT</span>
12 <span class="vi">@DEFAULT_OPEN_FILES_COUNT: </span><span class="mi">16</span>
13 <span class="vi">@MINIMUM_MEM_USAGE_PERCENT: </span><span class="mi">5</span>
14 <span class="vi">@MAXIMUM_MEM_USAGE_PERCENT: </span><span class="mi">95</span></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">directory: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">fileSize: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">fileMask: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">fileOffset: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">fileAddr: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pageSize: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pageMask: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pageOffset: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pageAddr: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pages: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">&#182;</a> </div> <p>@private</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">pageRequests: </span><span class="kc">undefined</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">&#182;</a> </div> <p>Constructor.</p>
15
16<p>@param directory the directory with log files.
17@param logFileSize the logarithm of file size.
18@param logPageSize the logarithm of page size.
19@param maxNumberOfPages maximum number of pages to be stored in cache.
20PageRequests[key] contains true of the page that starts with addr "key" was
21requested recently and is waited to be read from disk (or is already in
22cache); othrewise it is undefined.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@create$String$int$int</span><span class="nv">$int: </span><span class="nf">(directory, fileSize, pageSize, maxNumberOfPages, o) -&gt;</span>
23 <span class="k">if</span> <span class="o">!</span><span class="nx">o</span><span class="o">?</span> <span class="k">then</span> <span class="nv">o = </span><span class="k">new</span> <span class="nx">LogCache</span>
24 <span class="nv">o.directory = </span><span class="nx">directory</span>
25 <span class="nv">o.fileSize = </span><span class="nx">fileSize</span>
26 <span class="nv">o.pageSize = </span><span class="nx">pageSize</span>
27 <span class="nv">o.fileMask = </span><span class="nx">Addr64</span><span class="p">.</span><span class="nx">create$int$int</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">fileSize</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
28 <span class="nv">o.pageMask = </span><span class="nx">Addr64</span><span class="p">.</span><span class="nx">create$int$int</span> <span class="mi">0</span><span class="p">,</span> <span class="p">(</span><span class="nx">o</span><span class="p">.</span><span class="nx">pageSize</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
29 <span class="nv">o.pages = </span><span class="k">new</span> <span class="nx">StackList</span> <span class="nx">maxNumberOfPages</span>
30 <span class="nv">o.pageRequests = </span><span class="k">new</span> <span class="nb">Object</span><span class="p">()</span>
31 <span class="k">return</span> <span class="nx">o</span>
32
33 <span class="nv">getFileMask: </span><span class="nf">() -&gt;</span>
34 <span class="k">return</span> <span class="nx">@fileMask</span>
35
36 <span class="nv">getPageMask: </span><span class="nf">() -&gt;</span>
37 <span class="k">return</span> <span class="nx">@pageMask</span>
38
39 <span class="nv">getPageSize: </span><span class="nf">() -&gt;</span>
40 <span class="k">return</span> <span class="nx">@pageSize</span>
41
42 <span class="nv">getPageAddr: </span><span class="nf">() -&gt;</span>
43 <span class="k">return</span> <span class="nx">@pageAddr</span>
44
45 <span class="nv">getPageOffset: </span><span class="nf">() -&gt;</span>
46 <span class="k">return</span> <span class="nx">@pageOffset</span>
47
48 <span class="nv">getHighAddress: </span><span class="nf">() -&gt;</span>
49 <span class="k">return</span> <span class="nx">LogUtil</span><span class="p">.</span><span class="nx">getHighAddress$String</span> <span class="nx">@directory</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">&#182;</a> </div> <p>Get all information about page from any addr inside it. PageAddr and
50fileAddr contain addrs of the beginning of file (which is used to determine
51file name - fn) and page (which is used to determine page name). PageOffset
52is an offset inside page, and fileOffset is the position where this page
53begins in this file.</p>
54
55<p>@param addr address inside cache page.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">parseAddr</span><span class="nv">$Addr64: </span><span class="nf">(addr) -&gt;</span>
56 <span class="vi">@pageOffset = </span><span class="nx">addr</span><span class="p">.</span><span class="nx">logAnd$Addr64</span><span class="p">(</span><span class="nx">@pageMask</span><span class="p">).</span><span class="nx">toFloat</span><span class="p">()</span>
57 <span class="vi">@pageAddr = </span><span class="nx">addr</span><span class="p">.</span><span class="nx">plus$int</span><span class="p">(</span><span class="o">-</span><span class="nx">@pageOffset</span><span class="p">)</span>
58 <span class="vi">@fileOffset = </span><span class="nx">addr</span><span class="p">.</span><span class="nx">logAnd$Addr64</span><span class="p">(</span><span class="nx">@fileMask</span><span class="p">).</span><span class="nx">toFloat</span><span class="p">()</span>
59 <span class="vi">@fileAddr = </span><span class="nx">addr</span><span class="p">.</span><span class="nx">plus$int</span><span class="p">(</span><span class="o">-</span><span class="nx">@fileOffset</span><span class="p">)</span>
60 <span class="nx">@fileOffset</span> <span class="o">-=</span> <span class="nx">@pageOffset</span>
61 <span class="vi">@fn = </span><span class="nx">@directory</span> <span class="o">+</span> <span class="nx">LogUtil</span><span class="p">.</span><span class="nx">getLogFilename$Addr64</span> <span class="nx">@fileAddr</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">&#182;</a> </div> <p>Get page that is next after page with this addr inside it.</p>
62
63<p>@param addr address inside cache page.
64@return page (Buffer) or undefined if page is not in cache. If undefined
65is returned, 'getPageXXX' is emitted, where XXX is page addr.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">getNextPage$Addr64</span><span class="nv">$emit: </span><span class="nf">(addr) -&gt;</span>
66 <span class="nv">addr = </span><span class="nx">addr</span><span class="p">.</span><span class="nx">plus$int</span> <span class="nx">@pageSize</span>
67 <span class="k">return</span> <span class="nx">@getPage$Addr64$emit</span> <span class="nx">addr</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">&#182;</a> </div> <p>Get page with this addr inside it.</p>
68
69<p>@param addr address inside cache page.
70@return page (Buffer) or undefined if page is not in cache. If undefined
71is returned, 'getPageXXX' is emitted, where XXX is page addr.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">getPage$Addr64</span><span class="nv">$emit: </span><span class="nf">(addr) -&gt;</span>
72 <span class="nx">@parseAddr$Addr64</span> <span class="nx">addr</span>
73 <span class="nv">addrStr = </span><span class="nx">Addr64</span><span class="p">.</span><span class="nx">addr64ToString$Addr64$int</span><span class="p">(</span><span class="nx">@pageAddr</span><span class="p">,</span> <span class="nx">LogUtil</span><span class="p">.</span><span class="nx">LOG_NAME_BASE</span><span class="p">)</span>
74 <span class="k">if</span> <span class="p">(</span><span class="nx">@pages</span><span class="p">.</span><span class="nx">get</span> <span class="nx">addrStr</span><span class="p">)</span> <span class="o">!=</span> <span class="kc">undefined</span>
75 <span class="nx">@pages</span><span class="p">.</span><span class="nx">moveToTop</span> <span class="nx">addrStr</span>
76 <span class="k">return</span> <span class="nx">@pages</span><span class="p">.</span><span class="nx">get</span> <span class="nx">addrStr</span>
77 <span class="k">else</span> <span class="k">if</span> <span class="nx">@pageRequests</span><span class="p">[</span><span class="nx">addrStr</span><span class="p">]</span> <span class="o">==</span> <span class="kc">undefined</span>
78 <span class="nx">@pageRequests</span><span class="p">[</span><span class="nx">addrStr</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span>
79 <span class="nv">pageAddr = </span><span class="nx">@pageAddr</span>
80 <span class="nv">fileOffset = </span><span class="nx">@fileOffset</span>
81 <span class="nv">fileAddr = </span><span class="nx">@fileAddr</span>
82 <span class="nv">fn = </span><span class="nx">@fn</span>
83 <span class="nx">fs</span><span class="p">.</span><span class="nx">open</span> <span class="nx">fn</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="s2">&quot;0666&quot;</span><span class="p">,</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">fd</span><span class="p">)</span> <span class="o">=&gt;</span>
84 <span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
85 <span class="nv">options = </span><span class="p">{</span><span class="nv">flags: </span><span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="nv">encoding: </span><span class="kc">null</span><span class="p">,</span> <span class="nv">mode: </span><span class="s2">&quot;0666&quot;</span><span class="p">,</span> <span class="nv">start: </span><span class="nx">fileOffset</span><span class="p">}</span>
86 <span class="nv">readStream = </span><span class="nx">fs</span><span class="p">.</span><span class="nx">createReadStream</span> <span class="nx">fn</span><span class="p">,</span> <span class="nx">options</span>
87 <span class="nv">emitGetPage = </span><span class="kc">true</span>
88 <span class="nv">bytesRead = </span><span class="mi">0</span>
89 <span class="nv">buffer = </span><span class="k">new</span> <span class="nx">Buffer</span> <span class="nx">@pageSize</span>
90 <span class="nx">readStream</span><span class="p">.</span><span class="kc">on</span> <span class="s1">&#39;data&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="o">=&gt;</span>
91 <span class="k">if</span> <span class="nx">emitGetPage</span>
92 <span class="k">if</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span> <span class="o">&lt;</span> <span class="nx">@pageSize</span> <span class="o">-</span> <span class="nx">bytesRead</span>
93 <span class="nx">data</span><span class="p">.</span><span class="nx">copy</span> <span class="nx">buffer</span><span class="p">,</span> <span class="nx">bytesRead</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span>
94 <span class="nx">bytesRead</span> <span class="o">+=</span> <span class="nx">data</span><span class="p">.</span><span class="nx">length</span>
95 <span class="k">else</span>
96 <span class="nx">data</span><span class="p">.</span><span class="nx">copy</span> <span class="nx">buffer</span><span class="p">,</span> <span class="nx">bytesRead</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">@pageSize</span> <span class="o">-</span> <span class="nx">bytesRead</span>
97 <span class="nv">bytesRead = </span><span class="nx">@pageSize</span>
98 <span class="k">if</span> <span class="nx">bytesRead</span> <span class="o">==</span> <span class="nx">@pageSize</span> <span class="o">&amp;&amp;</span> <span class="nx">emitGetPage</span>
99 <span class="k">if</span> <span class="nx">@pages</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="nx">@pages</span><span class="p">.</span><span class="nx">limit</span>
100 <span class="nx">@pageRequests</span><span class="p">[</span><span class="nx">@pages</span><span class="p">.</span><span class="nx">bottomKey</span><span class="p">()]</span> <span class="o">=</span> <span class="kc">undefined</span>
101 <span class="nx">@pageRequests</span><span class="p">[</span><span class="nx">addrStr</span><span class="p">]</span> <span class="o">=</span> <span class="kc">undefined</span>
102 <span class="nx">@pages</span><span class="p">.</span><span class="nx">push</span> <span class="nx">addrStr</span><span class="p">,</span> <span class="nx">buffer</span>
103 <span class="nx">@emit</span> <span class="s1">&#39;getPage&#39;</span> <span class="o">+</span> <span class="nx">addrStr</span><span class="p">,</span> <span class="nx">buffer</span><span class="p">,</span> <span class="nx">addrStr</span>
104 <span class="nv">emitGetPage = </span><span class="kc">false</span>
105 <span class="nx">readStream</span><span class="p">.</span><span class="kc">on</span> <span class="s1">&#39;error&#39;</span><span class="p">,</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span>
106 <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="nx">err</span>
107 <span class="nx">readStream</span><span class="p">.</span><span class="kc">on</span> <span class="s1">&#39;end&#39;</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span>
108 <span class="k">if</span> <span class="nx">emitGetPage</span>
109 <span class="k">if</span> <span class="nx">@pages</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="nx">@pages</span><span class="p">.</span><span class="nx">limit</span>
110 <span class="nx">@pageRequests</span><span class="p">[</span><span class="nx">@pages</span><span class="p">.</span><span class="nx">bottomKey</span><span class="p">()]</span> <span class="o">=</span> <span class="kc">undefined</span>
111 <span class="nx">@pageRequests</span><span class="p">[</span><span class="nx">addrStr</span><span class="p">]</span> <span class="o">=</span> <span class="kc">undefined</span>
112 <span class="nx">@pages</span><span class="p">.</span><span class="nx">push</span> <span class="nx">addrStr</span><span class="p">,</span> <span class="nx">buffer</span>
113 <span class="nx">@emit</span> <span class="s1">&#39;getPage&#39;</span> <span class="o">+</span> <span class="nx">addrStr</span><span class="p">,</span> <span class="nx">buffer</span><span class="p">,</span> <span class="nx">addrStr</span>
114 <span class="nv">emitGetPage = </span><span class="kc">false</span>
115 <span class="k">return</span> <span class="kc">undefined</span>
116 <span class="k">else</span>
117 <span class="k">return</span> <span class="kc">undefined</span>
118
119<span class="nv">exports.LogCache = </span><span class="nx">LogCache</span>
120
121</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>
\No newline at end of file