1import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as i,c as u,a as n,b as s,d as a,w as p,e as c}from"./app-d4e6481d.js";const k={},d={href:"http://hscarb.github.io/rocketmq/20220301-rocketmq-indexfile.html",target:"_blank",rel:"noopener noreferrer"},r=n("h1",{id:"rocketmq-indexfile-ç´¢å¼æä»¶",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#rocketmq-indexfile-ç´¢å¼æä»¶","aria-hidden":"true"},"#"),s(" RocketMQ IndexFile ç´¢å¼æä»¶")],-1),m={class:"table-of-contents"},v=c('<h2 id="_1-æ¦è¿°" tabindex="-1"><a class="header-anchor" href="#_1-æ¦è¿°" aria-hidden="true">#</a> 1. æ¦è¿°</h2><h3 id="_1-1-ç´¢å¼æä»¶æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_1-1-ç´¢å¼æä»¶æ¯ä»ä¹" aria-hidden="true">#</a> 1.1 ç´¢å¼æä»¶æ¯ä»ä¹</h3><p>IndexFileï¼åå¯ä»¥ç§°ä½ç´¢å¼æä»¶ï¼æ¯ RocketMQ ä¿åå¨ç£çä¸çä¸ç§æä»¶ï¼å±äº RocketMQ åå¨çä¸é¨åãå®çç»æç±»ä¼¼äºç±»ä¼¼ JDKä¸ HashMapã</p><p>å¯ä»¥éè¿<code>messageIndexEnable</code>屿§é
ç½®æå¼æå
³é IndexFile åå¨åè½ã</p><h3 id="_1-2-ç´¢å¼æä»¶ä½ç¨" tabindex="-1"><a class="header-anchor" href="#_1-2-ç´¢å¼æä»¶ä½ç¨" aria-hidden="true">#</a> 1.2 ç´¢å¼æä»¶ä½ç¨</h3><p>ç´¢å¼æä»¶çåºç¨åºæ¯å
¶å®æ¯è¾å±éï¼æ¯ä¸ºäºæä¾<strong>æç
§ Message Key æ¥è¯¢æ¶æ¯</strong>çè½åãç´¢å¼æä»¶å¯ä»¥éè¿ Message Keyï¼æ¥è¯¢å°æ¶æ¯å¨ CommitLog ä¸çç©çåç§»éï¼è¿èä» CommitLog 䏿¥è¯¢æ¶æ¯ã</p><h2 id="_2-æ¦è¦è®¾è®¡" tabindex="-1"><a class="header-anchor" href="#_2-æ¦è¦è®¾è®¡" aria-hidden="true">#</a> 2. æ¦è¦è®¾è®¡</h2><h3 id="_2-1-ç´¢å¼æä»¶ç»æ" tabindex="-1"><a class="header-anchor" href="#_2-1-ç´¢å¼æä»¶ç»æ" aria-hidden="true">#</a> 2.1 ç´¢å¼æä»¶ç»æ</h3><p>ä¸é¢è¯´å®çé»è¾ç»æç±»ä¼¼ HashMapï¼HashMap 以 Key-Value å½¢å¼å卿°æ®ï¼é£ä¹ç´¢å¼æä»¶çå卿 ¼å¼ä¹æ¯ Key-Value</p><ul><li>Keyï¼Message Keyãç´¢å¼æä»¶ç Key å
¶å®æ¯ Message Key ç»è¿ hash å¾å°çä¸ä¸ª Integerï¼</li><li>Valueï¼physical offsetãç´¢å¼æä»¶ç Value ä¸»è¦æ¯æ¶æ¯å¨ CommitLog ä¸çç»å¯¹ç©çåç§»éã</li></ul><p>hashå²çªæ¶ï¼Value以é¾è¡¨çæ¹å¼åå¨ï¼è¶æ°çæ¶æ¯å¨é¾è¡¨è¶åé¢ã</p><p>å®å¯ä»¥å
å«å¤ä¸ªæä»¶ï¼æ¯ä¸ªæä»¶ç大尿¯åºå®çãè¿å°±æå³çæ¯ä¸ª IndexFile å
å«çæå¤§ç´¢å¼æ°éæ¯ç¸åçã</p><h3 id="_2-2-å¦ä½æå»º" tabindex="-1"><a class="header-anchor" href="#_2-2-å¦ä½æå»º" aria-hidden="true">#</a> 2.2 å¦ä½æå»º</h3><p>æ¶æ¯ä¿åå° CommitLog ä¹åï¼ä¼è¿è¡éæéãéæéæ¶æ¯çè¿ç¨å°±æ¯ä¸ºäºå»ºç«æ¶æ¯çç´¢å¼æä»¶ï¼å
æ¬ ConsumeQueue å IndexFileï¼ã</p><p>éæé线ç¨ä¼æ«ææ¯å¦ææ°æ¶æ¯è¢«ä¿åå° CommitLogï¼å¦ææåå°è¿æ¡æ¶æ¯æ¥åºæ¥ï¼æ§è¡éæéé»è¾ï¼æå»ºè¯¥æ¶æ¯çç´¢å¼ã</p><h3 id="_2-3-å¦ä½æ¥è¯¢æ¶æ¯" tabindex="-1"><a class="header-anchor" href="#_2-3-å¦ä½æ¥è¯¢æ¶æ¯" aria-hidden="true">#</a> 2.3 å¦ä½æ¥è¯¢æ¶æ¯</h3><p>ç´¢å¼æä»¶ä¸åå¨ç Message Key å¯¹åºæ¶æ¯å¨ CommitLog ä¸çåç§»éï¼é¦å
æ¥è¯¢åºè¿äºåç§»éä¿¡æ¯ï¼ç¶åç¨åç§»éä» CommitLog 䏿¥è¯¢åºæ¶æ¯ã</p><h3 id="_2-4-å·çæºå¶" tabindex="-1"><a class="header-anchor" href="#_2-4-å·çæºå¶" aria-hidden="true">#</a> 2.4 å·çæºå¶</h3><p>ç´¢å¼æä»¶çå·çæºå¶å¹¶ä¸æ¯éå宿¶å·çæºå¶ï¼èæ¯æ¯å满ä¸ä¸ªç´¢å¼æä»¶æ¶å°±æ°å»ºä¸ä¸ªæä»¶ï¼å¹¶ä¸å°ä¸ä¸ä¸ªå满çç´¢å¼æä»¶å·çã</p><h2 id="_3-详ç»è®¾è®¡" tabindex="-1"><a class="header-anchor" href="#_3-详ç»è®¾è®¡" aria-hidden="true">#</a> 3. 详ç»è®¾è®¡</h2><h3 id="_3-1-ç´¢å¼æä»¶ç»æ" tabindex="-1"><a class="header-anchor" href="#_3-1-ç´¢å¼æä»¶ç»æ" aria-hidden="true">#</a> 3.1 ç´¢å¼æä»¶ç»æ</h3><p>设计 IndexFile æéè¦çæ¯è®¾è®¡å®çé»è¾ç»æåæä»¶åå¨ç»æãé¦å
çä¸ä¸ IndexFile 详ç»çé»è¾ç»æ</p><h4 id="_3-1-1-é»è¾ç»æ" tabindex="-1"><a class="header-anchor" href="#_3-1-1-é»è¾ç»æ" aria-hidden="true">#</a> 3.1.1 é»è¾ç»æ</h4><p>ä¸é¢å·²ç»æå° IndexFile æ¯ç±»ä¼¼ JDK ç HashMap çç»æã</p>',24),b=n("p",null,[s("Keyï¼ç± "),n("code",null,"IndexService#buildKey(String topic, String key)"),s("æå»ºèæï¼å
·ä½ä¸º "),n("code",null,'topic + "#" + messageKey'),s(" ç»è¿hashï¼"),n("code",null,"IndexFile#
1indexKeyHashMethod(String Key)"),s("ï¼å¾å°ã")],-1),f={href:"https://github.com/apache/rocketmq/issues/3613",target:"_blank",rel:"noopener noreferrer"},h=n("figure",null,[n("img",{src:"https://scarb-images.oss-cn-hangzhou.aliyuncs.com/img/202203152214095.png",alt:"Untitled",tabindex:"0",loading:"lazy"}),n("figcaption",null,"Untitled")],-1),y=n("li",null,[n("p",null,"Valueï¼Hash å²çªæ¶åæé¾è¡¨ç»æï¼å
å«ï¼"),n("ul",null,[n("li",null,"æ¶æ¯å¨ CommitLog ä¸çç©çåç§»éï¼ç¨äºå° CommitLog 䏿¥è¯¢æ¶æ¯"),n("li",null,[n("code",null,"IndexFile#indexKeyHashMethod(String Key)"),s("å¾å°çæ´æ° Hash å¼")]),n("li",null,"æ¶æ¯ä¿åæ¶é´ä¸ç´¢å¼æä»¶ææ©æ¶æ¯ä¿åæ¶é´çå·®å¼ï¼ç¨äºæç´¢æ¶é´èå´å
çæ¶æ¯"),n("li",null,"æåä¸ä¸æ¡æ¶æ¯ä½ç½®çæéï¼å¨æ¶é´ä¸æ¯å䏿¡ï¼è¶æå°è¾¾çæ¶æ¯å¨é¾è¡¨è¶åé¢ï¼")])],-1),g=c(`<h4 id="_3-1-2-åå¨ç»æ" tabindex="-1"><a class="header-anchor" href="#_3-1-2-åå¨ç»æ" aria-hidden="true">#</a> 3.1.2 åå¨ç»æ</h4><p>ç´¢å¼æä»¶åºå±ä½¿ç¨ RocketMQ ç MappedFile æ¥åå¨ï¼ç´¢å¼æä»¶å¯ä»¥æå¤ä¸ªï¼å¯ä»¥æ éæ©å±ã</p><p>æ¯ä¸ªç´¢å¼æä»¶ä»¥å
¶åå»ºçæ¶é´å½åï¼ä¸¾ä¾ï¼<code>20211209174133951</code></p><p>æ¯ä¸ªç´¢å¼æä»¶è¢«è®¾è®¡ä¸ºå®é¿çï¼æå¤å¯ä»¥ä¿å 500ä¸ä¸ª Hash æ§½å 2000ä¸ä¸ªç´¢å¼é¡¹ãå½ä¿åçæ°æ®è¶
è¿ä¸éæ¶ï¼ä¼å建ä¸ä¸ªæ°çç´¢å¼æä»¶æ¥ä¿åãè¿å°±æå³çåæ · Hash å¼çæ¶æ¯å¯è½ä¼è¢«ä¿åå°ä¸åçç´¢å¼æä»¶å½ä¸ã</p><p>RocketMQçå卿件é½éµå¾ªä¸ç§éç¨çæ°æ®å卿 ¼å¼å®ä¹å®è·µï¼<strong>Header + Body</strong>ï¼é常 <strong>Header é¨åæ¯å®é¿</strong>çï¼åæ¾ä¸äºåºæ¬ä¿¡æ¯ï¼Body åæ¾æ°æ®ã</p><p>å
·ä½åå¨ç»æåå
容å¦å¾æç¤ºï¼</p><figure><img src="https://scarb-images.oss-cn-hangzhou.aliyuncs.com/img/202203152214096.png" alt="Untitled" tabindex="0" loading="lazy"><figcaption>Untitled</figcaption></figure><ul><li><strong>Header</strong> åºå®å¤§å°ï¼å
å«ä¸äºåºæ¬ä¿¡æ¯ <ul><li>beginTimestampï¼ææ©çæ¶æ¯å卿¶é´ï¼æ¶æ¯åå¨å° CommitLog çæ¶é´ï¼</li><li>endTimestampï¼ææçæ¶æ¯å卿¶é´</li><li>beginPhyoffsetï¼åå¨çæ¶æ¯çæå°ç©çåç§»éï¼å¨ CommitLog ä¸çåç§»éï¼</li><li>endPhyoffsetï¼åå¨çæ¶æ¯çæå¤§ç©çåç§»é</li><li>hashSlotCountï¼æå¤§å¯åå¨ç hash 槽个æ°</li><li>indexCountï¼å½åå·²ç»ä½¿ç¨çç´¢å¼æ¡ç®ä¸ªæ°ã注æè¿ä¸ªå¼æ¯ä» 1 å¼å§ç</li></ul></li><li><strong>Hash Slot</strong> é¨ååå¨åºå®æ°éç Message Key hashæ§½ï¼500ä¸ä¸ªï¼è¯¥æ°å¼å¯ä»¥éè¿ Broker é
置项 <code>maxHashSlotNum</code> æ¥é
ç½®ï¼ <ul><li>åå¨çæ¯ä¸ªå¼æ¯å¨ç´¢å¼æä»¶ä¸ ç´¢å¼çé»è¾ä¸æ ãå ä¸ºç´¢å¼æä»¶ç Header å Hash Slot é¨åé¿åº¦é½æ¯åºå®çï¼æ¯ä¸ªç´¢å¼çé¿åº¦ä¹æ¯åºå®çï¼æä»¥å¯ä»¥éè¿é»è¾ä¸æ 计ç®åºç´¢å¼é¡¹å¨ç´¢å¼æä»¶ä¸çç»å¯¹åç§»é</li></ul></li><li><strong>Index Item</strong> é¨ååå¨åºå®æ°éçç´¢å¼é¡¹ï¼2000ä¸ä¸ªï¼è¯¥æ°å¼å¯ä»¥éè¿ Broker é
置项 <code>maxIndexNum</code> æ¥é
ç½®ï¼ãæ¯ä¸ªç´¢å¼é¡¹å
å«å¦ä¸ä¿¡æ¯ <ul><li>Key Hashï¼æ¶æ¯ç Topic å Message Key ç»è¿åå¸å¾å°çæ´æ°</li><li>Commit Log Offsetï¼æ¶æ¯å¨ CommitLog ä¸çç©çåç§»éï¼ç¨äºå° CommitLog 䏿¥è¯¢æ¶æ¯</li><li>Time Diffï¼ä»è¯¥ç´¢å¼æä»¶å°æ¶æ¯ä¿åæ¶é´çæ¶é´å·®ï¼ç²¾ç¡®å°ç§ï¼ï¼ç¨äºæ ¹æ®æ¶é´èå´æ¥è¯¢æ¶æ¯</li><li>Next Index Offsetï¼é¾è¡¨ä¸ä¸é¡¹çé»è¾ä¸æ ï¼è¿éçé»è¾ä¸æ çå«ä¹è· Hash Slot ä¸åå¨çé»è¾ä¸æ å«ä¹ç¸åï¼ <ul><li>æ¯æ¬¡æå
¥æ°çæ¶æ¯ï¼é½ä¼ä»é¾è¡¨ç头鍿å
¥ãé¾è¡¨è¶å¾åï¼æ¶æ¯è¶èãå 为ä¸è¬æ¥è¯´æ¶æ¯éå伿´å
³å¿æ°çæ¶æ¯ã</li></ul></li></ul></li></ul><h3 id="_3-2-ç´¢å¼æä»¶æ¶åå°çç±»" tabindex="-1"><a class="header-anchor" href="#_3-2-ç´¢å¼æä»¶æ¶åå°çç±»" aria-hidden="true">#</a> 3.2 ç´¢å¼æä»¶æ¶åå°çç±»</h3><h4 id="indexservice" tabindex="-1"><a class="header-anchor" href="#indexservice" aria-hidden="true">
1#</a> IndexService</h4><p>ç´¢å¼æå¡ï¼ç¨äºç®¡çåæ§å¶ææç´¢å¼æä»¶ãå æ¬ç´¢å¼æä»¶çå è½½ãå建ãå·çãå é¤çãæ¯ç´¢å¼æä»¶æä½çå ¥å£ã</p><ul><li><p><code>private final ArrayList<IndexFile> indexFileList</code>ï¼ç´¢å¼æä»¶å表ã</p></li><li><p><code>buildIndex(DispatchRequest req)</code>ï¼æ ¹æ®æ¶æ¯ååè¯·æ±æå»ºç´¢å¼ã注æè¿éä¼å建 msgId çç´¢å¼åæ¶æ¯ Key çç´¢å¼</p><ol><li>å建æè·åææ°çç´¢å¼æä»¶</li><li>è°ç¨è¯¥ç´¢å¼æä»¶ç <code>IndexFile#putKey</code> æ¹æ³å建索å¼</li></ol></li><li><p><code>queryOffset(String topic, String key, int maxNum, long begin, long end)</code>ï¼æ ¹æ®topicåmessage keyï¼ä»IndexFile䏿¥æ¾æ¶æ¯ãææ¶é´æ¥è¯¢ï¼æ¥è¯¢ä¿åæ¶é´å¨ begin å° end å çæ¶æ¯</p><ol><li>ä»åå¾åéå <code>indexFileList</code> å表ä¸çç´¢å¼æä»¶ï¼æ¥æ¾ç´¢å¼å¯¹åºç message ç¬¦åæ¶é´ç IndexFileï¼[beginTimestamp, endTimestamp] ä¸ [begin, end] æäº¤éçç´¢å¼æä»¶ï¼</li><li>è°ç¨ç¬¦åæ¡ä»¶çç´¢å¼æä»¶ <code>IndexFile#selectPhyOffset()</code> æ¹æ³æ¥æ¾ææ offset</li></ol></li><li><p><code>retryGetAndCreateIndexFile()</code>ï¼è·åææ°çç´¢å¼æä»¶ï¼å¦æä¸åå¨ï¼åå建ä¸ä¸ªæ°çç´¢å¼æä»¶ã</p><ul><li>è°ç¨ <code>getAndCreateLastIndexFile()</code> æ¹æ³å建æè è·åææ°çç´¢å¼æä»¶</li><li>å建æ°ç´¢å¼æä»¶æ¶å¦æå建失败ï¼ä¼éè¯å建3次</li></ul></li><li><p><code>getAndCreateLastIndexFile()</code>ï¼è·åæåä¸ä¸ªç´¢å¼æä»¶ãå¦ææ²¡æç´¢å¼æä»¶æè æåä¸ä¸ªç´¢å¼æä»¶æ»¡äºï¼é£ä¹å建ä¸ä¸ªæ°çæä»¶</p><ol><li>æ£æ¥ç´¢å¼æä»¶å表æåä¸ä¸ªæä»¶æ¯å¦åå¨ä»¥åæ¯å¦æ»¡</li><li>妿ä¸å卿è å·²ç»æ»¡äºï¼å建æ°çæä»¶ï¼å¹¶ä¸æä¸ä¸ä¸ªç´¢å¼æä»¶<strong>弿¥å·ç</strong></li><li>妿æåä¸ä¸ªæä»¶åå¨å¹¶ä¸æªæ»¡ï¼ç´æ¥è¿å该æä»¶</li></ol></li><li><p><code>flush()</code>ï¼å°ä¸ä¸ªç´¢å¼æä»¶å¼ºå¶å·çï¼å¹¶ä¸å·æ° checkpoint æä»¶ä¸ç indexMsgTimestampï¼checkpointæä»¶å·çã</p><ul><li>妿å¼å¯ <code>MessageStoreConfig#messageIndexSafe</code> é 置项ï¼é£ä¹ä¸æ¬¡ Broker å¼å¸¸æ¢å¤æ¶ï¼ä¼ä» checkpoint ä¿åç indexMsgTimestamp å³ç´¢å¼æä»¶è®°å½ç强å¶å·çæ¶é´æ¥æ¢å¤ã</li><li>å½ä¸ä¸ªç´¢å¼æä»¶å满åå建æ°ç´¢å¼æä»¶æ¶è°ç¨ï¼å¼ºå¶å°å满çæä»¶å·ç</li></ul><figure><img src="https://scarb-images.oss-cn-hangzhou.aliyuncs.com/img/202203152214097.png" alt="Untitled" tabindex="0" loading="lazy"><figcaption>Untitled</figcaption></figure></li></ul><h4 id="indexfile" tabindex="-1"><a class="header-anchor" href="#indexfile" aria-hidden="true">#</a> IndexFile</h4><p>ç´¢å¼æä»¶ï¼å å«ç´¢å¼æä»¶çåå¨ç»æåä¸ç³»åæä½ã</p><p>åºå±ä½¿ç¨å åæ å°æä»¶ MappedFile åå¨ã</p><ul><li><code>MappedFile mappedFile</code>ï¼åºå±åå¨å®ç°</li><li><code>putKey(final String key, final long phyOffset, final long storeTimestamp)</code>ï¼æ·»å ä¸ä¸ªç´¢å¼å°ç´¢å¼æä»¶</li><li><code>selectPhyOffset(final List<Long> phyOffsets, final String key, final int maxNum, final long begin, final long end, boolean lock)</code>ï¼ä»è¯¥ç´¢å¼æä»¶ä¸æ ¹æ® Key æ¥æ¾ç´¢å¼å¯¹åºç offset</li></ul><h2 id="_4-æºç è§£æ" tabindex="-1"><a class="header-anchor" href="#_4-æºç è§£æ" aria-hidden="true">#</a> 4. æºç è§£æ</h2><h3 id="_4-1-indexservice" tabindex="-1"><a class="header-anchor" href="#_4-1-indexservice" aria-hidden="true">#</a> 4.1 IndexService</h3><h4 id="_4-1-1-å建" tabindex="-1"><a class="header-anchor" href="#_4-1-1-å建" aria-hidden="true">#</a> 4.1.1 å建</h4><ul><li><strong>loadï¼éæ°å è½½ç´¢å¼æä»¶</strong></li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 2 * éæ°å è½½ç´¢å¼æä»¶ 3 * 4 * <span class="token keyword">@param</span> <span class="token parameter">lastExitOK</span> 䏿¬¡æ¯å¦æ¯æ£å¸¸éåº 5 * <span class="token keyword">@return</span> å è½½æ¯å¦æå 6 */</span> 7<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">load</span><span class="token punctuation">(</span><span class="token keyword">final</span> <span class="token keyword">boolean</span> lastExitOK<span class="token punctuation">)</span> <span class="token punctuation">{</span> 8 <span class="token class-name">File</span> dir <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>storePath<span class="token punctuation">)</span><span class="token punctuation">;</span> 9 <span class="token class-name">File</span><span class="token punctuation">[</span><span class="token punctuation">]</span> files <span class="token operator">=</span> dir<span class="token punctuation">.</span><span class="token function">listFiles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 10 <span class="token keyword">if</span> <span class="token punctuation">(</span>files <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
11 <span class="token comment">// ascending order, å°ç´¢å¼æä»¶æç §å建æ¶é´ååºæåº</span> 12 <span class="token class-name">Arrays</span><span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span>files<span class="token punctuation">)</span><span class="token punctuation">;</span> 13 <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token class-name">File</span> file <span class="token operator">:</span> files<span class="token punctuation">)</span> <span class="token punctuation">{</span> 14 <span class="token comment">// 便¬¡å è½½æ¯ä¸ªç´¢å¼æä»¶</span> 15 <span class="token keyword">try</span> <span class="token punctuation">{</span> 16 <span class="token class-name">IndexFile</span> f <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">IndexFile</span><span class="token punctuation">(</span>file<span class="token punctuation">.</span><span class="token function">getPath</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hashSlotNum<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexNum<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 17 f<span class="token punctuation">.</span><span class="token function">load</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 18 <span class="token comment">// 妿ä¸ä¸æ¬¡æ¯å¼å¸¸éåºï¼åå é¤check pointä¹åçææç´¢å¼æä»¶</span> 19 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>lastExitOK<span class="token punctuation">)</span> <span class="token punctuation">{</span> 20 <span class="token keyword">if</span> <span class="token punctuation">(</span>f<span class="token punctuation">.</span><span class="token function">getEndTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token keyword">this</span><span class="token punctuation">.</span>defaultMessageStore<span class="token punctuation">.</span><span class="token function">getStoreCheckpoint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getIndexMsgTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 21 f<span class="token punctuation">.</span><span class="token function">destroy</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 22 <span class="token keyword">continue</span><span class="token punctuation">;</span> 23 <span class="token punctuation">}</span> 24 <span class="token punctuation">}</span> 25 26 <span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>f<span class="token punctuation">)</span><span class="token punctuation">;</span> 27 <span class="token punctuation">}</span> <span class="token keyword">catch</span> 28 <span class="token comment">// ...</span> 29 <span class="token punctuation">}</span> 30 <span class="token punctuation">}</span> 31 <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> 32<span class="token punctuation">}</span> 33</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><hr><ul><li>getAndCreateLastIndexFile()ï¼è·åæåä¸ä¸ªç´¢å¼æä»¶ï¼å¦æéå为空æè æåä¸ä¸ªæä»¶å满äºï¼åæ°å»ºä¸ä¸ªæä»¶ <ol><li>å 夿æä»¶æ¯å¦åå¨ãæ¯å¦å满</li><li>妿ä¸åå¨æè æåä¸ä¸ªæä»¶å满ï¼åå建ä¸ä¸ªæä»¶</li><li>妿åå¨ï¼ç´æ¥è¿å该æä»¶</li><li>妿åå»ºäºæ°æä»¶ï¼å¯å¨ä¸ä¸ªçº¿ç¨å°åä¸ä¸ªå满çæä»¶å¼æ¥å·çã <ul><li>å·ç线ç¨ä¼å°è¯¥æä»¶å·ç</li><li>ç¶åæ´æ° <code>StoreCheckpoint#indexMsgTimestamp</code> ä¸ºè¯¥åæ»¡çç´¢å¼æä»¶ä¸ indexHeader ç endTimestamp</li></ul></li></ol></li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 34 * è·åæåä¸ä¸ªç´¢å¼æä»¶ï¼å¦æéå为空æè æåä¸ä¸ªæä»¶å满äºï¼åæ°å»ºä¸ä¸ªæä»¶<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>br</span><span class="token punctuation">></span></span> 35 * åªæä¸ä¸ªçº¿ç¨è°ç¨ï¼æä»¥ä¸åå¨åç«äºé®é¢ 36 */</span> 37<span class="token keyword">public</span> <span class="token class-name">IndexFile</span> <span class="token function">getAndCreateLastIndexFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 38 <span class="token class-name">IndexFile</span> indexFile <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> 39 <span class="token class-name">IndexFile</span> prevIndexFile <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> 40 <span class="token keyword">long</span> lastUpdateEndPhyOffset <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 41 <span class="token keyword">long</span> lastUpdateIndexTimestamp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 42 <span class="token comment">// å å°è¯ä½¿ç¨è¯»é</span> 43 <span class="token punctuation">{</span>
44 <span class="token keyword">this</span><span class="token punctuation">.</span>readWriteLock<span class="token punctuation">.</span><span class="token function">readLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 45 <span class="token comment">// 夿æä»¶å表æ¯å¦ä¸ºç©º</span> 46 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">isEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 47 <span class="token class-name">IndexFile</span> tmp <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 48 <span class="token comment">// 夿æåä¸ä¸ªæä»¶æ¯å¦å满</span> 49 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>tmp<span class="token punctuation">.</span><span class="token function">isWriteFull</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 50 indexFile <span class="token operator">=</span> tmp<span class="token punctuation">;</span> 51 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> 52 lastUpdateEndPhyOffset <span class="token operator">=</span> tmp<span class="token punctuation">.</span><span class="token function">getEndPhyOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 53 lastUpdateIndexTimestamp <span class="token operator">=</span> tmp<span class="token punctuation">.</span><span class="token function">getEndTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 54 prevIndexFile <span class="token operator">=</span> tmp<span class="token punctuation">;</span> 55 <span class="token punctuation">}</span> 56 <span class="token punctuation">}</span> 57 58 <span class="token keyword">this</span><span class="token punctuation">.</span>readWriteLock<span class="token punctuation">.</span><span class="token function">readLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 59 <span class="token punctuation">}</span> 60 61 <span class="token comment">// 妿æä»¶å表为空æè æåä¸ä¸ªæä»¶å满äºï¼ä½¿ç¨åéå建æä»¶</span> 62 <span class="token keyword">if</span> <span class="token punctuation">(</span>indexFile <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
63 <span class="token keyword">try</span> <span class="token punctuation">{</span> 64 <span class="token class-name">String</span> fileName <span class="token operator">=</span> 65 <span class="token keyword">this</span><span class="token punctuation">.</span>storePath <span class="token operator">+</span> <span class="token class-name">File</span><span class="token punctuation">.</span>separator 66 <span class="token operator">+</span> <span class="token class-name">UtilAll</span><span class="token punctuation">.</span><span class="token function">timeMillisToHumanString</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 67 indexFile <span class="token operator">=</span> 68 <span class="token keyword">new</span> <span class="token class-name">IndexFile</span><span class="token punctuation">(</span>fileName<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hashSlotNum<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexNum<span class="token punctuation">,</span> lastUpdateEndPhyOffset<span class="token punctuation">,</span> 69 lastUpdateIndexTimestamp<span class="token punctuation">)</span><span class="token punctuation">;</span> 70 <span class="token keyword">this</span><span class="token punctuation">.</span>readWriteLock<span class="token punctuation">.</span><span class="token function">writeLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 71 <span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>indexFile<span class="token punctuation">)</span><span class="token punctuation">;</span> 72 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> 73 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"getLastIndexFile exception "</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span> 74 <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> 75 <span class="token keyword">this</span><span class="token punctuation">.</span>readWriteLock<span class="token punctuation">.</span><span class="token function">writeLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 76 <span class="token punctuation">}</span> 77 78 <span class="token comment">// æ¯å建ä¸ä¸ªæ°æä»¶ï¼åä¸ä¸ªæä»¶å¼æ¥å·ç</span> 79 <span class="token keyword">if</span> <span class="token punctuation">(</span>indexFile <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 80 <span class="token keyword">final</span> <span class="token class-name">IndexFile</span> flushThisFile <span class="token operator">=</span> prevIndexFile<span class="token punctuation">;</span>
81 <span class="token class-name">Thread</span> flushThread <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Runnable</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 82 <span class="token annotation punctuation">@Override</span> 83 <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 84 <span class="token class-name">IndexService</span><span class="token punctuation">.</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span>flushThisFile<span class="token punctuation">)</span><span class="token punctuation">;</span> 85 <span class="token punctuation">}</span> 86 <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"FlushIndexFileThread"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 87 88 flushThread<span class="token punctuation">.</span><span class="token function">setDaemon</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 89 flushThread<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 90 <span class="token punctuation">}</span> 91 <span class="token punctuation">}</span> 92 93 <span class="token keyword">return</span> indexFile<span class="token punctuation">;</span> 94<span class="token punctuation">}</span> 95</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
95<h4 id="_4-1-2-æå ¥åæ¥è¯¢" tabindex="-1"><a class="header-anchor" href="#_4-1-2-æå ¥åæ¥è¯¢" aria-hidden="true">#</a> 4.1.2 æå ¥åæ¥è¯¢</h4><ul><li><code>buildIndex(DispatchRequest req)</code>ï¼æ ¹æ®æ¶æ¯ååè¯·æ±æå»ºç´¢å¼ã注æè¿éä¼å建 msgId çç´¢å¼åæ¶æ¯ Key çç´¢å¼ <ol><li>å建æè·åææ°çç´¢å¼æä»¶</li><li>è°ç¨è¯¥ç´¢å¼æä»¶ç <code>IndexFile#putKey</code> æ¹æ³åå»ºç´¢å¼ <ol><li>è·å uniqKeyï¼ä¹å°±æ¯ msgIdï¼ï¼å建索å¼</li><li>è·åæ¶æ¯çææ keyï¼åå«å建索å¼</li></ol></li></ol></li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 96 * æ ¹æ® DispatchRequest æå»ºç´¢å¼ 97 * 98 * <span class="token keyword">@param</span> <span class="token parameter">req</span> æ¶æ¯åå ¥CommitLogä¹åéæ°ååå°Indexæä»¶ç DispatchRequest 99 */</span> 100<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">buildIndex</span><span class="token punctuation">(</span><span class="token class-name">DispatchRequest</span> req<span class="token punctuation">)</span> <span class="token punctuation">{</span> 101 <span class="token class-name">IndexFile</span> indexFile <span class="token operator">=</span> <span class="token function">retryGetAndCreateIndexFile</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 102 <span class="token keyword">if</span> <span class="token punctuation">(</span>indexFile <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 103 <span class="token keyword">long</span> endPhyOffset <span class="token operator">=</span> indexFile<span class="token punctuation">.</span><span class="token function">getEndPhyOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 104 <span class="token class-name">DispatchRequest</span> msg <span class="token operator">=</span> req<span class="token punctuation">;</span> 105 <span class="token class-name">String</span> topic <span class="token operator">=</span> msg<span class="token punctuation">.</span><span class="token function">getTopic</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 106 <span class="token class-name">String</span> keys <span class="token operator">=</span> msg<span class="token punctuation">.</span><span class="token function">getKeys</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 107 <span class="token keyword">if</span> <span class="token punctuation">(</span>msg<span class="token punctuation">.</span><span class="token function">getCommitLogOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> endPhyOffset<span class="token punctuation">)</span> <span class="token punctuation">{</span> 108 <span class="token keyword">return</span><span class="token punctuation">;</span> 109 <span class="token punctuation">}</span> 110 111 <span class="token comment">// 妿æ¯äºå¡æ¶æ¯çåæ»æ¶æ¯ï¼ä¸éè¦å建索å¼ï¼ç´æ¥è¿å</span> 112 <span class="token keyword">final</span> <span class="token keyword">int</span> tranType <span class="token operator">=</span> <span class="token class-name">MessageSysFlag</span><span class="token punctuation">.</span><span class="token function">getTransactionValue</span><span class="token punctuation">(</span>msg<span class="token punctuation">.</span><span class="token function">getSysFlag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 113 <span class="token keyword">switch</span> <span class="token punctuation">(</span>tranType<span class="token punctuation">)</span> <span class="token punctuation">{</span>
114 <span class="token keyword">case</span> <span class="token class-name">MessageSysFlag</span><span class="token punctuation">.</span><span class="token constant">TRANSACTION_NOT_TYPE</span><span class="token operator">:</span> 115 <span class="token keyword">case</span> <span class="token class-name">MessageSysFlag</span><span class="token punctuation">.</span><span class="token constant">TRANSACTION_PREPARED_TYPE</span><span class="token operator">:</span> 116 <span class="token keyword">case</span> <span class="token class-name">MessageSysFlag</span><span class="token punctuation">.</span><span class="token constant">TRANSACTION_COMMIT_TYPE</span><span class="token operator">:</span> 117 <span class="token keyword">break</span><span class="token punctuation">;</span> 118 <span class="token keyword">case</span> <span class="token class-name">MessageSysFlag</span><span class="token punctuation">.</span><span class="token constant">TRANSACTION_ROLLBACK_TYPE</span><span class="token operator">:</span> 119 <span class="token keyword">return</span><span class="token punctuation">;</span> 120 <span class="token punctuation">}</span> 121 122 <span class="token keyword">if</span> <span class="token punctuation">(</span>req<span class="token punctuation">.</span><span class="token function">getUniqKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 123 <span class="token comment">// å建UniqueKeyçç´¢å¼ï¼ä¹å°±æ¯msgIdçç´¢å¼</span> 124 indexFile <span class="token operator">=</span> <span class="token function">putKey</span><span class="token punctuation">(</span>indexFile<span class="token punctuation">,</span> msg<span class="token punctuation">,</span> <span class="token function">buildKey</span><span class="token punctuation">(</span>topic<span class="token punctuation">,</span> req<span class="token punctuation">.</span><span class="token function">getUniqKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 125 <span class="token keyword">if</span> <span class="token punctuation">(</span>indexFile <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 126 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"putKey error commitlog {} uniqkey {}"</span><span class="token punctuation">,</span> req<span class="token punctuation">.</span><span class="token function">getCommitLogOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> req<span class="token punctuation">.</span><span class="token function">getUniqKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 127 <span class="token keyword">return</span><span class="token punctuation">;</span> 128 <span class="token punctuation">}</span> 129 <span class="token punctuation">}</span> 130 131 <span class="token comment">// åå»ºæ¶æ¯keyçç´¢å¼ï¼è¿ékeyå¯ä»¥æå¤ä¸ª</span> 132 <span class="token keyword">if</span> <span class="token punctuation">(</span>keys <span class="token operator">!=</span> <span class="token keyword">null</span> <span class="token operator">&&</span> keys<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
133 <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> keyset <span class="token operator">=</span> keys<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token class-name">MessageConst</span><span class="token punctuation">.</span><span class="token constant">KEY_SEPARATOR</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 134 <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> keyset<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 135 <span class="token class-name">String</span> key <span class="token operator">=</span> keyset<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> 136 <span class="token keyword">if</span> <span class="token punctuation">(</span>key<span class="token punctuation">.</span><span class="token function">length</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 137 indexFile <span class="token operator">=</span> <span class="token function">putKey</span><span class="token punctuation">(</span>indexFile<span class="token punctuation">,</span> msg<span class="token punctuation">,</span> <span class="token function">buildKey</span><span class="token punctuation">(</span>topic<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 138 <span class="token keyword">if</span> <span class="token punctuation">(</span>indexFile <span class="token operator">==</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 139 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"putKey error commitlog {} uniqkey {}"</span><span class="token punctuation">,</span> req<span class="token punctuation">.</span><span class="token function">getCommitLogOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> req<span class="token punctuation">.</span><span class="token function">getUniqKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 140 <span class="token keyword">return</span><span class="token punctuation">;</span> 141 <span class="token punctuation">}</span> 142 <span class="token punctuation">}</span> 143 <span class="token punctuation">}</span> 144 <span class="token punctuation">}</span> 145 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> 146 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"build index error, stop building index"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 147 <span class="token punctuation">}</span> 148<span class="token punctuation">}</span> 149</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li><code>queryOffset(String topic, String key, int maxNum, long begin, long end)</code>ï¼æ ¹æ®topicåmessage keyï¼ä»IndexFile䏿¥æ¾æ¶æ¯</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 150 * æ ¹æ®topicåmessage keyï¼ä»IndexFile䏿¥æ¾æ¶æ¯ 151 * 152 * <span class="token keyword">@param</span> <span class="token parameter">topic</span> 153 * <span class="token keyword">@param</span> <span class="token parameter">key</span> 154 * <span class="token keyword">@param</span> <span class="token parameter">maxNum</span> æå¤§æ¥æ¾æ¶æ¯æ°é 155 * <span class="token keyword">@param</span> <span class="token parameter">begin</span> æ¥æ¾æ¶æ¯æå°æ¶é´ 156 * <span class="token keyword">@param</span> <span class="token parameter">end</span>
156 æ¥æ¾æ¶æ¯æå¤§æ¶é´ 157 * <span class="token keyword">@return</span> 158 */</span> 159 <span class="token keyword">public</span> <span class="token class-name">QueryOffsetResult</span> <span class="token function">queryOffset</span><span class="token punctuation">(</span><span class="token class-name">String</span> topic<span class="token punctuation">,</span> <span class="token class-name">String</span> key<span class="token punctuation">,</span> <span class="token keyword">int</span> maxNum<span class="token punctuation">,</span> <span class="token keyword">long</span> begin<span class="token punctuation">,</span> <span class="token keyword">long</span> end<span class="token punctuation">)</span> <span class="token punctuation">{</span> 160 <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Long</span><span class="token punctuation">></span></span> phyOffsets <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Long</span><span class="token punctuation">></span></span><span class="token punctuation">(</span>maxNum<span class="token punctuation">)</span><span class="token punctuation">;</span> 161 162 <span class="token keyword">long</span> indexLastUpdateTimestamp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 163 <span class="token keyword">long</span> indexLastUpdatePhyoffset <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 164 maxNum <span class="token operator">=</span> <span class="token class-name">Math</span><span class="token punctuation">.</span><span class="token function">min</span><span class="token punctuation">(</span>maxNum<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>defaultMessageStore<span class="token punctuation">.</span><span class="token function">getMessageStoreConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getMaxMsgsNumBatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 165 <span class="token keyword">try</span> <span class="token punctuation">{</span> 166 <span class="token keyword">this</span><span class="token punctuation">.</span>readWriteLock<span class="token punctuation">.</span><span class="token function">readLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 167 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">isEmpty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 168 <span class="token comment">// ä»åå¾åéåIndexFileï¼æ¥æ¾ç´¢å¼å¯¹åºçmessageç¬¦åæ¶é´çIndexFile</span> 169 <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
170 <span class="token class-name">IndexFile</span> f <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 171 <span class="token keyword">boolean</span> lastFile <span class="token operator">=</span> i <span class="token operator">==</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexFileList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 172 <span class="token keyword">if</span> <span class="token punctuation">(</span>lastFile<span class="token punctuation">)</span> <span class="token punctuation">{</span> 173 indexLastUpdateTimestamp <span class="token operator">=</span> f<span class="token punctuation">.</span><span class="token function">getEndTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 174 indexLastUpdatePhyoffset <span class="token operator">=</span> f<span class="token punctuation">.</span><span class="token function">getEndPhyOffset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 175 <span class="token punctuation">}</span> 176 177 <span class="token keyword">if</span> <span class="token punctuation">(</span>f<span class="token punctuation">.</span><span class="token function">isTimeMatched</span><span class="token punctuation">(</span>begin<span class="token punctuation">,</span> end<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 178 <span class="token comment">// æåä¸ä¸ªæä»¶éè¦å é</span> 179 f<span class="token punctuation">.</span><span class="token function">selectPhyOffset</span><span class="token punctuation">(</span>phyOffsets<span class="token punctuation">,</span> <span class="token function">buildKey</span><span class="token punctuation">(</span>topic<span class="token punctuation">,</span> key<span class="token punctuation">)</span><span class="token punctuation">,</span> maxNum<span class="token punctuation">,</span> begin<span class="token punctuation">,</span> end<span class="token punctuation">,</span> lastFile<span class="token punctuation">)</span><span class="token punctuation">;</span> 180 <span class="token punctuation">}</span> 181 182 <span class="token comment">// åå¾åéåæ¶é´æ´ä¸ç¬¦å</span> 183 <span class="token keyword">if</span> <span class="token punctuation">(</span>f<span class="token punctuation">.</span><span class="token function">getBeginTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> begin<span class="token punctuation">)</span> <span class="token punctuation">{</span> 184 <span class="token keyword">break</span><span class="token punctuation">;</span> 185 <span class="token punctuation">}</span> 186 187 <span class="token keyword">if</span> <span class="token punctuation">(</span>phyOffsets<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">>=</span> maxNum<span class="token punctuation">)</span> <span class="token punctuation">{</span> 188 <span class="token keyword">break</span><span class="token punctuation">;</span>
189 <span class="token punctuation">}</span> 190 <span class="token punctuation">}</span> 191 <span class="token punctuation">}</span> 192 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> 193 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"queryMsg exception"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span> 194 <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> 195 <span class="token keyword">this</span><span class="token punctuation">.</span>readWriteLock<span class="token punctuation">.</span><span class="token function">readLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 196 <span class="token punctuation">}</span> 197 198 <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">QueryOffsetResult</span><span class="token punctuation">(</span>phyOffsets<span class="token punctuation">,</span> indexLastUpdateTimestamp<span class="token punctuation">,</span> indexLastUpdatePhyoffset<span class="token punctuation">)</span><span class="token punctuation">;</span> 199 <span class="token punctuation">}</span> 200</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="_4-1-3-è¿æå é¤" tabindex="-1"><a class="header-anchor" href="#_4-1-3-è¿æå é¤" aria-hidden="true">#</a> 4.1.3 è¿æå é¤</h4><ul><li><code>deleteExpiredFile(long offset)</code>ï¼å 餿¶æ¯CommitLogåç§»éoffsetä¹åçææIndexFileæä»¶</li></ul><h4 id="_4-1-4-å·ç" tabindex="-1"><a class="header-anchor" href="#_4-1-4-å·ç" aria-hidden="true">#</a> 4.1.4 å·ç</h4><ul><li><code>flush()</code>ï¼å¼ºå¶å·çï¼ä¼æå åæ å°æä»¶ä¸çæ°æ®å¼ºå¶åå°ç£çãå¨ä¸ä¸ªç´¢å¼æä»¶å满åè°ç¨</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 201 * ç´¢å¼æä»¶å·çï¼å¨ä¸ä¸ªæä»¶å满åè°ç¨ 202 * 203 * <span class="token keyword">@param</span> <span class="token parameter">f</span> éè¦å·ççç´¢å¼æä»¶ 204 */</span> 205<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">flush</span><span class="token punctuation">(</span><span class="token keyword">final</span> <span class="token class-name">IndexFile</span> f<span class="token punctuation">)</span> <span class="token punctuation">{</span> 206 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">null</span> <span class="token operator">==</span> f<span class="token punctuation">)</span>
207 <span class="token keyword">return</span><span class="token punctuation">;</span> 208 209 <span class="token keyword">long</span> indexMsgTimestamp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 210 211 <span class="token keyword">if</span> <span class="token punctuation">(</span>f<span class="token punctuation">.</span><span class="token function">isWriteFull</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 212 indexMsgTimestamp <span class="token operator">=</span> f<span class="token punctuation">.</span><span class="token function">getEndTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 213 <span class="token punctuation">}</span> 214 215 <span class="token comment">// ç´¢å¼æä»¶å·ç</span> 216 f<span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 217 218 <span class="token comment">// checkpointæä»¶å·ç</span> 219 <span class="token keyword">if</span> <span class="token punctuation">(</span>indexMsgTimestamp <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 220 <span class="token keyword">this</span><span class="token punctuation">.</span>defaultMessageStore<span class="token punctuation">.</span><span class="token function">getStoreCheckpoint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">setIndexMsgTimestamp</span><span class="token punctuation">(</span>indexMsgTimestamp<span class="token punctuation">)</span><span class="token punctuation">;</span> 221 <span class="token keyword">this</span><span class="token punctuation">.</span>defaultMessageStore<span class="token punctuation">.</span><span class="token function">getStoreCheckpoint</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">flush</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 222 <span class="token punctuation">}</span> 223<span class="token punctuation">}</span> 224</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_4-2-indexfile" tabindex="-1"><a class="header-anchor" href="#_4-2-indexfile" aria-hidden="true">#</a> 4.2 IndexFile</h3><ul><li><code>putKey(final String key, final long phyOffset, final long storeTimestamp)</code>ï¼åç´¢å¼æä»¶æå ¥æ°çç´¢å¼é¡¹</li></ul><ol><li>æ ¹æ® key ç Hash å¼è®¡ç®åº hashæ§½ç»å¯¹ä½ç½® <code>absSlotPos</code></li><li>è·åå½å hashæ§½çå¼ï¼ä¸ºè¯¥ hash槽对åºçææ°çç´¢å¼çé»è¾ä¸æ </li><li>å¨ hash槽对åºçé¾è¡¨å¤´é¨æå ¥ç´¢å¼</li><li>hashæ§½æåææ°å建çç´¢å¼çé»è¾ä¸æ </li><li>æ´æ°æä»¶å¤´</li></ol><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 225 * åç´¢å¼æä»¶æå ¥æ°çç´¢å¼é¡¹ 226 * 妿è¿åfalseï¼è¡¨ç¤ºéè¦å建æ°çç´¢å¼æä»¶ 227 */</span> 228<span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">putKey</span><span class="token punctuation">(</span><span class="token keyword">final</span> <span class="token class-name">String</span> key<span class="token punctuation">,</span> <span class="token keyword">final</span> <span class="token keyword">long</span> phyOffset<span class="token punctuation">,</span> <span class="token keyword">final</span> <span class="token keyword">long</span> storeTimestamp<span class="token punctuation">)</span> <span class="token punctuation">{</span> 229 <span class="token comment">// 夿å½åç´¢å¼æ°éæ¯å¦å°äºæå¤§ç´¢å¼æ°éï¼å¦æå°äºåç´æ¥éåºï¼è¯´æéè¦å建æ°çç´¢å¼æä»¶</span> 230 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexNum<span class="token punctuation">)</span> <span class="token punctuation">{</span>
231 <span class="token comment">// 计ç®keyçhashå¼</span> 232 <span class="token keyword">int</span> keyHash <span class="token operator">=</span> <span class="token function">indexKeyHashMethod</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span> 233 <span class="token comment">// è·åhashæ§½ä½ç½®ï¼ä¸æ ï¼ãéè¿ keyHash % hashSlotNum çæ¹å¼å次åå¸ï¼è¿éä¼å 大æ¥è¯¢æ¶æ¯éè¯¯çæ¦çã</span> 234 <span class="token keyword">int</span> slotPos <span class="token operator">=</span> keyHash <span class="token operator">%</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hashSlotNum<span class="token punctuation">;</span> 235 <span class="token comment">// éè¿hashæ§½ä¸è¡¨è®¡ç®åºhashæ§½çç»å¯¹ä½ç½®</span> 236 <span class="token keyword">int</span> absSlotPos <span class="token operator">=</span> <span class="token class-name">IndexHeader</span><span class="token punctuation">.</span><span class="token constant">INDEX_HEADER_SIZE</span> <span class="token operator">+</span> slotPos <span class="token operator">*</span> hashSlotSize<span class="token punctuation">;</span> 237 238 <span class="token class-name">FileLock</span> fileLock <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> 239 240 <span class="token keyword">try</span> <span class="token punctuation">{</span> 241 242 <span class="token comment">// fileLock = this.fileChannel.lock(absSlotPos, hashSlotSize,</span> 243 <span class="token comment">// false);</span> 244 <span class="token comment">// éè¿hashæ§½ç»å¯¹ä½ç½®ï¼è·åhashæ§½çå¼ï¼å¦ææå¼è¯´æè¿ä¸ªhash keyå·²ç»åå¨ï¼å¦æä¸åå¨åéè¦å¡«å ¥</span> 245 <span class="token keyword">int</span> slotValue <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>absSlotPos<span class="token punctuation">)</span><span class="token punctuation">;</span> 246 <span class="token keyword">if</span> <span class="token punctuation">(</span>slotValue <span class="token operator"><=</span> invalidIndex <span class="token operator">||</span> slotValue <span class="token operator">></span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 247 slotValue <span class="token operator">=</span> invalidIndex<span class="token punctuation">;</span> 248 <span class="token punctuation">}</span> 249 250 <span class="token keyword">long</span> timeDiff <span class="token operator">=</span> storeTimestamp <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getBeginTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 251 252 timeDiff <span class="token operator">=</span> timeDiff <span class="token operator">/</span> <span class="token number">1000</span><span class="token punctuation">;</span> 253 254 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getBeginTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 255 timeDiff <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
256 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>timeDiff <span class="token operator">></span> <span class="token class-name">Integer</span><span class="token punctuation">.</span><span class="token constant">MAX_VALUE</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 257 timeDiff <span class="token operator">=</span> <span class="token class-name">Integer</span><span class="token punctuation">.</span><span class="token constant">MAX_VALUE</span><span class="token punctuation">;</span> 258 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>timeDiff <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 259 timeDiff <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> 260 <span class="token punctuation">}</span> 261 262 <span class="token comment">// è®¡ç®æ¾ç½®ç´¢å¼çç»å¯¹åç§»é</span> 263 <span class="token keyword">int</span> absIndexPos <span class="token operator">=</span> 264 <span class="token class-name">IndexHeader</span><span class="token punctuation">.</span><span class="token constant">INDEX_HEADER_SIZE</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hashSlotNum <span class="token operator">*</span> hashSlotSize 265 <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> indexSize<span class="token punctuation">;</span> 266 267 <span class="token comment">// å¨é¾è¡¨å¤´é¨æå ¥ææ°çç´¢å¼é¡¹</span> 268 <span class="token comment">// å°ç´¢å¼åå ¥æä»¶ï¼æåä¸ä¸ªæ¯æéï¼æåä¸ä¸ä¸ªé¾è¡¨å ç´ </span> 269 <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>absIndexPos<span class="token punctuation">,</span> keyHash<span class="token punctuation">)</span><span class="token punctuation">;</span> 270 <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">putLong</span><span class="token punctuation">(</span>absIndexPos <span class="token operator">+</span> <span class="token number">4</span><span class="token punctuation">,</span> phyOffset<span class="token punctuation">)</span><span class="token punctuation">;</span> 271 <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>absIndexPos <span class="token operator">+</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span> timeDiff<span class="token punctuation">)</span><span class="token punctuation">;</span> 272 <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>absIndexPos <span class="token operator">+</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">8</span> <span class="token operator">+</span> <span class="token number">4</span><span class="token punctuation">,</span> slotValue<span class="token punctuation">)</span><span class="token punctuation">;</span> 273
274 <span class="token comment">// åå ¥hashæ§½ï¼æ¯ä¸ªhashæ§½ç弿¯ææ°åå ¥çç´¢å¼æä»¶çé»è¾ä¸æ </span> 275 <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">putInt</span><span class="token punctuation">(</span>absSlotPos<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 276 277 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 278 <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">setBeginPhyOffset</span><span class="token punctuation">(</span>phyOffset<span class="token punctuation">)</span><span class="token punctuation">;</span> 279 <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">setBeginTimestamp</span><span class="token punctuation">(</span>storeTimestamp<span class="token punctuation">)</span><span class="token punctuation">;</span> 280 <span class="token punctuation">}</span> 281 282 <span class="token keyword">if</span> <span class="token punctuation">(</span>invalidIndex <span class="token operator">==</span> slotValue<span class="token punctuation">)</span> <span class="token punctuation">{</span> 283 <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">incHashSlotCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 284 <span class="token punctuation">}</span> 285 <span class="token comment">// æ´æ°ç´¢å¼æä»¶å¤´ï¼ç´¢å¼é¡¹ä¸ªæ°+1</span> 286 <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">incIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 287 <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">setEndPhyOffset</span><span class="token punctuation">(</span>phyOffset<span class="token punctuation">)</span><span class="token punctuation">;</span> 288 <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">setEndTimestamp</span><span class="token punctuation">(</span>storeTimestamp<span class="token punctuation">)</span><span class="token punctuation">;</span> 289 290 <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> 291 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> 292 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"putKey exception, Key: "</span> <span class="token operator">+</span> key <span class="token operator">+</span> <span class="token string">" KeyHashCode: "</span> <span class="token operator">+</span> key<span class="token punctuation">.</span><span class="token function">hashCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
292 e<span class="token punctuation">)</span><span class="token punctuation">;</span> 293 <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> 294 <span class="token keyword">if</span> <span class="token punctuation">(</span>fileLock <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 295 <span class="token keyword">try</span> <span class="token punctuation">{</span> 296 fileLock<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 297 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> 298 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"Failed to release the lock"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span> 299 <span class="token punctuation">}</span> 300 <span class="token punctuation">}</span> 301 <span class="token punctuation">}</span> 302 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> 303 log<span class="token punctuation">.</span><span class="token function">warn</span><span class="token punctuation">(</span><span class="token string">"Over index file capacity: index count = "</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> 304 <span class="token operator">+</span> <span class="token string">"; index max num = "</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexNum<span class="token punctuation">)</span><span class="token punctuation">;</span> 305 <span class="token punctuation">}</span> 306 307 <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span> 308<span class="token punctuation">}</span> 309</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><hr><ul><li><code>selectPhyOffset(final List<Long>
309 phyOffsets, final String key, final int maxNum, final long begin, final long end, boolean lock)</code>ï¼ä»è¯¥ç´¢å¼æä»¶ä¸æ ¹æ® Key æ¥æ¾ç´¢å¼å¯¹åºç offset <ol><li>æ ¹æ® key ç Hashå¼è®¡ç® hashæ§½çç»å¯¹ä½ç½®</li><li>éè¿ hashæ§½ä¸åå¨çç´¢å¼é»è¾ä¸æ ï¼æ¾å°ç´¢å¼é¾è¡¨ç»å¯¹ä½ç½®</li><li>éåç´¢å¼é¾è¡¨ä¸çæ¯ä¸ªç´¢å¼ï¼è·åç´¢å¼æ°æ®ï¼æ¯è¾æ¶é´ä¿¡æ¯</li><li>å°æ¶é´ä¿¡æ¯ç¬¦åæç´¢æ¡ä»¶çç´¢å¼å å ¥å°ç»æå表ä¸</li></ol></li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token doc-comment comment">/** 310 * ä»è¯¥ç´¢å¼æä»¶ä¸æ ¹æ®keyæ¥æ¾offsets 311 * 312 * <span class="token keyword">@param</span> <span class="token parameter">phyOffsets</span> offsetsç»æå表 313 * <span class="token keyword">@param</span> <span class="token parameter">key</span> æ¥æ¾çkey 314 * <span class="token keyword">@param</span> <span class="token parameter">maxNum</span> æå¤§è¿åç»ææ°é 315 * <span class="token keyword">@param</span> <span class="token parameter">begin</span> æ¥æ¾æ¶æ¯çå¼å§æ¶é´ 316 * <span class="token keyword">@param</span> <span class="token parameter">end</span> æ¥æ¾æ¶æ¯çç»ææ¶é´ 317 * <span class="token keyword">@param</span> <span class="token parameter">lock</span> æ¥æ¾æ¶æ¯å¦å éï¼å·²åºå¼ï¼ 318 */</span> 319<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">selectPhyOffset</span><span class="token punctuation">(</span><span class="token keyword">final</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Long</span><span class="token punctuation">></span></span> phyOffsets<span class="token punctuation">,</span> <span class="token keyword">final</span> <span class="token class-name">String</span> key<span class="token punctuation">,</span> <span class="token keyword">final</span> <span class="token keyword">int</span> maxNum<span class="token punctuation">,</span> 320 <span class="token keyword">final</span> <span class="token keyword">long</span> begin<span class="token punctuation">,</span> <span class="token keyword">final</span> <span class="token keyword">long</span> end<span class="token punctuation">,</span> <span class="token keyword">boolean</span> lock<span class="token punctuation">)</span> <span class="token punctuation">{</span> 321 <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>mappedFile<span class="token punctuation">.</span><span class="token function">hold</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 322 <span class="token comment">// æ ¹æ®keyçhashå¼è®¡ç®hashæ§½çç»å¯¹ä½ç½®</span> 323 <span class="token keyword">int</span> keyHash <span class="token operator">=</span> <span class="token function">indexKeyHashMethod</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span><span class="token punctuation">;</span> 324 <span class="token keyword">int</span> slotPos <span class="token operator">=</span> keyHash <span class="token operator">%</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hashSlotNum<span class="token punctuation">;</span> 325 <span class="token keyword">int</span> absSlotPos <span class="token operator">=</span> <span class="token class-name">IndexHeader</span><span class="token punctuation">.</span><span class="token constant">INDEX_HEADER_SIZE</span> <span class="token operator">+</span> slotPos <span class="token operator">*</span> hashSlotSize<span class="token punctuation">;</span> 326 327 <span class="token class-name">FileLock</span> fileLock <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
328 <span class="token keyword">try</span> <span class="token punctuation">{</span> 329 <span class="token keyword">if</span> <span class="token punctuation">(</span>lock<span class="token punctuation">)</span> <span class="token punctuation">{</span> 330 <span class="token comment">// fileLock = this.fileChannel.lock(absSlotPos,</span> 331 <span class="token comment">// hashSlotSize, true);</span> 332 <span class="token punctuation">}</span> 333 334 <span class="token comment">// è·åhashæ§½çå¼</span> 335 <span class="token keyword">int</span> slotValue <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>absSlotPos<span class="token punctuation">)</span><span class="token punctuation">;</span> 336 <span class="token comment">// if (fileLock != null) {</span> 337 <span class="token comment">// fileLock.release();</span> 338 <span class="token comment">// fileLock = null;</span> 339 <span class="token comment">// }</span> 340 <span class="token comment">// å¦æè¯¥hashæ§½ç弿æåæ¥æ¾ï¼å¦åæ¥æ¾å¤±è´¥</span> 341 <span class="token keyword">if</span> <span class="token punctuation">(</span>slotValue <span class="token operator"><=</span> invalidIndex <span class="token operator">||</span> slotValue <span class="token operator">></span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> 342 <span class="token operator">||</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><=</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 343 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> 344 <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> nextIndexToRead <span class="token operator">=</span> slotValue<span class="token punctuation">;</span> <span class="token punctuation">;</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> 345 <span class="token keyword">if</span> <span class="token punctuation">(</span>phyOffsets<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">>=</span> maxNum<span class="token punctuation">)</span> <span class="token punctuation">{</span> 346 <span class="token keyword">break</span><span class="token punctuation">;</span> 347 <span class="token punctuation">}</span> 348 349 <span class="token keyword">int</span> absIndexPos <span class="token operator">=</span> 350 <span class="token class-name">IndexHeader</span><span class="token punctuation">.</span><span class="token constant">INDEX_HEADER_SIZE</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>hashSlotNum <span class="token operator">*</span> hashSlotSize 351 <span class="token operator">+</span> nextIndexToRead <span class="token operator">*</span> indexSize<span class="token punctuation">;</span> 352 353 <span class="token keyword">int</span> keyHashRead <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>absIndexPos<span class="token punctuation">)</span><span class="token punctuation">;</span>
354 <span class="token keyword">long</span> phyOffsetRead <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">getLong</span><span class="token punctuation">(</span>absIndexPos <span class="token operator">+</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 355 356 <span class="token keyword">long</span> timeDiff <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">long</span><span class="token punctuation">)</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>absIndexPos <span class="token operator">+</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 357 <span class="token keyword">int</span> prevIndexRead <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>mappedByteBuffer<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span>absIndexPos <span class="token operator">+</span> <span class="token number">4</span> <span class="token operator">+</span> <span class="token number">8</span> <span class="token operator">+</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 358 359 <span class="token keyword">if</span> <span class="token punctuation">(</span>timeDiff <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 360 <span class="token keyword">break</span><span class="token punctuation">;</span> 361 <span class="token punctuation">}</span> 362 363 timeDiff <span class="token operator">*=</span> <span class="token number">1000L</span><span class="token punctuation">;</span> 364 365 <span class="token keyword">long</span> timeRead <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getBeginTimestamp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> timeDiff<span class="token punctuation">;</span> 366 <span class="token keyword">boolean</span> timeMatched <span class="token operator">=</span> <span class="token punctuation">(</span>timeRead <span class="token operator">>=</span> begin<span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>timeRead <span class="token operator"><=</span> end<span class="token punctuation">)</span><span class="token punctuation">;</span> 367 368 <span class="token keyword">if</span> <span class="token punctuation">(</span>keyHash <span class="token operator">==</span> keyHashRead <span class="token operator">&&</span> timeMatched<span class="token punctuation">)</span> <span class="token punctuation">{</span> 369 phyOffsets<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>phyOffsetRead<span class="token punctuation">)</span><span class="token punctuation">;</span> 370 <span class="token punctuation">}</span> 371 372 <span class="token keyword">if</span> <span class="token punctuation">(</span>prevIndexRead <span class="token operator"><=</span> invalidIndex
373 <span class="token operator">||</span> prevIndexRead <span class="token operator">></span> <span class="token keyword">this</span><span class="token punctuation">.</span>indexHeader<span class="token punctuation">.</span><span class="token function">getIndexCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> 374 <span class="token operator">||</span> prevIndexRead <span class="token operator">==</span> nextIndexToRead <span class="token operator">||</span> timeRead <span class="token operator"><</span> begin<span class="token punctuation">)</span> <span class="token punctuation">{</span> 375 <span class="token keyword">break</span><span class="token punctuation">;</span> 376 <span class="token punctuation">}</span> 377 378 nextIndexToRead <span class="token operator">=</span> prevIndexRead<span class="token punctuation">;</span> 379 <span class="token punctuation">}</span> 380 <span class="token punctuation">}</span> 381 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> 382 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"selectPhyOffset exception "</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span> 383 <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> 384 <span class="token keyword">if</span> <span class="token punctuation">(</span>fileLock <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> 385 <span class="token keyword">try</span> <span class="token punctuation">{</span> 386 fileLock<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 387 <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> 388 log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"Failed to release the lock"</span><span class="token punctuation">,</span> e<span class="token punctuation">)</span><span class="token punctuation">;</span> 389 <span class="token punctuation">}</span> 390 <span class="token punctuation">}</span> 391 392 <span class="token keyword">this</span><span class="token punctuation">.</span>mappedFile<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> 393 <span class="token punctuation">}</span> 394 <span class="token punctuation">}</span> 395</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="åèèµæ" tabindex="-1"><a class="header-anchor" href="#åèèµæ" aria-hidden="true">
395#</a> åèèµæ</h2>`,42),x={href:"https://github.com/apache/rocketmq/blob/master/docs/cn/design.md",target:"_blank",rel:"noopener noreferrer"},w={href:"https://blog.csdn.net/meilong_whpu/article/details/76921583",target:"_blank",rel:"noopener noreferrer"},I=n("hr",null,null,-1),_=n("p",null,"欢è¿å
³æ³¨å
¬ä¼å·ãæ¶æ¯ä¸é´ä»¶ãï¼middleware-mqï¼ï¼æ´æ°æ¶æ¯ä¸é´ä»¶çæºç è§£æåææ°å¨æï¼",-1),F=n("figure",null,[n("img",{src:"https://scarb-images.oss-cn-hangzhou.aliyuncs.com/img/202205170102971.jpg",alt:"",tabindex:"0",loading:"lazy"}),n("figcaption")],-1);function S(L,T){const e=o("ExternalLinkIcon"),t=o("router-link");return i(),u("div",null,[n("p",null,[s("åæå°åï¼"),n("a",d,[s("http://hscarb.github.io/rocketmq/20220301-rocketmq-indexfile.html"),a(e)])]),r,n("nav",m,[n("ul",null,[n("li",null,[a(t,{to:"#_1-æ¦è¿°"},{default:p(()=>[s("1. æ¦è¿°")]),_:1}),n("ul",null,[n("li",null,[a(t,{to:"#_1-1-ç´¢å¼æä»¶æ¯ä»ä¹"},{default:p(()=>[s("1.1 ç´¢å¼æä»¶æ¯ä»ä¹")]),_:1})]),n("li",null,[a(t,{to:"#_1-2-ç´¢å¼æä»¶ä½ç¨"},{default:p(()=>[s("1.2 ç´¢å¼æä»¶ä½ç¨")]),_:1})])])]),n("li",null,[a(t,{to:"#_2-æ¦è¦è®¾è®¡"},{default:p(()=>[s("2. æ¦è¦è®¾è®¡")]),_:1}),n("ul",null,[n("li",null,[a(t,{to:"#_2-1-ç´¢å¼æä»¶ç»æ"},{default:p(()=>[s("2.1 ç´¢å¼æä»¶ç»æ")]),_:1})]),n("li",null,[a(t,{to:"#_2-2-å¦ä½æå»º"},{default:p(()=>[s("2.2 å¦ä½æå»º")]),_:1})]),n("li",null,[a(t,{to:"#_2-3-å¦ä½æ¥è¯¢æ¶æ¯"},{default:p(()=>[s("2.3 å¦ä½æ¥è¯¢æ¶æ¯")]),_:1})]),n("li",null,[a(t,{to:"#_2-4-å·çæºå¶"},{default:p(()=>[s("2.4 å·çæºå¶")]),_:1})])])]),n("li",null,[a(t,{to:"#_3-详ç»è®¾è®¡"},{default:p(()=>[s("3. 详ç»è®¾è®¡")]),_:1}),n("ul",null,[n("li",null,[a(t,{to:"#_3-1-ç´¢å¼æä»¶ç»æ"},{default:p(()=>[s("3.1 ç´¢å¼æä»¶ç»æ")]),_:1})]),n("li",null,[a(t,{to:"#_3-2-ç´¢å¼æä»¶æ¶åå°çç±»"},{default:p(()=>[s("3.2 ç´¢å¼æä»¶æ¶åå°çç±»")]),_:1})])])]),n("li",null,[a(t,{to:"#_4-æºç è§£æ"},{default:p(()=>[s("4. æºç è§£æ")]),_:1}),n("ul",null,[n("li",null,[a(t,{to:"#_4-1-indexservice"},{default:p(()=>[s("4.1 IndexService")]),_:1})]),n("li",null,[a(t,{to:"#_4-2-indexfile"},{default:p(()=>[s("4.2 IndexFile")]),_:1})])])]),n("li",null,[a(t,{to:"#åèèµæ"},{default:p(()=>[s("åèèµæ")]),_:1})])])]),v,n("ul",null,[n("li",null,[b,n("blockquote",null,[n("p",null,[s("注æï¼è¿éåå¨ Hash å²çªçå¯è½ï¼ä¸¤ä¸ª Topic å Key ä¸åçæ¶æ¯å¯è½å¾å°ç¸åç Hash å¼ï¼ä¼å¯¼è´æ¥è¯¢ç»æé误ã社åºå·²ç»æåºè¿ä¸ªé误 "),n("a",f,[s("ISSUE#3613"),a(e)]),s("ï¼ä½ç®åè¿å¹¶æªè§£å³ã")]),h])]),y]),g,n("ul",null,[n("li",null,[n("a",x,[s("RocketMQ ææ¡£ï¼è®¾è®¡"),a(e)])]),n("li",null,[n("a",w,[s("RocketMQåå¨ç¯ââIndexFileåIndexService"),a(e)])])]),I,_,F])}const M=l(k,[["render",S],["__file","20220301-rocketmq-indexfile.html.vue"]]);export{M as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.