You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mi...@apache.org on 2016/03/21 17:17:17 UTC

[03/23] hbase-site git commit: Published site at f1d453599a944440b8a1075082e2dc7b7676416f.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a4cb7eaa/xref/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html
----------------------------------------------------------------------
diff --git a/xref/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html b/xref/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html
index 51f0b0f..a9f2d7b 100644
--- a/xref/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html
+++ b/xref/org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html
@@ -155,140 +155,141 @@
 <a class="jxr_linenumber" name="145" href="#145">145</a> <em class="jxr_javadoccomment">   * of the passed in WriteEntry.  Thus, the write is visible to MVCC readers.</em>
 <a class="jxr_linenumber" name="146" href="#146">146</a> <em class="jxr_javadoccomment">   */</em>
 <a class="jxr_linenumber" name="147" href="#147">147</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> completeAndWait(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> e) {
-<a class="jxr_linenumber" name="148" href="#148">148</a>     complete(e);
-<a class="jxr_linenumber" name="149" href="#149">149</a>     waitForRead(e);
-<a class="jxr_linenumber" name="150" href="#150">150</a>   }
-<a class="jxr_linenumber" name="151" href="#151">151</a> 
-<a class="jxr_linenumber" name="152" href="#152">152</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="153" href="#153">153</a> <em class="jxr_javadoccomment">   * Mark the {@link WriteEntry} as complete and advance the read point as much as possible.</em>
-<a class="jxr_linenumber" name="154" href="#154">154</a> <em class="jxr_javadoccomment">   * Call this even if the write has FAILED (AFTER backing out the write transaction</em>
-<a class="jxr_linenumber" name="155" href="#155">155</a> <em class="jxr_javadoccomment">   * changes completely) so we can clean up the outstanding transaction.</em>
-<a class="jxr_linenumber" name="156" href="#156">156</a> <em class="jxr_javadoccomment">   *</em>
-<a class="jxr_linenumber" name="157" href="#157">157</a> <em class="jxr_javadoccomment">   * How much is the read point advanced?</em>
-<a class="jxr_linenumber" name="158" href="#158">158</a> <em class="jxr_javadoccomment">   *</em>
-<a class="jxr_linenumber" name="159" href="#159">159</a> <em class="jxr_javadoccomment">   * Let S be the set of all write numbers that are completed. Set the read point to the highest</em>
-<a class="jxr_linenumber" name="160" href="#160">160</a> <em class="jxr_javadoccomment">   * numbered write of S.</em>
-<a class="jxr_linenumber" name="161" href="#161">161</a> <em class="jxr_javadoccomment">   *</em>
-<a class="jxr_linenumber" name="162" href="#162">162</a> <em class="jxr_javadoccomment">   * @param writeEntry</em>
-<a class="jxr_linenumber" name="163" href="#163">163</a> <em class="jxr_javadoccomment">   *</em>
-<a class="jxr_linenumber" name="164" href="#164">164</a> <em class="jxr_javadoccomment">   * @return true if e is visible to MVCC readers (that is, readpoint &gt;= e.writeNumber)</em>
-<a class="jxr_linenumber" name="165" href="#165">165</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="166" href="#166">166</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> complete(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> writeEntry) {
-<a class="jxr_linenumber" name="167" href="#167">167</a>     <strong class="jxr_keyword">synchronized</strong> (writeQueue) {
-<a class="jxr_linenumber" name="168" href="#168">168</a>       writeEntry.markCompleted();
-<a class="jxr_linenumber" name="169" href="#169">169</a>       <strong class="jxr_keyword">long</strong> nextReadValue = NONE;
-<a class="jxr_linenumber" name="170" href="#170">170</a>       <strong class="jxr_keyword">boolean</strong> ranOnce = false;
-<a class="jxr_linenumber" name="171" href="#171">171</a>       <strong class="jxr_keyword">while</strong> (!writeQueue.isEmpty()) {
-<a class="jxr_linenumber" name="172" href="#172">172</a>         ranOnce = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="173" href="#173">173</a>         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> queueFirst = writeQueue.getFirst();
-<a class="jxr_linenumber" name="174" href="#174">174</a> 
-<a class="jxr_linenumber" name="175" href="#175">175</a>         <strong class="jxr_keyword">if</strong> (nextReadValue &gt; 0) {
-<a class="jxr_linenumber" name="176" href="#176">176</a>           <strong class="jxr_keyword">if</strong> (nextReadValue + 1 != queueFirst.getWriteNumber()) {
-<a class="jxr_linenumber" name="177" href="#177">177</a>             <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> RuntimeException(<span class="jxr_string">"Invariant in complete violated, nextReadValue="</span>
-<a class="jxr_linenumber" name="178" href="#178">178</a>                 + nextReadValue + <span class="jxr_string">", writeNumber="</span> + queueFirst.getWriteNumber());
-<a class="jxr_linenumber" name="179" href="#179">179</a>           }
-<a class="jxr_linenumber" name="180" href="#180">180</a>         }
-<a class="jxr_linenumber" name="181" href="#181">181</a> 
-<a class="jxr_linenumber" name="182" href="#182">182</a>         <strong class="jxr_keyword">if</strong> (queueFirst.isCompleted()) {
-<a class="jxr_linenumber" name="183" href="#183">183</a>           nextReadValue = queueFirst.getWriteNumber();
-<a class="jxr_linenumber" name="184" href="#184">184</a>           writeQueue.removeFirst();
-<a class="jxr_linenumber" name="185" href="#185">185</a>         } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="186" href="#186">186</a>           <strong class="jxr_keyword">break</strong>;
-<a class="jxr_linenumber" name="187" href="#187">187</a>         }
-<a class="jxr_linenumber" name="188" href="#188">188</a>       }
-<a class="jxr_linenumber" name="189" href="#189">189</a> 
-<a class="jxr_linenumber" name="190" href="#190">190</a>       <strong class="jxr_keyword">if</strong> (!ranOnce) {
-<a class="jxr_linenumber" name="191" href="#191">191</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> RuntimeException(<span class="jxr_string">"There is no first!"</span>);
-<a class="jxr_linenumber" name="192" href="#192">192</a>       }
-<a class="jxr_linenumber" name="193" href="#193">193</a> 
-<a class="jxr_linenumber" name="194" href="#194">194</a>       <strong class="jxr_keyword">if</strong> (nextReadValue &gt; 0) {
-<a class="jxr_linenumber" name="195" href="#195">195</a>         <strong class="jxr_keyword">synchronized</strong> (readWaiters) {
-<a class="jxr_linenumber" name="196" href="#196">196</a>           readPoint.set(nextReadValue);
-<a class="jxr_linenumber" name="197" href="#197">197</a>           readWaiters.notifyAll();
-<a class="jxr_linenumber" name="198" href="#198">198</a>         }
-<a class="jxr_linenumber" name="199" href="#199">199</a>       }
-<a class="jxr_linenumber" name="200" href="#200">200</a>       <strong class="jxr_keyword">return</strong> readPoint.get() &gt;= writeEntry.getWriteNumber();
-<a class="jxr_linenumber" name="201" href="#201">201</a>     }
-<a class="jxr_linenumber" name="202" href="#202">202</a>   }
-<a class="jxr_linenumber" name="203" href="#203">203</a> 
-<a class="jxr_linenumber" name="204" href="#204">204</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="205" href="#205">205</a> <em class="jxr_javadoccomment">   * Wait for the global readPoint to advance up to the passed in write entry number.</em>
-<a class="jxr_linenumber" name="206" href="#206">206</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="207" href="#207">207</a>   <strong class="jxr_keyword">void</strong> waitForRead(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> e) {
-<a class="jxr_linenumber" name="208" href="#208">208</a>     <strong class="jxr_keyword">boolean</strong> interrupted = false;
-<a class="jxr_linenumber" name="209" href="#209">209</a>     <strong class="jxr_keyword">int</strong> count = 0;
-<a class="jxr_linenumber" name="210" href="#210">210</a>     <strong class="jxr_keyword">synchronized</strong> (readWaiters) {
-<a class="jxr_linenumber" name="211" href="#211">211</a>       <strong class="jxr_keyword">while</strong> (readPoint.get() &lt; e.getWriteNumber()) {
-<a class="jxr_linenumber" name="212" href="#212">212</a>         <strong class="jxr_keyword">if</strong> (count % 100 == 0 &amp;&amp; count &gt; 0) {
-<a class="jxr_linenumber" name="213" href="#213">213</a>           LOG.warn(<span class="jxr_string">"STUCK: "</span> + <strong class="jxr_keyword">this</strong>);
-<a class="jxr_linenumber" name="214" href="#214">214</a>         }
-<a class="jxr_linenumber" name="215" href="#215">215</a>         count++;
-<a class="jxr_linenumber" name="216" href="#216">216</a>         <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="217" href="#217">217</a>           readWaiters.wait(10);
-<a class="jxr_linenumber" name="218" href="#218">218</a>         } <strong class="jxr_keyword">catch</strong> (InterruptedException ie) {
-<a class="jxr_linenumber" name="219" href="#219">219</a>           <em class="jxr_comment">// We were interrupted... finish the loop -- i.e. cleanup --and then</em>
-<a class="jxr_linenumber" name="220" href="#220">220</a>           <em class="jxr_comment">// on our way out, reset the interrupt flag.</em>
-<a class="jxr_linenumber" name="221" href="#221">221</a>           interrupted = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="222" href="#222">222</a>         }
-<a class="jxr_linenumber" name="223" href="#223">223</a>       }
-<a class="jxr_linenumber" name="224" href="#224">224</a>     }
-<a class="jxr_linenumber" name="225" href="#225">225</a>     <strong class="jxr_keyword">if</strong> (interrupted) {
-<a class="jxr_linenumber" name="226" href="#226">226</a>       Thread.currentThread().interrupt();
-<a class="jxr_linenumber" name="227" href="#227">227</a>     }
-<a class="jxr_linenumber" name="228" href="#228">228</a>   }
-<a class="jxr_linenumber" name="229" href="#229">229</a> 
-<a class="jxr_linenumber" name="230" href="#230">230</a>   @VisibleForTesting
-<a class="jxr_linenumber" name="231" href="#231">231</a>   <strong class="jxr_keyword">public</strong> String toString() {
-<a class="jxr_linenumber" name="232" href="#232">232</a>     <strong class="jxr_keyword">return</strong> Objects.toStringHelper(<strong class="jxr_keyword">this</strong>)
-<a class="jxr_linenumber" name="233" href="#233">233</a>         .add(<span class="jxr_string">"readPoint"</span>, readPoint)
-<a class="jxr_linenumber" name="234" href="#234">234</a>         .add(<span class="jxr_string">"writePoint"</span>, writePoint).toString();
-<a class="jxr_linenumber" name="235" href="#235">235</a>   }
-<a class="jxr_linenumber" name="236" href="#236">236</a> 
-<a class="jxr_linenumber" name="237" href="#237">237</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">long</strong> getReadPoint() {
-<a class="jxr_linenumber" name="238" href="#238">238</a>     <strong class="jxr_keyword">return</strong> readPoint.get();
-<a class="jxr_linenumber" name="239" href="#239">239</a>   }
-<a class="jxr_linenumber" name="240" href="#240">240</a> 
-<a class="jxr_linenumber" name="241" href="#241">241</a>   @VisibleForTesting
-<a class="jxr_linenumber" name="242" href="#242">242</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">long</strong> getWritePoint() {
-<a class="jxr_linenumber" name="243" href="#243">243</a>     <strong class="jxr_keyword">return</strong> writePoint.get();
-<a class="jxr_linenumber" name="244" href="#244">244</a>   }
-<a class="jxr_linenumber" name="245" href="#245">245</a> 
-<a class="jxr_linenumber" name="246" href="#246">246</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="247" href="#247">247</a> <em class="jxr_javadoccomment">   * Write number and whether write has completed given out at start of a write transaction.</em>
-<a class="jxr_linenumber" name="248" href="#248">248</a> <em class="jxr_javadoccomment">   * Every created WriteEntry must be completed by calling mvcc#complete or #completeAndWait.</em>
-<a class="jxr_linenumber" name="249" href="#249">249</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="250" href="#250">250</a>   @InterfaceAudience.Private
-<a class="jxr_linenumber" name="251" href="#251">251</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> {
-<a class="jxr_linenumber" name="252" href="#252">252</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> writeNumber;
-<a class="jxr_linenumber" name="253" href="#253">253</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">boolean</strong> completed = false;
-<a class="jxr_linenumber" name="254" href="#254">254</a> 
-<a class="jxr_linenumber" name="255" href="#255">255</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a>(<strong class="jxr_keyword">long</strong> writeNumber) {
-<a class="jxr_linenumber" name="256" href="#256">256</a>       <strong class="jxr_keyword">this</strong>.writeNumber = writeNumber;
-<a class="jxr_linenumber" name="257" href="#257">257</a>     }
-<a class="jxr_linenumber" name="258" href="#258">258</a> 
-<a class="jxr_linenumber" name="259" href="#259">259</a>     <strong class="jxr_keyword">void</strong> markCompleted() {
-<a class="jxr_linenumber" name="260" href="#260">260</a>       <strong class="jxr_keyword">this</strong>.completed = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="261" href="#261">261</a>     }
-<a class="jxr_linenumber" name="262" href="#262">262</a> 
-<a class="jxr_linenumber" name="263" href="#263">263</a>     <strong class="jxr_keyword">boolean</strong> isCompleted() {
-<a class="jxr_linenumber" name="264" href="#264">264</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.completed;
-<a class="jxr_linenumber" name="265" href="#265">265</a>     }
-<a class="jxr_linenumber" name="266" href="#266">266</a> 
-<a class="jxr_linenumber" name="267" href="#267">267</a>     <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">long</strong> getWriteNumber() {
-<a class="jxr_linenumber" name="268" href="#268">268</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.writeNumber;
-<a class="jxr_linenumber" name="269" href="#269">269</a>     }
-<a class="jxr_linenumber" name="270" href="#270">270</a> 
-<a class="jxr_linenumber" name="271" href="#271">271</a>     @Override
-<a class="jxr_linenumber" name="272" href="#272">272</a>     <strong class="jxr_keyword">public</strong> String toString() {
-<a class="jxr_linenumber" name="273" href="#273">273</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.writeNumber + <span class="jxr_string">", "</span> + <strong class="jxr_keyword">this</strong>.completed;
-<a class="jxr_linenumber" name="274" href="#274">274</a>     }
-<a class="jxr_linenumber" name="275" href="#275">275</a>   }
-<a class="jxr_linenumber" name="276" href="#276">276</a> 
-<a class="jxr_linenumber" name="277" href="#277">277</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> FIXED_SIZE = ClassSize.align(
-<a class="jxr_linenumber" name="278" href="#278">278</a>       ClassSize.OBJECT +
-<a class="jxr_linenumber" name="279" href="#279">279</a>       2 * Bytes.SIZEOF_LONG +
-<a class="jxr_linenumber" name="280" href="#280">280</a>       2 * ClassSize.REFERENCE);
-<a class="jxr_linenumber" name="281" href="#281">281</a> }
+<a class="jxr_linenumber" name="148" href="#148">148</a>     <strong class="jxr_keyword">if</strong> (!complete(e)) {
+<a class="jxr_linenumber" name="149" href="#149">149</a>       waitForRead(e);
+<a class="jxr_linenumber" name="150" href="#150">150</a>     }
+<a class="jxr_linenumber" name="151" href="#151">151</a>   }
+<a class="jxr_linenumber" name="152" href="#152">152</a> 
+<a class="jxr_linenumber" name="153" href="#153">153</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="154" href="#154">154</a> <em class="jxr_javadoccomment">   * Mark the {@link WriteEntry} as complete and advance the read point as much as possible.</em>
+<a class="jxr_linenumber" name="155" href="#155">155</a> <em class="jxr_javadoccomment">   * Call this even if the write has FAILED (AFTER backing out the write transaction</em>
+<a class="jxr_linenumber" name="156" href="#156">156</a> <em class="jxr_javadoccomment">   * changes completely) so we can clean up the outstanding transaction.</em>
+<a class="jxr_linenumber" name="157" href="#157">157</a> <em class="jxr_javadoccomment">   *</em>
+<a class="jxr_linenumber" name="158" href="#158">158</a> <em class="jxr_javadoccomment">   * How much is the read point advanced?</em>
+<a class="jxr_linenumber" name="159" href="#159">159</a> <em class="jxr_javadoccomment">   *</em>
+<a class="jxr_linenumber" name="160" href="#160">160</a> <em class="jxr_javadoccomment">   * Let S be the set of all write numbers that are completed. Set the read point to the highest</em>
+<a class="jxr_linenumber" name="161" href="#161">161</a> <em class="jxr_javadoccomment">   * numbered write of S.</em>
+<a class="jxr_linenumber" name="162" href="#162">162</a> <em class="jxr_javadoccomment">   *</em>
+<a class="jxr_linenumber" name="163" href="#163">163</a> <em class="jxr_javadoccomment">   * @param writeEntry</em>
+<a class="jxr_linenumber" name="164" href="#164">164</a> <em class="jxr_javadoccomment">   *</em>
+<a class="jxr_linenumber" name="165" href="#165">165</a> <em class="jxr_javadoccomment">   * @return true if e is visible to MVCC readers (that is, readpoint &gt;= e.writeNumber)</em>
+<a class="jxr_linenumber" name="166" href="#166">166</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="167" href="#167">167</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> complete(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> writeEntry) {
+<a class="jxr_linenumber" name="168" href="#168">168</a>     <strong class="jxr_keyword">synchronized</strong> (writeQueue) {
+<a class="jxr_linenumber" name="169" href="#169">169</a>       writeEntry.markCompleted();
+<a class="jxr_linenumber" name="170" href="#170">170</a>       <strong class="jxr_keyword">long</strong> nextReadValue = NONE;
+<a class="jxr_linenumber" name="171" href="#171">171</a>       <strong class="jxr_keyword">boolean</strong> ranOnce = false;
+<a class="jxr_linenumber" name="172" href="#172">172</a>       <strong class="jxr_keyword">while</strong> (!writeQueue.isEmpty()) {
+<a class="jxr_linenumber" name="173" href="#173">173</a>         ranOnce = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="174" href="#174">174</a>         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> queueFirst = writeQueue.getFirst();
+<a class="jxr_linenumber" name="175" href="#175">175</a> 
+<a class="jxr_linenumber" name="176" href="#176">176</a>         <strong class="jxr_keyword">if</strong> (nextReadValue &gt; 0) {
+<a class="jxr_linenumber" name="177" href="#177">177</a>           <strong class="jxr_keyword">if</strong> (nextReadValue + 1 != queueFirst.getWriteNumber()) {
+<a class="jxr_linenumber" name="178" href="#178">178</a>             <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> RuntimeException(<span class="jxr_string">"Invariant in complete violated, nextReadValue="</span>
+<a class="jxr_linenumber" name="179" href="#179">179</a>                 + nextReadValue + <span class="jxr_string">", writeNumber="</span> + queueFirst.getWriteNumber());
+<a class="jxr_linenumber" name="180" href="#180">180</a>           }
+<a class="jxr_linenumber" name="181" href="#181">181</a>         }
+<a class="jxr_linenumber" name="182" href="#182">182</a> 
+<a class="jxr_linenumber" name="183" href="#183">183</a>         <strong class="jxr_keyword">if</strong> (queueFirst.isCompleted()) {
+<a class="jxr_linenumber" name="184" href="#184">184</a>           nextReadValue = queueFirst.getWriteNumber();
+<a class="jxr_linenumber" name="185" href="#185">185</a>           writeQueue.removeFirst();
+<a class="jxr_linenumber" name="186" href="#186">186</a>         } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="187" href="#187">187</a>           <strong class="jxr_keyword">break</strong>;
+<a class="jxr_linenumber" name="188" href="#188">188</a>         }
+<a class="jxr_linenumber" name="189" href="#189">189</a>       }
+<a class="jxr_linenumber" name="190" href="#190">190</a> 
+<a class="jxr_linenumber" name="191" href="#191">191</a>       <strong class="jxr_keyword">if</strong> (!ranOnce) {
+<a class="jxr_linenumber" name="192" href="#192">192</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> RuntimeException(<span class="jxr_string">"There is no first!"</span>);
+<a class="jxr_linenumber" name="193" href="#193">193</a>       }
+<a class="jxr_linenumber" name="194" href="#194">194</a> 
+<a class="jxr_linenumber" name="195" href="#195">195</a>       <strong class="jxr_keyword">if</strong> (nextReadValue &gt; 0) {
+<a class="jxr_linenumber" name="196" href="#196">196</a>         <strong class="jxr_keyword">synchronized</strong> (readWaiters) {
+<a class="jxr_linenumber" name="197" href="#197">197</a>           readPoint.set(nextReadValue);
+<a class="jxr_linenumber" name="198" href="#198">198</a>           readWaiters.notifyAll();
+<a class="jxr_linenumber" name="199" href="#199">199</a>         }
+<a class="jxr_linenumber" name="200" href="#200">200</a>       }
+<a class="jxr_linenumber" name="201" href="#201">201</a>       <strong class="jxr_keyword">return</strong> readPoint.get() &gt;= writeEntry.getWriteNumber();
+<a class="jxr_linenumber" name="202" href="#202">202</a>     }
+<a class="jxr_linenumber" name="203" href="#203">203</a>   }
+<a class="jxr_linenumber" name="204" href="#204">204</a> 
+<a class="jxr_linenumber" name="205" href="#205">205</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="206" href="#206">206</a> <em class="jxr_javadoccomment">   * Wait for the global readPoint to advance up to the passed in write entry number.</em>
+<a class="jxr_linenumber" name="207" href="#207">207</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="208" href="#208">208</a>   <strong class="jxr_keyword">void</strong> waitForRead(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> e) {
+<a class="jxr_linenumber" name="209" href="#209">209</a>     <strong class="jxr_keyword">boolean</strong> interrupted = false;
+<a class="jxr_linenumber" name="210" href="#210">210</a>     <strong class="jxr_keyword">int</strong> count = 0;
+<a class="jxr_linenumber" name="211" href="#211">211</a>     <strong class="jxr_keyword">synchronized</strong> (readWaiters) {
+<a class="jxr_linenumber" name="212" href="#212">212</a>       <strong class="jxr_keyword">while</strong> (readPoint.get() &lt; e.getWriteNumber()) {
+<a class="jxr_linenumber" name="213" href="#213">213</a>         <strong class="jxr_keyword">if</strong> (count % 100 == 0 &amp;&amp; count &gt; 0) {
+<a class="jxr_linenumber" name="214" href="#214">214</a>           LOG.warn(<span class="jxr_string">"STUCK: "</span> + <strong class="jxr_keyword">this</strong>);
+<a class="jxr_linenumber" name="215" href="#215">215</a>         }
+<a class="jxr_linenumber" name="216" href="#216">216</a>         count++;
+<a class="jxr_linenumber" name="217" href="#217">217</a>         <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="218" href="#218">218</a>           readWaiters.wait(10);
+<a class="jxr_linenumber" name="219" href="#219">219</a>         } <strong class="jxr_keyword">catch</strong> (InterruptedException ie) {
+<a class="jxr_linenumber" name="220" href="#220">220</a>           <em class="jxr_comment">// We were interrupted... finish the loop -- i.e. cleanup --and then</em>
+<a class="jxr_linenumber" name="221" href="#221">221</a>           <em class="jxr_comment">// on our way out, reset the interrupt flag.</em>
+<a class="jxr_linenumber" name="222" href="#222">222</a>           interrupted = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="223" href="#223">223</a>         }
+<a class="jxr_linenumber" name="224" href="#224">224</a>       }
+<a class="jxr_linenumber" name="225" href="#225">225</a>     }
+<a class="jxr_linenumber" name="226" href="#226">226</a>     <strong class="jxr_keyword">if</strong> (interrupted) {
+<a class="jxr_linenumber" name="227" href="#227">227</a>       Thread.currentThread().interrupt();
+<a class="jxr_linenumber" name="228" href="#228">228</a>     }
+<a class="jxr_linenumber" name="229" href="#229">229</a>   }
+<a class="jxr_linenumber" name="230" href="#230">230</a> 
+<a class="jxr_linenumber" name="231" href="#231">231</a>   @VisibleForTesting
+<a class="jxr_linenumber" name="232" href="#232">232</a>   <strong class="jxr_keyword">public</strong> String toString() {
+<a class="jxr_linenumber" name="233" href="#233">233</a>     <strong class="jxr_keyword">return</strong> Objects.toStringHelper(<strong class="jxr_keyword">this</strong>)
+<a class="jxr_linenumber" name="234" href="#234">234</a>         .add(<span class="jxr_string">"readPoint"</span>, readPoint)
+<a class="jxr_linenumber" name="235" href="#235">235</a>         .add(<span class="jxr_string">"writePoint"</span>, writePoint).toString();
+<a class="jxr_linenumber" name="236" href="#236">236</a>   }
+<a class="jxr_linenumber" name="237" href="#237">237</a> 
+<a class="jxr_linenumber" name="238" href="#238">238</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">long</strong> getReadPoint() {
+<a class="jxr_linenumber" name="239" href="#239">239</a>     <strong class="jxr_keyword">return</strong> readPoint.get();
+<a class="jxr_linenumber" name="240" href="#240">240</a>   }
+<a class="jxr_linenumber" name="241" href="#241">241</a> 
+<a class="jxr_linenumber" name="242" href="#242">242</a>   @VisibleForTesting
+<a class="jxr_linenumber" name="243" href="#243">243</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">long</strong> getWritePoint() {
+<a class="jxr_linenumber" name="244" href="#244">244</a>     <strong class="jxr_keyword">return</strong> writePoint.get();
+<a class="jxr_linenumber" name="245" href="#245">245</a>   }
+<a class="jxr_linenumber" name="246" href="#246">246</a> 
+<a class="jxr_linenumber" name="247" href="#247">247</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="248" href="#248">248</a> <em class="jxr_javadoccomment">   * Write number and whether write has completed given out at start of a write transaction.</em>
+<a class="jxr_linenumber" name="249" href="#249">249</a> <em class="jxr_javadoccomment">   * Every created WriteEntry must be completed by calling mvcc#complete or #completeAndWait.</em>
+<a class="jxr_linenumber" name="250" href="#250">250</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="251" href="#251">251</a>   @InterfaceAudience.Private
+<a class="jxr_linenumber" name="252" href="#252">252</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">class</strong> <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a> {
+<a class="jxr_linenumber" name="253" href="#253">253</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> writeNumber;
+<a class="jxr_linenumber" name="254" href="#254">254</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">boolean</strong> completed = false;
+<a class="jxr_linenumber" name="255" href="#255">255</a> 
+<a class="jxr_linenumber" name="256" href="#256">256</a>     <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html">WriteEntry</a>(<strong class="jxr_keyword">long</strong> writeNumber) {
+<a class="jxr_linenumber" name="257" href="#257">257</a>       <strong class="jxr_keyword">this</strong>.writeNumber = writeNumber;
+<a class="jxr_linenumber" name="258" href="#258">258</a>     }
+<a class="jxr_linenumber" name="259" href="#259">259</a> 
+<a class="jxr_linenumber" name="260" href="#260">260</a>     <strong class="jxr_keyword">void</strong> markCompleted() {
+<a class="jxr_linenumber" name="261" href="#261">261</a>       <strong class="jxr_keyword">this</strong>.completed = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="262" href="#262">262</a>     }
+<a class="jxr_linenumber" name="263" href="#263">263</a> 
+<a class="jxr_linenumber" name="264" href="#264">264</a>     <strong class="jxr_keyword">boolean</strong> isCompleted() {
+<a class="jxr_linenumber" name="265" href="#265">265</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.completed;
+<a class="jxr_linenumber" name="266" href="#266">266</a>     }
+<a class="jxr_linenumber" name="267" href="#267">267</a> 
+<a class="jxr_linenumber" name="268" href="#268">268</a>     <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">long</strong> getWriteNumber() {
+<a class="jxr_linenumber" name="269" href="#269">269</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.writeNumber;
+<a class="jxr_linenumber" name="270" href="#270">270</a>     }
+<a class="jxr_linenumber" name="271" href="#271">271</a> 
+<a class="jxr_linenumber" name="272" href="#272">272</a>     @Override
+<a class="jxr_linenumber" name="273" href="#273">273</a>     <strong class="jxr_keyword">public</strong> String toString() {
+<a class="jxr_linenumber" name="274" href="#274">274</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.writeNumber + <span class="jxr_string">", "</span> + <strong class="jxr_keyword">this</strong>.completed;
+<a class="jxr_linenumber" name="275" href="#275">275</a>     }
+<a class="jxr_linenumber" name="276" href="#276">276</a>   }
+<a class="jxr_linenumber" name="277" href="#277">277</a> 
+<a class="jxr_linenumber" name="278" href="#278">278</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> FIXED_SIZE = ClassSize.align(
+<a class="jxr_linenumber" name="279" href="#279">279</a>       ClassSize.OBJECT +
+<a class="jxr_linenumber" name="280" href="#280">280</a>       2 * Bytes.SIZEOF_LONG +
+<a class="jxr_linenumber" name="281" href="#281">281</a>       2 * ClassSize.REFERENCE);
+<a class="jxr_linenumber" name="282" href="#282">282</a> }
 </pre>
 <hr/><div id="footer">This page was automatically generated by <a href="http://maven.apache.org/">Maven</a></div></body>
 </html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/a4cb7eaa/xref/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
----------------------------------------------------------------------
diff --git a/xref/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html b/xref/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
index 2f31bfd..869c6e8 100644
--- a/xref/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
+++ b/xref/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
@@ -1795,209 +1795,218 @@
 <a class="jxr_linenumber" name="1785" href="#1785">1785</a>           <em class="jxr_comment">// If not a batch, return to consume more events from the ring buffer before proceeding;</em>
 <a class="jxr_linenumber" name="1786" href="#1786">1786</a>           <em class="jxr_comment">// we want to get up a batch of syncs and appends before we go do a filesystem sync.</em>
 <a class="jxr_linenumber" name="1787" href="#1787">1787</a>           <strong class="jxr_keyword">if</strong> (!endOfBatch || <strong class="jxr_keyword">this</strong>.syncFuturesCount &lt;= 0) <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="1788" href="#1788">1788</a>           <em class="jxr_comment">// Below expects that the offer 'transfers' responsibility for the outstanding syncs to</em>
-<a class="jxr_linenumber" name="1789" href="#1789">1789</a>           <em class="jxr_comment">// the syncRunner. We should never get an exception in here.</em>
-<a class="jxr_linenumber" name="1790" href="#1790">1790</a>           <strong class="jxr_keyword">this</strong>.syncRunnerIndex = (<strong class="jxr_keyword">this</strong>.syncRunnerIndex + 1) % <strong class="jxr_keyword">this</strong>.syncRunners.length;
-<a class="jxr_linenumber" name="1791" href="#1791">1791</a>           <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="1792" href="#1792">1792</a>             <strong class="jxr_keyword">this</strong>.syncRunners[<strong class="jxr_keyword">this</strong>.syncRunnerIndex].offer(sequence, <strong class="jxr_keyword">this</strong>.syncFutures,
-<a class="jxr_linenumber" name="1793" href="#1793">1793</a>               <strong class="jxr_keyword">this</strong>.syncFuturesCount);
-<a class="jxr_linenumber" name="1794" href="#1794">1794</a>           } <strong class="jxr_keyword">catch</strong> (Exception e) {
-<a class="jxr_linenumber" name="1795" href="#1795">1795</a>             <em class="jxr_comment">// Should NEVER get here.</em>
-<a class="jxr_linenumber" name="1796" href="#1796">1796</a>             requestLogRoll();
-<a class="jxr_linenumber" name="1797" href="#1797">1797</a>             <strong class="jxr_keyword">this</strong>.exception = <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/DamagedWALException.html">DamagedWALException</a>(<span class="jxr_string">"Failed offering sync"</span>, e);
-<a class="jxr_linenumber" name="1798" href="#1798">1798</a>           }
-<a class="jxr_linenumber" name="1799" href="#1799">1799</a>         }
-<a class="jxr_linenumber" name="1800" href="#1800">1800</a>         <em class="jxr_comment">// We may have picked up an exception above trying to offer sync</em>
-<a class="jxr_linenumber" name="1801" href="#1801">1801</a>         <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.exception != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="1802" href="#1802">1802</a>           cleanupOutstandingSyncsOnException(sequence,
-<a class="jxr_linenumber" name="1803" href="#1803">1803</a>             <strong class="jxr_keyword">this</strong>.exception instanceof DamagedWALException?
-<a class="jxr_linenumber" name="1804" href="#1804">1804</a>               <strong class="jxr_keyword">this</strong>.exception:
-<a class="jxr_linenumber" name="1805" href="#1805">1805</a>               <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/DamagedWALException.html">DamagedWALException</a>(<span class="jxr_string">"On sync"</span>, <strong class="jxr_keyword">this</strong>.exception));
-<a class="jxr_linenumber" name="1806" href="#1806">1806</a>         }
-<a class="jxr_linenumber" name="1807" href="#1807">1807</a>         attainSafePoint(sequence);
-<a class="jxr_linenumber" name="1808" href="#1808">1808</a>         <strong class="jxr_keyword">this</strong>.syncFuturesCount = 0;
-<a class="jxr_linenumber" name="1809" href="#1809">1809</a>       } <strong class="jxr_keyword">catch</strong> (Throwable t) {
-<a class="jxr_linenumber" name="1810" href="#1810">1810</a>         LOG.error(<span class="jxr_string">"UNEXPECTED!!! syncFutures.length="</span> + <strong class="jxr_keyword">this</strong>.syncFutures.length, t);
-<a class="jxr_linenumber" name="1811" href="#1811">1811</a>       }
-<a class="jxr_linenumber" name="1812" href="#1812">1812</a>     }
-<a class="jxr_linenumber" name="1813" href="#1813">1813</a> 
-<a class="jxr_linenumber" name="1814" href="#1814">1814</a>     <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html">SafePointZigZagLatch</a> attainSafePoint() {
-<a class="jxr_linenumber" name="1815" href="#1815">1815</a>       <strong class="jxr_keyword">this</strong>.zigzagLatch = <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html">SafePointZigZagLatch</a>();
-<a class="jxr_linenumber" name="1816" href="#1816">1816</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.zigzagLatch;
-<a class="jxr_linenumber" name="1817" href="#1817">1817</a>     }
-<a class="jxr_linenumber" name="1818" href="#1818">1818</a> 
-<a class="jxr_linenumber" name="1819" href="#1819">1819</a>     <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="1820" href="#1820">1820</a> <em class="jxr_javadoccomment">     * Check if we should attain safe point.  If so, go there and then wait till signalled before</em>
-<a class="jxr_linenumber" name="1821" href="#1821">1821</a> <em class="jxr_javadoccomment">     * we proceeding.</em>
-<a class="jxr_linenumber" name="1822" href="#1822">1822</a> <em class="jxr_javadoccomment">     */</em>
-<a class="jxr_linenumber" name="1823" href="#1823">1823</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> attainSafePoint(<strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> currentSequence) {
-<a class="jxr_linenumber" name="1824" href="#1824">1824</a>       <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.zigzagLatch == <strong class="jxr_keyword">null</strong> || !<strong class="jxr_keyword">this</strong>.zigzagLatch.isCocked()) <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="1825" href="#1825">1825</a>       <em class="jxr_comment">// If here, another thread is waiting on us to get to safe point.  Don't leave it hanging.</em>
-<a class="jxr_linenumber" name="1826" href="#1826">1826</a>       beforeWaitOnSafePoint();
-<a class="jxr_linenumber" name="1827" href="#1827">1827</a>       <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="1828" href="#1828">1828</a>         <em class="jxr_comment">// Wait on outstanding syncers; wait for them to finish syncing (unless we've been</em>
-<a class="jxr_linenumber" name="1829" href="#1829">1829</a>         <em class="jxr_comment">// shutdown or unless our latch has been thrown because we have been aborted or unless</em>
-<a class="jxr_linenumber" name="1830" href="#1830">1830</a>         <em class="jxr_comment">// this WAL is broken and we can't get a sync/append to complete).</em>
-<a class="jxr_linenumber" name="1831" href="#1831">1831</a>         <strong class="jxr_keyword">while</strong> (!<strong class="jxr_keyword">this</strong>.shutdown &amp;&amp; <strong class="jxr_keyword">this</strong>.zigzagLatch.isCocked() &amp;&amp;
-<a class="jxr_linenumber" name="1832" href="#1832">1832</a>             highestSyncedSequence.get() &lt; currentSequence &amp;&amp;
-<a class="jxr_linenumber" name="1833" href="#1833">1833</a>             <em class="jxr_comment">// We could be in here and all syncs are failing or failed. Check for this. Otherwise</em>
-<a class="jxr_linenumber" name="1834" href="#1834">1834</a>             <em class="jxr_comment">// we'll just be stuck here for ever. In other words, ensure there syncs running.</em>
-<a class="jxr_linenumber" name="1835" href="#1835">1835</a>             isOutstandingSyncs()) {
-<a class="jxr_linenumber" name="1836" href="#1836">1836</a>           <strong class="jxr_keyword">synchronized</strong> (<strong class="jxr_keyword">this</strong>.safePointWaiter) {
-<a class="jxr_linenumber" name="1837" href="#1837">1837</a>             <strong class="jxr_keyword">this</strong>.safePointWaiter.wait(0, 1);
-<a class="jxr_linenumber" name="1838" href="#1838">1838</a>           }
-<a class="jxr_linenumber" name="1839" href="#1839">1839</a>         }
-<a class="jxr_linenumber" name="1840" href="#1840">1840</a>         <em class="jxr_comment">// Tell waiting thread we've attained safe point. Can clear this.throwable if set here</em>
-<a class="jxr_linenumber" name="1841" href="#1841">1841</a>         <em class="jxr_comment">// because we know that next event through the ringbuffer will be going to a new WAL</em>
-<a class="jxr_linenumber" name="1842" href="#1842">1842</a>         <em class="jxr_comment">// after we do the zigzaglatch dance.</em>
-<a class="jxr_linenumber" name="1843" href="#1843">1843</a>         <strong class="jxr_keyword">this</strong>.exception = <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="1844" href="#1844">1844</a>         <strong class="jxr_keyword">this</strong>.zigzagLatch.safePointAttained();
-<a class="jxr_linenumber" name="1845" href="#1845">1845</a>       } <strong class="jxr_keyword">catch</strong> (InterruptedException e) {
-<a class="jxr_linenumber" name="1846" href="#1846">1846</a>         LOG.warn(<span class="jxr_string">"Interrupted "</span>, e);
-<a class="jxr_linenumber" name="1847" href="#1847">1847</a>         Thread.currentThread().interrupt();
-<a class="jxr_linenumber" name="1848" href="#1848">1848</a>       }
-<a class="jxr_linenumber" name="1849" href="#1849">1849</a>     }
-<a class="jxr_linenumber" name="1850" href="#1850">1850</a> 
-<a class="jxr_linenumber" name="1851" href="#1851">1851</a>     <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="1852" href="#1852">1852</a> <em class="jxr_javadoccomment">     * Append to the WAL.  Does all CP and WAL listener calls.</em>
-<a class="jxr_linenumber" name="1853" href="#1853">1853</a> <em class="jxr_javadoccomment">     * @param entry</em>
-<a class="jxr_linenumber" name="1854" href="#1854">1854</a> <em class="jxr_javadoccomment">     * @throws Exception</em>
-<a class="jxr_linenumber" name="1855" href="#1855">1855</a> <em class="jxr_javadoccomment">     */</em>
-<a class="jxr_linenumber" name="1856" href="#1856">1856</a>     <strong class="jxr_keyword">void</strong> append(<strong class="jxr_keyword">final</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html">FSWALEntry</a> entry) <strong class="jxr_keyword">throws</strong> Exception {
-<a class="jxr_linenumber" name="1857" href="#1857">1857</a>       <em class="jxr_comment">// TODO: WORK ON MAKING THIS APPEND FASTER. DOING WAY TOO MUCH WORK WITH CPs, PBing, etc.</em>
-<a class="jxr_linenumber" name="1858" href="#1858">1858</a>       atHeadOfRingBufferEventHandlerAppend();
+<a class="jxr_linenumber" name="1788" href="#1788">1788</a>           <em class="jxr_comment">// syncRunnerIndex is bound to the range [0, Integer.MAX_INT - 1] as follows:</em>
+<a class="jxr_linenumber" name="1789" href="#1789">1789</a>           <em class="jxr_comment">//   * The maximum value possible for syncRunners.length is Integer.MAX_INT</em>
+<a class="jxr_linenumber" name="1790" href="#1790">1790</a>           <em class="jxr_comment">//   * syncRunnerIndex starts at 0 and is incremented only here</em>
+<a class="jxr_linenumber" name="1791" href="#1791">1791</a>           <em class="jxr_comment">//   * after the increment, the value is bounded by the '%' operator to [0, syncRunners.length),</em>
+<a class="jxr_linenumber" name="1792" href="#1792">1792</a>           <em class="jxr_comment">//     presuming the value was positive prior to the '%' operator.</em>
+<a class="jxr_linenumber" name="1793" href="#1793">1793</a>           <em class="jxr_comment">//   * after being bound to [0, Integer.MAX_INT - 1], the new value is stored in syncRunnerIndex</em>
+<a class="jxr_linenumber" name="1794" href="#1794">1794</a>           <em class="jxr_comment">//     ensuring that it can't grow without bound and overflow.</em>
+<a class="jxr_linenumber" name="1795" href="#1795">1795</a>           <em class="jxr_comment">//   * note that the value after the increment must be positive, because the most it could have</em>
+<a class="jxr_linenumber" name="1796" href="#1796">1796</a>           <em class="jxr_comment">//     been prior was Integer.MAX_INT - 1 and we only increment by 1.</em>
+<a class="jxr_linenumber" name="1797" href="#1797">1797</a>           <strong class="jxr_keyword">this</strong>.syncRunnerIndex = (<strong class="jxr_keyword">this</strong>.syncRunnerIndex + 1) % <strong class="jxr_keyword">this</strong>.syncRunners.length;
+<a class="jxr_linenumber" name="1798" href="#1798">1798</a>           <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="1799" href="#1799">1799</a>             <em class="jxr_comment">// Below expects that the offer 'transfers' responsibility for the outstanding syncs to</em>
+<a class="jxr_linenumber" name="1800" href="#1800">1800</a>             <em class="jxr_comment">// the syncRunner. We should never get an exception in here.</em>
+<a class="jxr_linenumber" name="1801" href="#1801">1801</a>             <strong class="jxr_keyword">this</strong>.syncRunners[<strong class="jxr_keyword">this</strong>.syncRunnerIndex].offer(sequence, <strong class="jxr_keyword">this</strong>.syncFutures,
+<a class="jxr_linenumber" name="1802" href="#1802">1802</a>               <strong class="jxr_keyword">this</strong>.syncFuturesCount);
+<a class="jxr_linenumber" name="1803" href="#1803">1803</a>           } <strong class="jxr_keyword">catch</strong> (Exception e) {
+<a class="jxr_linenumber" name="1804" href="#1804">1804</a>             <em class="jxr_comment">// Should NEVER get here.</em>
+<a class="jxr_linenumber" name="1805" href="#1805">1805</a>             requestLogRoll();
+<a class="jxr_linenumber" name="1806" href="#1806">1806</a>             <strong class="jxr_keyword">this</strong>.exception = <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/DamagedWALException.html">DamagedWALException</a>(<span class="jxr_string">"Failed offering sync"</span>, e);
+<a class="jxr_linenumber" name="1807" href="#1807">1807</a>           }
+<a class="jxr_linenumber" name="1808" href="#1808">1808</a>         }
+<a class="jxr_linenumber" name="1809" href="#1809">1809</a>         <em class="jxr_comment">// We may have picked up an exception above trying to offer sync</em>
+<a class="jxr_linenumber" name="1810" href="#1810">1810</a>         <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.exception != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="1811" href="#1811">1811</a>           cleanupOutstandingSyncsOnException(sequence,
+<a class="jxr_linenumber" name="1812" href="#1812">1812</a>             <strong class="jxr_keyword">this</strong>.exception instanceof DamagedWALException?
+<a class="jxr_linenumber" name="1813" href="#1813">1813</a>               <strong class="jxr_keyword">this</strong>.exception:
+<a class="jxr_linenumber" name="1814" href="#1814">1814</a>               <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/DamagedWALException.html">DamagedWALException</a>(<span class="jxr_string">"On sync"</span>, <strong class="jxr_keyword">this</strong>.exception));
+<a class="jxr_linenumber" name="1815" href="#1815">1815</a>         }
+<a class="jxr_linenumber" name="1816" href="#1816">1816</a>         attainSafePoint(sequence);
+<a class="jxr_linenumber" name="1817" href="#1817">1817</a>         <strong class="jxr_keyword">this</strong>.syncFuturesCount = 0;
+<a class="jxr_linenumber" name="1818" href="#1818">1818</a>       } <strong class="jxr_keyword">catch</strong> (Throwable t) {
+<a class="jxr_linenumber" name="1819" href="#1819">1819</a>         LOG.error(<span class="jxr_string">"UNEXPECTED!!! syncFutures.length="</span> + <strong class="jxr_keyword">this</strong>.syncFutures.length, t);
+<a class="jxr_linenumber" name="1820" href="#1820">1820</a>       }
+<a class="jxr_linenumber" name="1821" href="#1821">1821</a>     }
+<a class="jxr_linenumber" name="1822" href="#1822">1822</a> 
+<a class="jxr_linenumber" name="1823" href="#1823">1823</a>     <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html">SafePointZigZagLatch</a> attainSafePoint() {
+<a class="jxr_linenumber" name="1824" href="#1824">1824</a>       <strong class="jxr_keyword">this</strong>.zigzagLatch = <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html">SafePointZigZagLatch</a>();
+<a class="jxr_linenumber" name="1825" href="#1825">1825</a>       <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>.zigzagLatch;
+<a class="jxr_linenumber" name="1826" href="#1826">1826</a>     }
+<a class="jxr_linenumber" name="1827" href="#1827">1827</a> 
+<a class="jxr_linenumber" name="1828" href="#1828">1828</a>     <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="1829" href="#1829">1829</a> <em class="jxr_javadoccomment">     * Check if we should attain safe point.  If so, go there and then wait till signalled before</em>
+<a class="jxr_linenumber" name="1830" href="#1830">1830</a> <em class="jxr_javadoccomment">     * we proceeding.</em>
+<a class="jxr_linenumber" name="1831" href="#1831">1831</a> <em class="jxr_javadoccomment">     */</em>
+<a class="jxr_linenumber" name="1832" href="#1832">1832</a>     <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> attainSafePoint(<strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">long</strong> currentSequence) {
+<a class="jxr_linenumber" name="1833" href="#1833">1833</a>       <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.zigzagLatch == <strong class="jxr_keyword">null</strong> || !<strong class="jxr_keyword">this</strong>.zigzagLatch.isCocked()) <strong class="jxr_keyword">return</strong>;
+<a class="jxr_linenumber" name="1834" href="#1834">1834</a>       <em class="jxr_comment">// If here, another thread is waiting on us to get to safe point.  Don't leave it hanging.</em>
+<a class="jxr_linenumber" name="1835" href="#1835">1835</a>       beforeWaitOnSafePoint();
+<a class="jxr_linenumber" name="1836" href="#1836">1836</a>       <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="1837" href="#1837">1837</a>         <em class="jxr_comment">// Wait on outstanding syncers; wait for them to finish syncing (unless we've been</em>
+<a class="jxr_linenumber" name="1838" href="#1838">1838</a>         <em class="jxr_comment">// shutdown or unless our latch has been thrown because we have been aborted or unless</em>
+<a class="jxr_linenumber" name="1839" href="#1839">1839</a>         <em class="jxr_comment">// this WAL is broken and we can't get a sync/append to complete).</em>
+<a class="jxr_linenumber" name="1840" href="#1840">1840</a>         <strong class="jxr_keyword">while</strong> (!<strong class="jxr_keyword">this</strong>.shutdown &amp;&amp; <strong class="jxr_keyword">this</strong>.zigzagLatch.isCocked() &amp;&amp;
+<a class="jxr_linenumber" name="1841" href="#1841">1841</a>             highestSyncedSequence.get() &lt; currentSequence &amp;&amp;
+<a class="jxr_linenumber" name="1842" href="#1842">1842</a>             <em class="jxr_comment">// We could be in here and all syncs are failing or failed. Check for this. Otherwise</em>
+<a class="jxr_linenumber" name="1843" href="#1843">1843</a>             <em class="jxr_comment">// we'll just be stuck here for ever. In other words, ensure there syncs running.</em>
+<a class="jxr_linenumber" name="1844" href="#1844">1844</a>             isOutstandingSyncs()) {
+<a class="jxr_linenumber" name="1845" href="#1845">1845</a>           <strong class="jxr_keyword">synchronized</strong> (<strong class="jxr_keyword">this</strong>.safePointWaiter) {
+<a class="jxr_linenumber" name="1846" href="#1846">1846</a>             <strong class="jxr_keyword">this</strong>.safePointWaiter.wait(0, 1);
+<a class="jxr_linenumber" name="1847" href="#1847">1847</a>           }
+<a class="jxr_linenumber" name="1848" href="#1848">1848</a>         }
+<a class="jxr_linenumber" name="1849" href="#1849">1849</a>         <em class="jxr_comment">// Tell waiting thread we've attained safe point. Can clear this.throwable if set here</em>
+<a class="jxr_linenumber" name="1850" href="#1850">1850</a>         <em class="jxr_comment">// because we know that next event through the ringbuffer will be going to a new WAL</em>
+<a class="jxr_linenumber" name="1851" href="#1851">1851</a>         <em class="jxr_comment">// after we do the zigzaglatch dance.</em>
+<a class="jxr_linenumber" name="1852" href="#1852">1852</a>         <strong class="jxr_keyword">this</strong>.exception = <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="1853" href="#1853">1853</a>         <strong class="jxr_keyword">this</strong>.zigzagLatch.safePointAttained();
+<a class="jxr_linenumber" name="1854" href="#1854">1854</a>       } <strong class="jxr_keyword">catch</strong> (InterruptedException e) {
+<a class="jxr_linenumber" name="1855" href="#1855">1855</a>         LOG.warn(<span class="jxr_string">"Interrupted "</span>, e);
+<a class="jxr_linenumber" name="1856" href="#1856">1856</a>         Thread.currentThread().interrupt();
+<a class="jxr_linenumber" name="1857" href="#1857">1857</a>       }
+<a class="jxr_linenumber" name="1858" href="#1858">1858</a>     }
 <a class="jxr_linenumber" name="1859" href="#1859">1859</a> 
-<a class="jxr_linenumber" name="1860" href="#1860">1860</a>       <strong class="jxr_keyword">long</strong> start = EnvironmentEdgeManager.currentTime();
-<a class="jxr_linenumber" name="1861" href="#1861">1861</a>       byte [] encodedRegionName = entry.getKey().getEncodedRegionName();
-<a class="jxr_linenumber" name="1862" href="#1862">1862</a>       <strong class="jxr_keyword">long</strong> regionSequenceId = WALKey.NO_SEQUENCE_ID;
-<a class="jxr_linenumber" name="1863" href="#1863">1863</a>       <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="1864" href="#1864">1864</a>         <em class="jxr_comment">// We are about to append this edit; update the region-scoped sequence number.  Do it</em>
-<a class="jxr_linenumber" name="1865" href="#1865">1865</a>         <em class="jxr_comment">// here inside this single appending/writing thread.  Events are ordered on the ringbuffer</em>
-<a class="jxr_linenumber" name="1866" href="#1866">1866</a>         <em class="jxr_comment">// so region sequenceids will also be in order.</em>
-<a class="jxr_linenumber" name="1867" href="#1867">1867</a>         regionSequenceId = entry.stampRegionSequenceId();
-<a class="jxr_linenumber" name="1868" href="#1868">1868</a>         <em class="jxr_comment">// Edits are empty, there is nothing to append.  Maybe empty when we are looking for a</em>
-<a class="jxr_linenumber" name="1869" href="#1869">1869</a>         <em class="jxr_comment">// region sequence id only, a region edit/sequence id that is not associated with an actual</em>
-<a class="jxr_linenumber" name="1870" href="#1870">1870</a>         <em class="jxr_comment">// edit. It has to go through all the rigmarole to be sure we have the right ordering.</em>
-<a class="jxr_linenumber" name="1871" href="#1871">1871</a>         <strong class="jxr_keyword">if</strong> (entry.getEdit().isEmpty()) {
-<a class="jxr_linenumber" name="1872" href="#1872">1872</a>           <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="1873" href="#1873">1873</a>         }
-<a class="jxr_linenumber" name="1874" href="#1874">1874</a> 
-<a class="jxr_linenumber" name="1875" href="#1875">1875</a>         <em class="jxr_comment">// Coprocessor hook.</em>
-<a class="jxr_linenumber" name="1876" href="#1876">1876</a>         <strong class="jxr_keyword">if</strong> (!coprocessorHost.preWALWrite(entry.getHRegionInfo(), entry.getKey(),
-<a class="jxr_linenumber" name="1877" href="#1877">1877</a>             entry.getEdit())) {
-<a class="jxr_linenumber" name="1878" href="#1878">1878</a>           <strong class="jxr_keyword">if</strong> (entry.getEdit().isReplay()) {
-<a class="jxr_linenumber" name="1879" href="#1879">1879</a>             <em class="jxr_comment">// Set replication scope null so that this won't be replicated</em>
-<a class="jxr_linenumber" name="1880" href="#1880">1880</a>             entry.getKey().serializeReplicationScope(false);
-<a class="jxr_linenumber" name="1881" href="#1881">1881</a>           }
+<a class="jxr_linenumber" name="1860" href="#1860">1860</a>     <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="1861" href="#1861">1861</a> <em class="jxr_javadoccomment">     * Append to the WAL.  Does all CP and WAL listener calls.</em>
+<a class="jxr_linenumber" name="1862" href="#1862">1862</a> <em class="jxr_javadoccomment">     * @param entry</em>
+<a class="jxr_linenumber" name="1863" href="#1863">1863</a> <em class="jxr_javadoccomment">     * @throws Exception</em>
+<a class="jxr_linenumber" name="1864" href="#1864">1864</a> <em class="jxr_javadoccomment">     */</em>
+<a class="jxr_linenumber" name="1865" href="#1865">1865</a>     <strong class="jxr_keyword">void</strong> append(<strong class="jxr_keyword">final</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html">FSWALEntry</a> entry) <strong class="jxr_keyword">throws</strong> Exception {
+<a class="jxr_linenumber" name="1866" href="#1866">1866</a>       <em class="jxr_comment">// TODO: WORK ON MAKING THIS APPEND FASTER. DOING WAY TOO MUCH WORK WITH CPs, PBing, etc.</em>
+<a class="jxr_linenumber" name="1867" href="#1867">1867</a>       atHeadOfRingBufferEventHandlerAppend();
+<a class="jxr_linenumber" name="1868" href="#1868">1868</a> 
+<a class="jxr_linenumber" name="1869" href="#1869">1869</a>       <strong class="jxr_keyword">long</strong> start = EnvironmentEdgeManager.currentTime();
+<a class="jxr_linenumber" name="1870" href="#1870">1870</a>       byte [] encodedRegionName = entry.getKey().getEncodedRegionName();
+<a class="jxr_linenumber" name="1871" href="#1871">1871</a>       <strong class="jxr_keyword">long</strong> regionSequenceId = WALKey.NO_SEQUENCE_ID;
+<a class="jxr_linenumber" name="1872" href="#1872">1872</a>       <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="1873" href="#1873">1873</a>         <em class="jxr_comment">// We are about to append this edit; update the region-scoped sequence number.  Do it</em>
+<a class="jxr_linenumber" name="1874" href="#1874">1874</a>         <em class="jxr_comment">// here inside this single appending/writing thread.  Events are ordered on the ringbuffer</em>
+<a class="jxr_linenumber" name="1875" href="#1875">1875</a>         <em class="jxr_comment">// so region sequenceids will also be in order.</em>
+<a class="jxr_linenumber" name="1876" href="#1876">1876</a>         regionSequenceId = entry.stampRegionSequenceId();
+<a class="jxr_linenumber" name="1877" href="#1877">1877</a>         <em class="jxr_comment">// Edits are empty, there is nothing to append.  Maybe empty when we are looking for a</em>
+<a class="jxr_linenumber" name="1878" href="#1878">1878</a>         <em class="jxr_comment">// region sequence id only, a region edit/sequence id that is not associated with an actual</em>
+<a class="jxr_linenumber" name="1879" href="#1879">1879</a>         <em class="jxr_comment">// edit. It has to go through all the rigmarole to be sure we have the right ordering.</em>
+<a class="jxr_linenumber" name="1880" href="#1880">1880</a>         <strong class="jxr_keyword">if</strong> (entry.getEdit().isEmpty()) {
+<a class="jxr_linenumber" name="1881" href="#1881">1881</a>           <strong class="jxr_keyword">return</strong>;
 <a class="jxr_linenumber" name="1882" href="#1882">1882</a>         }
-<a class="jxr_linenumber" name="1883" href="#1883">1883</a>         <strong class="jxr_keyword">if</strong> (!listeners.isEmpty()) {
-<a class="jxr_linenumber" name="1884" href="#1884">1884</a>           <strong class="jxr_keyword">for</strong> (WALActionsListener i: listeners) {
-<a class="jxr_linenumber" name="1885" href="#1885">1885</a>             i.visitLogEntryBeforeWrite(entry.getKey(), entry.getEdit());
-<a class="jxr_linenumber" name="1886" href="#1886">1886</a>           }
-<a class="jxr_linenumber" name="1887" href="#1887">1887</a>         }
-<a class="jxr_linenumber" name="1888" href="#1888">1888</a> 
-<a class="jxr_linenumber" name="1889" href="#1889">1889</a>         writer.append(entry);
-<a class="jxr_linenumber" name="1890" href="#1890">1890</a>         assert highestUnsyncedSequence &lt; entry.getSequence();
-<a class="jxr_linenumber" name="1891" href="#1891">1891</a>         highestUnsyncedSequence = entry.getSequence();
-<a class="jxr_linenumber" name="1892" href="#1892">1892</a>         sequenceIdAccounting.update(encodedRegionName, entry.getFamilyNames(), regionSequenceId,
-<a class="jxr_linenumber" name="1893" href="#1893">1893</a>           entry.isInMemstore());
-<a class="jxr_linenumber" name="1894" href="#1894">1894</a>         coprocessorHost.postWALWrite(entry.getHRegionInfo(), entry.getKey(), entry.getEdit());
-<a class="jxr_linenumber" name="1895" href="#1895">1895</a>         <em class="jxr_comment">// Update metrics.</em>
-<a class="jxr_linenumber" name="1896" href="#1896">1896</a>         postAppend(entry, EnvironmentEdgeManager.currentTime() - start);
-<a class="jxr_linenumber" name="1897" href="#1897">1897</a>       } <strong class="jxr_keyword">catch</strong> (Exception e) {
-<a class="jxr_linenumber" name="1898" href="#1898">1898</a>         String msg = <span class="jxr_string">"Append sequenceId="</span> + regionSequenceId + <span class="jxr_string">", requesting roll of WAL"</span>;
-<a class="jxr_linenumber" name="1899" href="#1899">1899</a>         LOG.warn(msg, e);
-<a class="jxr_linenumber" name="1900" href="#1900">1900</a>         requestLogRoll();
-<a class="jxr_linenumber" name="1901" href="#1901">1901</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/DamagedWALException.html">DamagedWALException</a>(msg, e);
-<a class="jxr_linenumber" name="1902" href="#1902">1902</a>       }
-<a class="jxr_linenumber" name="1903" href="#1903">1903</a>       numEntries.incrementAndGet();
-<a class="jxr_linenumber" name="1904" href="#1904">1904</a>     }
-<a class="jxr_linenumber" name="1905" href="#1905">1905</a> 
-<a class="jxr_linenumber" name="1906" href="#1906">1906</a>     @Override
-<a class="jxr_linenumber" name="1907" href="#1907">1907</a>     <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> onStart() {
-<a class="jxr_linenumber" name="1908" href="#1908">1908</a>       <strong class="jxr_keyword">for</strong> (SyncRunner syncRunner: <strong class="jxr_keyword">this</strong>.syncRunners) syncRunner.start();
-<a class="jxr_linenumber" name="1909" href="#1909">1909</a>     }
-<a class="jxr_linenumber" name="1910" href="#1910">1910</a> 
-<a class="jxr_linenumber" name="1911" href="#1911">1911</a>     @Override
-<a class="jxr_linenumber" name="1912" href="#1912">1912</a>     <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> onShutdown() {
-<a class="jxr_linenumber" name="1913" href="#1913">1913</a>       <strong class="jxr_keyword">for</strong> (SyncRunner syncRunner: <strong class="jxr_keyword">this</strong>.syncRunners) syncRunner.interrupt();
-<a class="jxr_linenumber" name="1914" href="#1914">1914</a>     }
-<a class="jxr_linenumber" name="1915" href="#1915">1915</a>   }
-<a class="jxr_linenumber" name="1916" href="#1916">1916</a> 
-<a class="jxr_linenumber" name="1917" href="#1917">1917</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="1918" href="#1918">1918</a> <em class="jxr_javadoccomment">   * Exposed for testing only.  Use to tricks like halt the ring buffer appending.</em>
-<a class="jxr_linenumber" name="1919" href="#1919">1919</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="1920" href="#1920">1920</a>   @VisibleForTesting
-<a class="jxr_linenumber" name="1921" href="#1921">1921</a>   <strong class="jxr_keyword">void</strong> atHeadOfRingBufferEventHandlerAppend() {
-<a class="jxr_linenumber" name="1922" href="#1922">1922</a>     <em class="jxr_comment">// Noop</em>
-<a class="jxr_linenumber" name="1923" href="#1923">1923</a>   }
-<a class="jxr_linenumber" name="1924" href="#1924">1924</a> 
-<a class="jxr_linenumber" name="1925" href="#1925">1925</a>   <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> IOException ensureIOException(<strong class="jxr_keyword">final</strong> Throwable t) {
-<a class="jxr_linenumber" name="1926" href="#1926">1926</a>     <strong class="jxr_keyword">return</strong> (t instanceof IOException)? (IOException)t: <strong class="jxr_keyword">new</strong> IOException(t);
-<a class="jxr_linenumber" name="1927" href="#1927">1927</a>   }
-<a class="jxr_linenumber" name="1928" href="#1928">1928</a> 
-<a class="jxr_linenumber" name="1929" href="#1929">1929</a>   <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> usage() {
-<a class="jxr_linenumber" name="1930" href="#1930">1930</a>     System.err.println(<span class="jxr_string">"Usage: FSHLog &lt;ARGS&gt;"</span>);
-<a class="jxr_linenumber" name="1931" href="#1931">1931</a>     System.err.println(<span class="jxr_string">"Arguments:"</span>);
-<a class="jxr_linenumber" name="1932" href="#1932">1932</a>     System.err.println(<span class="jxr_string">" --dump  Dump textual representation of passed one or more files"</span>);
-<a class="jxr_linenumber" name="1933" href="#1933">1933</a>     System.err.println(<span class="jxr_string">"         For example: "</span> +
-<a class="jxr_linenumber" name="1934" href="#1934">1934</a>       <span class="jxr_string">"FSHLog --dump hdfs://example.com:9000/hbase/.logs/MACHINE/LOGFILE"</span>);
-<a class="jxr_linenumber" name="1935" href="#1935">1935</a>     System.err.println(<span class="jxr_string">" --split Split the passed directory of WAL logs"</span>);
-<a class="jxr_linenumber" name="1936" href="#1936">1936</a>     System.err.println(<span class="jxr_string">"         For example: "</span> +
-<a class="jxr_linenumber" name="1937" href="#1937">1937</a>       <span class="jxr_string">"FSHLog --split hdfs://example.com:9000/hbase/.logs/DIR"</span>);
-<a class="jxr_linenumber" name="1938" href="#1938">1938</a>   }
-<a class="jxr_linenumber" name="1939" href="#1939">1939</a> 
-<a class="jxr_linenumber" name="1940" href="#1940">1940</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="1941" href="#1941">1941</a> <em class="jxr_javadoccomment">   * Pass one or more log file names and it will either dump out a text version</em>
-<a class="jxr_linenumber" name="1942" href="#1942">1942</a> <em class="jxr_javadoccomment">   * on &lt;code&gt;stdout&lt;/code&gt; or split the specified log files.</em>
-<a class="jxr_linenumber" name="1943" href="#1943">1943</a> <em class="jxr_javadoccomment">   *</em>
-<a class="jxr_linenumber" name="1944" href="#1944">1944</a> <em class="jxr_javadoccomment">   * @param args</em>
-<a class="jxr_linenumber" name="1945" href="#1945">1945</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
-<a class="jxr_linenumber" name="1946" href="#1946">1946</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="1947" href="#1947">1947</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> main(String[] args) <strong class="jxr_keyword">throws</strong> IOException {
-<a class="jxr_linenumber" name="1948" href="#1948">1948</a>     <strong class="jxr_keyword">if</strong> (args.length &lt; 2) {
-<a class="jxr_linenumber" name="1949" href="#1949">1949</a>       usage();
-<a class="jxr_linenumber" name="1950" href="#1950">1950</a>       System.exit(-1);
-<a class="jxr_linenumber" name="1951" href="#1951">1951</a>     }
-<a class="jxr_linenumber" name="1952" href="#1952">1952</a>     <em class="jxr_comment">// either dump using the WALPrettyPrinter or split, depending on args</em>
-<a class="jxr_linenumber" name="1953" href="#1953">1953</a>     <strong class="jxr_keyword">if</strong> (args[0].compareTo(<span class="jxr_string">"--dump"</span>) == 0) {
-<a class="jxr_linenumber" name="1954" href="#1954">1954</a>       WALPrettyPrinter.run(Arrays.copyOfRange(args, 1, args.length));
-<a class="jxr_linenumber" name="1955" href="#1955">1955</a>     } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (args[0].compareTo(<span class="jxr_string">"--perf"</span>) == 0) {
-<a class="jxr_linenumber" name="1956" href="#1956">1956</a>       LOG.fatal(<span class="jxr_string">"Please use the WALPerformanceEvaluation tool instead. i.e.:"</span>);
-<a class="jxr_linenumber" name="1957" href="#1957">1957</a>       LOG.fatal(<span class="jxr_string">"\thbase org.apache.hadoop.hbase.wal.WALPerformanceEvaluation --iterations "</span> +
-<a class="jxr_linenumber" name="1958" href="#1958">1958</a>           args[1]);
+<a class="jxr_linenumber" name="1883" href="#1883">1883</a> 
+<a class="jxr_linenumber" name="1884" href="#1884">1884</a>         <em class="jxr_comment">// Coprocessor hook.</em>
+<a class="jxr_linenumber" name="1885" href="#1885">1885</a>         <strong class="jxr_keyword">if</strong> (!coprocessorHost.preWALWrite(entry.getHRegionInfo(), entry.getKey(),
+<a class="jxr_linenumber" name="1886" href="#1886">1886</a>             entry.getEdit())) {
+<a class="jxr_linenumber" name="1887" href="#1887">1887</a>           <strong class="jxr_keyword">if</strong> (entry.getEdit().isReplay()) {
+<a class="jxr_linenumber" name="1888" href="#1888">1888</a>             <em class="jxr_comment">// Set replication scope null so that this won't be replicated</em>
+<a class="jxr_linenumber" name="1889" href="#1889">1889</a>             entry.getKey().serializeReplicationScope(false);
+<a class="jxr_linenumber" name="1890" href="#1890">1890</a>           }
+<a class="jxr_linenumber" name="1891" href="#1891">1891</a>         }
+<a class="jxr_linenumber" name="1892" href="#1892">1892</a>         <strong class="jxr_keyword">if</strong> (!listeners.isEmpty()) {
+<a class="jxr_linenumber" name="1893" href="#1893">1893</a>           <strong class="jxr_keyword">for</strong> (WALActionsListener i: listeners) {
+<a class="jxr_linenumber" name="1894" href="#1894">1894</a>             i.visitLogEntryBeforeWrite(entry.getKey(), entry.getEdit());
+<a class="jxr_linenumber" name="1895" href="#1895">1895</a>           }
+<a class="jxr_linenumber" name="1896" href="#1896">1896</a>         }
+<a class="jxr_linenumber" name="1897" href="#1897">1897</a> 
+<a class="jxr_linenumber" name="1898" href="#1898">1898</a>         writer.append(entry);
+<a class="jxr_linenumber" name="1899" href="#1899">1899</a>         assert highestUnsyncedSequence &lt; entry.getSequence();
+<a class="jxr_linenumber" name="1900" href="#1900">1900</a>         highestUnsyncedSequence = entry.getSequence();
+<a class="jxr_linenumber" name="1901" href="#1901">1901</a>         sequenceIdAccounting.update(encodedRegionName, entry.getFamilyNames(), regionSequenceId,
+<a class="jxr_linenumber" name="1902" href="#1902">1902</a>           entry.isInMemstore());
+<a class="jxr_linenumber" name="1903" href="#1903">1903</a>         coprocessorHost.postWALWrite(entry.getHRegionInfo(), entry.getKey(), entry.getEdit());
+<a class="jxr_linenumber" name="1904" href="#1904">1904</a>         <em class="jxr_comment">// Update metrics.</em>
+<a class="jxr_linenumber" name="1905" href="#1905">1905</a>         postAppend(entry, EnvironmentEdgeManager.currentTime() - start);
+<a class="jxr_linenumber" name="1906" href="#1906">1906</a>       } <strong class="jxr_keyword">catch</strong> (Exception e) {
+<a class="jxr_linenumber" name="1907" href="#1907">1907</a>         String msg = <span class="jxr_string">"Append sequenceId="</span> + regionSequenceId + <span class="jxr_string">", requesting roll of WAL"</span>;
+<a class="jxr_linenumber" name="1908" href="#1908">1908</a>         LOG.warn(msg, e);
+<a class="jxr_linenumber" name="1909" href="#1909">1909</a>         requestLogRoll();
+<a class="jxr_linenumber" name="1910" href="#1910">1910</a>         <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/DamagedWALException.html">DamagedWALException</a>(msg, e);
+<a class="jxr_linenumber" name="1911" href="#1911">1911</a>       }
+<a class="jxr_linenumber" name="1912" href="#1912">1912</a>       numEntries.incrementAndGet();
+<a class="jxr_linenumber" name="1913" href="#1913">1913</a>     }
+<a class="jxr_linenumber" name="1914" href="#1914">1914</a> 
+<a class="jxr_linenumber" name="1915" href="#1915">1915</a>     @Override
+<a class="jxr_linenumber" name="1916" href="#1916">1916</a>     <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> onStart() {
+<a class="jxr_linenumber" name="1917" href="#1917">1917</a>       <strong class="jxr_keyword">for</strong> (SyncRunner syncRunner: <strong class="jxr_keyword">this</strong>.syncRunners) syncRunner.start();
+<a class="jxr_linenumber" name="1918" href="#1918">1918</a>     }
+<a class="jxr_linenumber" name="1919" href="#1919">1919</a> 
+<a class="jxr_linenumber" name="1920" href="#1920">1920</a>     @Override
+<a class="jxr_linenumber" name="1921" href="#1921">1921</a>     <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> onShutdown() {
+<a class="jxr_linenumber" name="1922" href="#1922">1922</a>       <strong class="jxr_keyword">for</strong> (SyncRunner syncRunner: <strong class="jxr_keyword">this</strong>.syncRunners) syncRunner.interrupt();
+<a class="jxr_linenumber" name="1923" href="#1923">1923</a>     }
+<a class="jxr_linenumber" name="1924" href="#1924">1924</a>   }
+<a class="jxr_linenumber" name="1925" href="#1925">1925</a> 
+<a class="jxr_linenumber" name="1926" href="#1926">1926</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="1927" href="#1927">1927</a> <em class="jxr_javadoccomment">   * Exposed for testing only.  Use to tricks like halt the ring buffer appending.</em>
+<a class="jxr_linenumber" name="1928" href="#1928">1928</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="1929" href="#1929">1929</a>   @VisibleForTesting
+<a class="jxr_linenumber" name="1930" href="#1930">1930</a>   <strong class="jxr_keyword">void</strong> atHeadOfRingBufferEventHandlerAppend() {
+<a class="jxr_linenumber" name="1931" href="#1931">1931</a>     <em class="jxr_comment">// Noop</em>
+<a class="jxr_linenumber" name="1932" href="#1932">1932</a>   }
+<a class="jxr_linenumber" name="1933" href="#1933">1933</a> 
+<a class="jxr_linenumber" name="1934" href="#1934">1934</a>   <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> IOException ensureIOException(<strong class="jxr_keyword">final</strong> Throwable t) {
+<a class="jxr_linenumber" name="1935" href="#1935">1935</a>     <strong class="jxr_keyword">return</strong> (t instanceof IOException)? (IOException)t: <strong class="jxr_keyword">new</strong> IOException(t);
+<a class="jxr_linenumber" name="1936" href="#1936">1936</a>   }
+<a class="jxr_linenumber" name="1937" href="#1937">1937</a> 
+<a class="jxr_linenumber" name="1938" href="#1938">1938</a>   <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> usage() {
+<a class="jxr_linenumber" name="1939" href="#1939">1939</a>     System.err.println(<span class="jxr_string">"Usage: FSHLog &lt;ARGS&gt;"</span>);
+<a class="jxr_linenumber" name="1940" href="#1940">1940</a>     System.err.println(<span class="jxr_string">"Arguments:"</span>);
+<a class="jxr_linenumber" name="1941" href="#1941">1941</a>     System.err.println(<span class="jxr_string">" --dump  Dump textual representation of passed one or more files"</span>);
+<a class="jxr_linenumber" name="1942" href="#1942">1942</a>     System.err.println(<span class="jxr_string">"         For example: "</span> +
+<a class="jxr_linenumber" name="1943" href="#1943">1943</a>       <span class="jxr_string">"FSHLog --dump hdfs://example.com:9000/hbase/.logs/MACHINE/LOGFILE"</span>);
+<a class="jxr_linenumber" name="1944" href="#1944">1944</a>     System.err.println(<span class="jxr_string">" --split Split the passed directory of WAL logs"</span>);
+<a class="jxr_linenumber" name="1945" href="#1945">1945</a>     System.err.println(<span class="jxr_string">"         For example: "</span> +
+<a class="jxr_linenumber" name="1946" href="#1946">1946</a>       <span class="jxr_string">"FSHLog --split hdfs://example.com:9000/hbase/.logs/DIR"</span>);
+<a class="jxr_linenumber" name="1947" href="#1947">1947</a>   }
+<a class="jxr_linenumber" name="1948" href="#1948">1948</a> 
+<a class="jxr_linenumber" name="1949" href="#1949">1949</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="1950" href="#1950">1950</a> <em class="jxr_javadoccomment">   * Pass one or more log file names and it will either dump out a text version</em>
+<a class="jxr_linenumber" name="1951" href="#1951">1951</a> <em class="jxr_javadoccomment">   * on &lt;code&gt;stdout&lt;/code&gt; or split the specified log files.</em>
+<a class="jxr_linenumber" name="1952" href="#1952">1952</a> <em class="jxr_javadoccomment">   *</em>
+<a class="jxr_linenumber" name="1953" href="#1953">1953</a> <em class="jxr_javadoccomment">   * @param args</em>
+<a class="jxr_linenumber" name="1954" href="#1954">1954</a> <em class="jxr_javadoccomment">   * @throws IOException</em>
+<a class="jxr_linenumber" name="1955" href="#1955">1955</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="1956" href="#1956">1956</a>   <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">void</strong> main(String[] args) <strong class="jxr_keyword">throws</strong> IOException {
+<a class="jxr_linenumber" name="1957" href="#1957">1957</a>     <strong class="jxr_keyword">if</strong> (args.length &lt; 2) {
+<a class="jxr_linenumber" name="1958" href="#1958">1958</a>       usage();
 <a class="jxr_linenumber" name="1959" href="#1959">1959</a>       System.exit(-1);
-<a class="jxr_linenumber" name="1960" href="#1960">1960</a>     } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (args[0].compareTo(<span class="jxr_string">"--split"</span>) == 0) {
-<a class="jxr_linenumber" name="1961" href="#1961">1961</a>       Configuration conf = HBaseConfiguration.create();
-<a class="jxr_linenumber" name="1962" href="#1962">1962</a>       <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 1; i &lt; args.length; i++) {
-<a class="jxr_linenumber" name="1963" href="#1963">1963</a>         <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="1964" href="#1964">1964</a>           Path logPath = <strong class="jxr_keyword">new</strong> Path(args[i]);
-<a class="jxr_linenumber" name="1965" href="#1965">1965</a>           FSUtils.setFsDefault(conf, logPath);
-<a class="jxr_linenumber" name="1966" href="#1966">1966</a>           split(conf, logPath);
-<a class="jxr_linenumber" name="1967" href="#1967">1967</a>         } <strong class="jxr_keyword">catch</strong> (IOException t) {
-<a class="jxr_linenumber" name="1968" href="#1968">1968</a>           t.printStackTrace(System.err);
-<a class="jxr_linenumber" name="1969" href="#1969">1969</a>           System.exit(-1);
-<a class="jxr_linenumber" name="1970" href="#1970">1970</a>         }
-<a class="jxr_linenumber" name="1971" href="#1971">1971</a>       }
-<a class="jxr_linenumber" name="1972" href="#1972">1972</a>     } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="1973" href="#1973">1973</a>       usage();
-<a class="jxr_linenumber" name="1974" href="#1974">1974</a>       System.exit(-1);
-<a class="jxr_linenumber" name="1975" href="#1975">1975</a>     }
-<a class="jxr_linenumber" name="1976" href="#1976">1976</a>   }
-<a class="jxr_linenumber" name="1977" href="#1977">1977</a> 
-<a class="jxr_linenumber" name="1978" href="#1978">1978</a>   <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="1979" href="#1979">1979</a> <em class="jxr_javadoccomment">   * This method gets the pipeline for the current WAL.</em>
-<a class="jxr_linenumber" name="1980" href="#1980">1980</a> <em class="jxr_javadoccomment">   */</em>
-<a class="jxr_linenumber" name="1981" href="#1981">1981</a>   @VisibleForTesting
-<a class="jxr_linenumber" name="1982" href="#1982">1982</a>   DatanodeInfo[] getPipeLine() {
-<a class="jxr_linenumber" name="1983" href="#1983">1983</a>     <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.hdfs_out != <strong class="jxr_keyword">null</strong>) {
-<a class="jxr_linenumber" name="1984" href="#1984">1984</a>       <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.hdfs_out.getWrappedStream() instanceof DFSOutputStream) {
-<a class="jxr_linenumber" name="1985" href="#1985">1985</a>         <strong class="jxr_keyword">return</strong> ((DFSOutputStream) <strong class="jxr_keyword">this</strong>.hdfs_out.getWrappedStream()).getPipeline();
-<a class="jxr_linenumber" name="1986" href="#1986">1986</a>       }
-<a class="jxr_linenumber" name="1987" href="#1987">1987</a>     }
-<a class="jxr_linenumber" name="1988" href="#1988">1988</a>     <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> DatanodeInfo[0];
-<a class="jxr_linenumber" name="1989" href="#1989">1989</a>   }
-<a class="jxr_linenumber" name="1990" href="#1990">1990</a> }
+<a class="jxr_linenumber" name="1960" href="#1960">1960</a>     }
+<a class="jxr_linenumber" name="1961" href="#1961">1961</a>     <em class="jxr_comment">// either dump using the WALPrettyPrinter or split, depending on args</em>
+<a class="jxr_linenumber" name="1962" href="#1962">1962</a>     <strong class="jxr_keyword">if</strong> (args[0].compareTo(<span class="jxr_string">"--dump"</span>) == 0) {
+<a class="jxr_linenumber" name="1963" href="#1963">1963</a>       WALPrettyPrinter.run(Arrays.copyOfRange(args, 1, args.length));
+<a class="jxr_linenumber" name="1964" href="#1964">1964</a>     } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (args[0].compareTo(<span class="jxr_string">"--perf"</span>) == 0) {
+<a class="jxr_linenumber" name="1965" href="#1965">1965</a>       LOG.fatal(<span class="jxr_string">"Please use the WALPerformanceEvaluation tool instead. i.e.:"</span>);
+<a class="jxr_linenumber" name="1966" href="#1966">1966</a>       LOG.fatal(<span class="jxr_string">"\thbase org.apache.hadoop.hbase.wal.WALPerformanceEvaluation --iterations "</span> +
+<a class="jxr_linenumber" name="1967" href="#1967">1967</a>           args[1]);
+<a class="jxr_linenumber" name="1968" href="#1968">1968</a>       System.exit(-1);
+<a class="jxr_linenumber" name="1969" href="#1969">1969</a>     } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (args[0].compareTo(<span class="jxr_string">"--split"</span>) == 0) {
+<a class="jxr_linenumber" name="1970" href="#1970">1970</a>       Configuration conf = HBaseConfiguration.create();
+<a class="jxr_linenumber" name="1971" href="#1971">1971</a>       <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">int</strong> i = 1; i &lt; args.length; i++) {
+<a class="jxr_linenumber" name="1972" href="#1972">1972</a>         <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="1973" href="#1973">1973</a>           Path logPath = <strong class="jxr_keyword">new</strong> Path(args[i]);
+<a class="jxr_linenumber" name="1974" href="#1974">1974</a>           FSUtils.setFsDefault(conf, logPath);
+<a class="jxr_linenumber" name="1975" href="#1975">1975</a>           split(conf, logPath);
+<a class="jxr_linenumber" name="1976" href="#1976">1976</a>         } <strong class="jxr_keyword">catch</strong> (IOException t) {
+<a class="jxr_linenumber" name="1977" href="#1977">1977</a>           t.printStackTrace(System.err);
+<a class="jxr_linenumber" name="1978" href="#1978">1978</a>           System.exit(-1);
+<a class="jxr_linenumber" name="1979" href="#1979">1979</a>         }
+<a class="jxr_linenumber" name="1980" href="#1980">1980</a>       }
+<a class="jxr_linenumber" name="1981" href="#1981">1981</a>     } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="1982" href="#1982">1982</a>       usage();
+<a class="jxr_linenumber" name="1983" href="#1983">1983</a>       System.exit(-1);
+<a class="jxr_linenumber" name="1984" href="#1984">1984</a>     }
+<a class="jxr_linenumber" name="1985" href="#1985">1985</a>   }
+<a class="jxr_linenumber" name="1986" href="#1986">1986</a> 
+<a class="jxr_linenumber" name="1987" href="#1987">1987</a>   <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="1988" href="#1988">1988</a> <em class="jxr_javadoccomment">   * This method gets the pipeline for the current WAL.</em>
+<a class="jxr_linenumber" name="1989" href="#1989">1989</a> <em class="jxr_javadoccomment">   */</em>
+<a class="jxr_linenumber" name="1990" href="#1990">1990</a>   @VisibleForTesting
+<a class="jxr_linenumber" name="1991" href="#1991">1991</a>   DatanodeInfo[] getPipeLine() {
+<a class="jxr_linenumber" name="1992" href="#1992">1992</a>     <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.hdfs_out != <strong class="jxr_keyword">null</strong>) {
+<a class="jxr_linenumber" name="1993" href="#1993">1993</a>       <strong class="jxr_keyword">if</strong> (<strong class="jxr_keyword">this</strong>.hdfs_out.getWrappedStream() instanceof DFSOutputStream) {
+<a class="jxr_linenumber" name="1994" href="#1994">1994</a>         <strong class="jxr_keyword">return</strong> ((DFSOutputStream) <strong class="jxr_keyword">this</strong>.hdfs_out.getWrappedStream()).getPipeline();
+<a class="jxr_linenumber" name="1995" href="#1995">1995</a>       }
+<a class="jxr_linenumber" name="1996" href="#1996">1996</a>     }
+<a class="jxr_linenumber" name="1997" href="#1997">1997</a>     <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> DatanodeInfo[0];
+<a class="jxr_linenumber" name="1998" href="#1998">1998</a>   }
+<a class="jxr_linenumber" name="1999" href="#1999">1999</a> }
 </pre>
 <hr/><div id="footer">This page was automatically generated by <a href="http://maven.apache.org/">Maven</a></div></body>
 </html>