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

[01/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 4e1efd6f6 -> 6eb695c8b


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 532d67b..f7d6df6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -139,9 +139,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 </ul>
 </li>
 </ul>


[47/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
index 74d6ab8..d0f9492 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2962">HRegion.BatchOperation</a>&lt;T&gt;
+<pre>private abstract static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2974">HRegion.BatchOperation</a>&lt;T&gt;
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Class that tracks the progress of a batch operations, accumulating status codes and tracking
  the index at which processing is proceeding. These batch operations may get split into
@@ -415,7 +415,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>operations</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="type parameter in HRegion.BatchOperation">T</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2963">operations</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="type parameter in HRegion.BatchOperation">T</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2975">operations</a></pre>
 </li>
 </ul>
 <a name="retCodeDetails">
@@ -424,7 +424,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>retCodeDetails</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2964">retCodeDetails</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/OperationStatus.html" title="class in org.apache.hadoop.hbase.regionserver">OperationStatus</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2976">retCodeDetails</a></pre>
 </li>
 </ul>
 <a name="walEditsFromCoprocessors">
@@ -433,7 +433,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>walEditsFromCoprocessors</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2965">walEditsFromCoprocessors</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2977">walEditsFromCoprocessors</a></pre>
 </li>
 </ul>
 <a name="familyCellMaps">
@@ -442,7 +442,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>familyCellMaps</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2967">familyCellMaps</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2979">familyCellMaps</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -451,7 +451,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2969">region</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2981">region</a></pre>
 </li>
 </ul>
 <a name="nextIndexToProcess">
@@ -460,7 +460,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nextIndexToProcess</h4>
-<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2970">nextIndexToProcess</a></pre>
+<pre>protected&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2982">nextIndexToProcess</a></pre>
 </li>
 </ul>
 <a name="observedExceptions">
@@ -469,7 +469,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>observedExceptions</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.ObservedExceptionsInBatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2971">observedExceptions</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.ObservedExceptionsInBatch</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2983">observedExceptions</a></pre>
 </li>
 </ul>
 <a name="durability">
@@ -478,7 +478,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>durability</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2973">durability</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2985">durability</a></pre>
 </li>
 </ul>
 <a name="atomic">
@@ -487,7 +487,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>atomic</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2974">atomic</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2986">atomic</a></pre>
 </li>
 </ul>
 </li>
@@ -506,7 +506,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BatchOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2976">BatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2988">BatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                       <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="type parameter in HRegion.BatchOperation">T</a>[]&nbsp;operations)</pre>
 </li>
 </ul>
@@ -524,7 +524,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>visitBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3003">visitBatchOperations</a>(boolean&nbsp;pendingOnly,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3015">visitBatchOperations</a>(boolean&nbsp;pendingOnly,
                                  int&nbsp;lastIndexExclusive,
                                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation.Visitor</a>&nbsp;visitor)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -541,7 +541,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutation</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3015">getMutation</a>(int&nbsp;index)</pre>
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3027">getMutation</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getNonceGroup-int-">
@@ -550,7 +550,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3016">getNonceGroup</a>(int&nbsp;index)</pre>
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3028">getNonceGroup</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getNonce-int-">
@@ -559,7 +559,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3017">getNonce</a>(int&nbsp;index)</pre>
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3029">getNonce</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getMutationsForCoprocs--">
@@ -568,7 +568,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutationsForCoprocs</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3019">getMutationsForCoprocs</a>()</pre>
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3031">getMutationsForCoprocs</a>()</pre>
 <div class="block">This method is potentially expensive and useful mostly for non-replay CP path.</div>
 </li>
 </ul>
@@ -578,7 +578,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isInReplay</h4>
-<pre>public abstract&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3020">isInReplay</a>()</pre>
+<pre>public abstract&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3032">isInReplay</a>()</pre>
 </li>
 </ul>
 <a name="getOrigLogSeqNum--">
@@ -587,7 +587,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3021">getOrigLogSeqNum</a>()</pre>
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3033">getOrigLogSeqNum</a>()</pre>
 </li>
 </ul>
 <a name="startRegionOperation--">
@@ -596,7 +596,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3022">startRegionOperation</a>()
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3034">startRegionOperation</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -610,7 +610,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3023">closeRegionOperation</a>()
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3035">closeRegionOperation</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -624,7 +624,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepare</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3032">checkAndPrepare</a>()
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3044">checkAndPrepare</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Validates each mutation and prepares a batch for write. If necessary (non-replay case), runs
  CP prePut()/ preDelete() hooks for all mutations in a batch. This is intended to operate on
@@ -643,7 +643,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPreparePut</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3038">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3050">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Implement any Put request specific check and prepare logic here. Please refer to
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPrepareMutation-org.apache.hadoop.hbase.client.Mutation-long-"><code>checkAndPrepareMutation(Mutation, long)</code></a> for how its used.</div>
@@ -659,7 +659,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareMiniBatchOperations</h4>
-<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3044">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3056">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                 long&nbsp;timestamp,
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -677,7 +677,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3050">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3062">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                                                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                                                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Write mini-batch operations to MemStore</div>
@@ -693,7 +693,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3054">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3066">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                   long&nbsp;writeNumber)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -708,7 +708,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3073">isDone</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3085">isDone</a>()</pre>
 </li>
 </ul>
 <a name="size--">
@@ -717,7 +717,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3077">size</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3089">size</a>()</pre>
 </li>
 </ul>
 <a name="isOperationPending-int-">
@@ -726,7 +726,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isOperationPending</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3081">isOperationPending</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3093">isOperationPending</a>(int&nbsp;index)</pre>
 </li>
 </ul>
 <a name="getClusterIds--">
@@ -735,7 +735,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getClusterIds</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3085">getClusterIds</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html?is-external=true" title="class or interface in java.util">UUID</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3097">getClusterIds</a>()</pre>
 </li>
 </ul>
 <a name="isAtomic--">
@@ -744,7 +744,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isAtomic</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3090">isAtomic</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3102">isAtomic</a>()</pre>
 </li>
 </ul>
 <a name="checkAndPrepareMutation-org.apache.hadoop.hbase.client.Mutation-long-">
@@ -753,7 +753,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepareMutation</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3100">checkAndPrepareMutation</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3112">checkAndPrepareMutation</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                                        long&nbsp;timestamp)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Helper method that checks and prepares only one mutation. This can be used to implement
@@ -772,7 +772,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepareMutation</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3112">checkAndPrepareMutation</a>(int&nbsp;index,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3124">checkAndPrepareMutation</a>(int&nbsp;index,
                                        long&nbsp;timestamp)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -787,7 +787,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lockRowsAndBuildMiniBatch</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3174">lockRowsAndBuildMiniBatch</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3186">lockRowsAndBuildMiniBatch</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Creates Mini-batch of all operations [nextIndexToProcess, lastIndexExclusive) for which
  a row lock can be acquired. All mutations with locked rows are considered to be
@@ -807,7 +807,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createMiniBatch</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3258">createMiniBatch</a>(int&nbsp;lastIndexExclusive,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3270">createMiniBatch</a>(int&nbsp;lastIndexExclusive,
                                                                  int&nbsp;readyToWriteCount)</pre>
 </li>
 </ul>
@@ -817,7 +817,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>buildWALEdits</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3268">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;m
 iniBatchOp)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3280">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;m
 iniBatchOp)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Builds separate WALEdit per nonce by applying input mutations. If WALEdits from CP are
  present, they are merged to result WALEdit.</div>
@@ -833,7 +833,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>completeMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3316">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3328">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This method completes mini-batch operations by calling postBatchMutate() CP hook (if
@@ -850,7 +850,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doPostOpCleanupForMiniBatch</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3324">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3336">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit,
                                         boolean&nbsp;success)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -866,7 +866,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>doFinishHotnessProtector</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3330">doFinishHotnessProtector</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3342">doFinishHotnessProtector</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp)</pre>
 </li>
 </ul>
 <a name="applyFamilyMapToMemStore-java.util.Map-org.apache.hadoop.hbase.regionserver.MemStoreSizing-">
@@ -875,7 +875,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>applyFamilyMapToMemStore</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3367">applyFamilyMapToMemStore</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3379">applyFamilyMapToMemStore</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreAccounting)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Atomically apply the given map of family->edits to the memstore.
@@ -896,7 +896,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>addFamilyMapToWALEdit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3383">addFamilyMapToWALEdit</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3395">addFamilyMapToWALEdit</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                                    <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit)</pre>
 <div class="block">Append the given map of family->edits to a WALEdit data structure.
  This does not write to the WAL itself.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index 59e8cb0..a004208 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5912">HRegion.BulkLoadListener</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5924">HRegion.BulkLoadListener</a></pre>
 <div class="block">Listener class to enable callers of
  bulkLoadHFile() to perform any necessary
  pre/post processing of a given bulkload call</div>
@@ -174,7 +174,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareBulkLoad</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5920">prepareBulkLoad</a>(byte[]&nbsp;family,
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5932">prepareBulkLoad</a>(byte[]&nbsp;family,
                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPath,
                        boolean&nbsp;copyFile)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -196,7 +196,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>doneBulkLoad</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5929">doneBulkLoad</a>(byte[]&nbsp;family,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5941">doneBulkLoad</a>(byte[]&nbsp;family,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPath)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Called after a successful HFile load</div>
@@ -215,7 +215,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>failedBulkLoad</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5937">failedBulkLoad</a>(byte[]&nbsp;family,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html#line.5949">failedBulkLoad</a>(byte[]&nbsp;family,
                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;srcPath)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Called after a failed HFile load</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
index 5628a8b..cd8eacf 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2140">HRegion.FlushResult.Result</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2152">HRegion.FlushResult.Result</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&gt;</pre>
 </li>
 </ul>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>FLUSHED_NO_COMPACTION_NEEDED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2141">FLUSHED_NO_COMPACTION_NEEDED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2153">FLUSHED_NO_COMPACTION_NEEDED</a></pre>
 </li>
 </ul>
 <a name="FLUSHED_COMPACTION_NEEDED">
@@ -225,7 +225,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>FLUSHED_COMPACTION_NEEDED</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2142">FLUSHED_COMPACTION_NEEDED</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2154">FLUSHED_COMPACTION_NEEDED</a></pre>
 </li>
 </ul>
 <a name="CANNOT_FLUSH_MEMSTORE_EMPTY">
@@ -234,7 +234,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>CANNOT_FLUSH_MEMSTORE_EMPTY</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2145">CANNOT_FLUSH_MEMSTORE_EMPTY</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2157">CANNOT_FLUSH_MEMSTORE_EMPTY</a></pre>
 </li>
 </ul>
 <a name="CANNOT_FLUSH">
@@ -243,7 +243,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CANNOT_FLUSH</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2146">CANNOT_FLUSH</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html#line.2158">CANNOT_FLUSH</a></pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
index ca9e949..51c5d83 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2139">HRegion.FlushResult</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.2151">HRegion.FlushResult</a></pre>
 </li>
 </ul>
 </div>
@@ -180,7 +180,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>getResult</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2150">getResult</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2162">getResult</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the detailed result code</dd>
@@ -193,7 +193,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>isFlushSucceeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2153">isFlushSucceeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2165">isFlushSucceeded</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if the memstores were flushed, else false</dd>
@@ -206,7 +206,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isCompactionNeeded</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2156">isCompactionNeeded</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#line.2168">isCompactionNeeded</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if the flush requested a compaction, else false</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
index b3aadc4..0cb1292 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.461">HRegion.FlushResultImpl</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.464">HRegion.FlushResultImpl</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a></pre>
 <div class="block">Objects from this class are created when flushing to describe all the different states that
@@ -273,7 +273,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>result</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.462">result</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.465">result</a></pre>
 </li>
 </ul>
 <a name="failureReason">
@@ -282,7 +282,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>failureReason</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.463">failureReason</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.466">failureReason</a></pre>
 </li>
 </ul>
 <a name="flushSequenceId">
@@ -291,7 +291,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>flushSequenceId</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.464">flushSequenceId</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.467">flushSequenceId</a></pre>
 </li>
 </ul>
 <a name="wroteFlushWalMarker">
@@ -300,7 +300,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>wroteFlushWalMarker</h4>
-<pre>final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.465">wroteFlushWalMarker</a></pre>
+<pre>final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.468">wroteFlushWalMarker</a></pre>
 </li>
 </ul>
 </li>
@@ -317,7 +317,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>FlushResultImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.474">FlushResultImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;result,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.477">FlushResultImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;result,
                 long&nbsp;flushSequenceId)</pre>
 <div class="block">Convenience constructor to use when the flush is successful, the failure message is set to
  null.</div>
@@ -335,7 +335,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>FlushResultImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.485">FlushResultImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;result,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.488">FlushResultImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;result,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;failureReason,
                 boolean&nbsp;wroteFlushMarker)</pre>
 <div class="block">Convenience constructor to use when we cannot flush.</div>
@@ -352,7 +352,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushResultImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.496">FlushResultImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;result,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.499">FlushResultImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;result,
                 long&nbsp;flushSequenceId,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;failureReason,
                 boolean&nbsp;wroteFlushMarker)</pre>
@@ -379,7 +379,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>isFlushSucceeded</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.510">isFlushSucceeded</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.513">isFlushSucceeded</a>()</pre>
 <div class="block">Convenience method, the equivalent of checking if result is
  FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.</div>
 <dl>
@@ -396,7 +396,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>isCompactionNeeded</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.520">isCompactionNeeded</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.523">isCompactionNeeded</a>()</pre>
 <div class="block">Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -412,7 +412,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.525">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.528">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -425,7 +425,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getResult</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.533">getResult</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult.Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html#line.536">getResult</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html#getResult--">getResult</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a></code></dd>


[08/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
index 9971079..03c8b000 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
@@ -49,1067 +49,1082 @@
 <span class="sourceLineNo">041</span>import org.apache.hadoop.fs.Path;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.htrace.core.TraceScope;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.slf4j.Logger;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.slf4j.LoggerFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The default implementation of FSWAL.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>@InterfaceAudience.Private<a name="line.66"></a>
-<span class="sourceLineNo">067</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  // IMPLEMENTATION NOTES:<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  //<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  // high writes/syncs.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  //<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // the region edit/sequence id after the append returns.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  //<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // the futures when done.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  //<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  //<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  //<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * flushed out before we exit.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private FSDataOutputStream hdfs_out;<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  // All about log rolling if not enough replicas outstanding.<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final int minTolerableReplication;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // If live datanode count is lower than the default replicas value,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private final int lowReplicationRollLimit;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // then disable the rolling in checkLowReplication().<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  // Enable it if the replications recover.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /** Number of log close errors tolerated before we abort */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private final int closeErrorsTolerated;<a name="line.146"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.htrace.core.TraceScope;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * The default implementation of FSWAL.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>@InterfaceAudience.Private<a name="line.67"></a>
+<span class="sourceLineNo">068</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  // IMPLEMENTATION NOTES:<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  //<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  // high writes/syncs.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  //<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // the region edit/sequence id after the append returns.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  //<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  //<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // the futures when done.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  //<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  //<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  //<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   */<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * flushed out before we exit.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private FSDataOutputStream hdfs_out;<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  // All about log rolling if not enough replicas outstanding.<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private final int minTolerableReplication;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private final boolean useHsync;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // If live datanode count is lower than the default replicas value,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private final int lowReplicationRollLimit;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  // then disable the rolling in checkLowReplication().<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  // Enable it if the replications recover.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.146"></a>
 <span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * using our logger instead of java native logger.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throw new RuntimeException(ex);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void handleOnStartException(Throwable ex) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      LOG.error(ex.toString(), ex);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      throw new RuntimeException(ex);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      LOG.error(ex.toString(), ex);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new RuntimeException(ex);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * Constructor.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param fs filesystem handle<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param root path for stored and archived wals<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param logDir dir where wals are stored<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf configuration to use<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  /**<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * by the time the WAL object is started up.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param fs filesystem handle<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir path to where logs and oldlogs<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param logDir dir where wals are stored<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @param archiveDir dir where wals are archived<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * @param conf configuration to use<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   *          exist.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      5);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    rollWriter();<a name="line.216"></a>
+<span class="sourceLineNo">148</span>  /** Number of log close errors tolerated before we abort */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private final int closeErrorsTolerated;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * using our logger instead of java native logger.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throw new RuntimeException(ex);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    public void handleOnStartException(Throwable ex) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.error(ex.toString(), ex);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException(ex);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(ex.toString(), ex);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new RuntimeException(ex);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Constructor.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param fs filesystem handle<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param root path for stored and archived wals<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param logDir dir where wals are stored<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param conf configuration to use<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * by the time the WAL object is started up.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param fs filesystem handle<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param rootDir path to where logs and oldlogs<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @param logDir dir where wals are stored<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param archiveDir dir where wals are archived<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param conf configuration to use<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          exist.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      5);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // put on the ring buffer.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // spinning as other strategies do.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.disruptor.getRingBuffer().next();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    this.disruptor.start();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * removed.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @return null if underlying stream is not ready.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  OutputStream getOutputStream() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Run a sync after opening to set up the pipeline.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    long startTimeNanos = System.nanoTime();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    try {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      nextWriter.sync();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    } catch (IOException e) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // optimization failed, no need to abort here.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * methods like rollWriter().<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return Writer instance<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    return writer;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @see #beforeWaitOnSafePoint()<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected void afterCreatingZigZagLatch() {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @see #afterCreatingZigZagLatch()<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  protected void beforeWaitOnSafePoint() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    writer.append(entry);<a name="line.297"></a>
+<span class="sourceLineNo">218</span>    this.useHsync = conf.getBoolean(HRegion.WAL_HSYNC_CONF_KEY, HRegion.DEFAULT_WAL_HSYNC);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // put on the ring buffer.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // spinning as other strategies do.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    this.disruptor.getRingBuffer().next();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    this.disruptor.start();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * removed.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @return null if underlying stream is not ready.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  @VisibleForTesting<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  OutputStream getOutputStream() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Run a sync after opening to set up the pipeline.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long startTimeNanos = System.nanoTime();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      nextWriter.sync(useHsync);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } catch (IOException e) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      // optimization failed, no need to abort here.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * methods like rollWriter().<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return Writer instance<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return writer;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @see #beforeWaitOnSafePoint()<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  protected void afterCreatingZigZagLatch() {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @see #afterCreatingZigZagLatch()<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  protected void beforeWaitOnSafePoint() {<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  }<a name="line.298"></a>
 <span class="sourceLineNo">299</span><a name="line.299"></a>
 <span class="sourceLineNo">300</span>  @Override<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // here; allow for that.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SyncFuture syncFuture = null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    long sequence = -1L;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.ringBufferEventHandler != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Considering below sequence<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // on safePointReleasedLatch<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      sequence = getSequenceOnRingBuffer();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    afterCreatingZigZagLatch();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    try {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      try {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        if (zigzagLatch != null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          // use assert to make sure no change breaks the logic that<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          // sequence and zigzagLatch will be set together<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence));<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      } catch (FailedSyncBeforeLogCloseException e) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        // If unflushed/unsynced entries on close, it is reason to abort.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        if (isUnflushedEntries()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          throw e;<a name="line.340"></a>
+<span class="sourceLineNo">301</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    writer.append(entry);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  @Override<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // here; allow for that.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    SyncFuture syncFuture = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    long sequence = -1L;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    if (this.ringBufferEventHandler != null) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Considering below sequence<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // on safePointReleasedLatch<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      sequence = getSequenceOnRingBuffer();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    afterCreatingZigZagLatch();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        if (zigzagLatch != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          // use assert to make sure no change breaks the logic that<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          // sequence and zigzagLatch will be set together<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence, false));<a name="line.340"></a>
 <span class="sourceLineNo">341</span>        }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        LOG.warn(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          "Failed sync-before-close but no outstanding appends; closing WAL" + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      long oldFileLen = 0L;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      // It is at the safe point. Swap out writer from under the blocked writer thread.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // TODO: This is close is inline with critical section. Should happen in background?<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      if (this.writer != null) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        oldFileLen = this.writer.getLength();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        try {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          TraceUtil.addTimelineAnnotation("closing writer");<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          this.writer.close();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          TraceUtil.addTimelineAnnotation("writer closed");<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          this.closeErrorCount.set(0);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          int errors = closeErrorCount.incrementAndGet();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (!isUnflushedEntries() &amp;&amp; (errors &lt;= this.closeErrorsTolerated)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            LOG.warn("Riding over failed WAL close of " + oldPath + ", cause=\"" + ioe.getMessage()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                + "\", errors=" + errors<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                + "; THIS FILE WAS NOT CLOSED BUT ALL EDITS SYNCED SO SHOULD BE OK");<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          } else {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            throw ioe;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        }<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      logRollAndSetupWalProps(oldPath, newPath, oldFileLen);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      this.writer = nextWriter;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (nextWriter != null &amp;&amp; nextWriter instanceof ProtobufLogWriter) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        this.hdfs_out = ((ProtobufLogWriter) nextWriter).getStream();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        this.hdfs_out = null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    } catch (InterruptedException ie) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Perpetuate the interrupt<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      Thread.currentThread().interrupt();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    } catch (IOException e) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      long count = getUnflushedEntriesCount();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      LOG.error("Failed close of WAL writer " + oldPath + ", unflushedEntries=" + count, e);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new FailedLogCloseException(oldPath + ", unflushedEntries=" + count, e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } finally {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      // Let the writer thread go regardless, whether error or not.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (zigzagLatch != null) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        zigzagLatch.releaseSafePoint();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // syncFuture will be null if we failed our wait on safe point above. Otherwise, if<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // latch was obtained successfully, the sync we threw in either trigger the latch or it<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // got stamped with an exception because the WAL was damaged and we could not sync. Now<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        // the write pipeline has been opened up again by releasing the safe point, process the<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        // syncFuture we got above. This is probably a noop but it may be stale exception from<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // when old WAL was in place. Catch it if so.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if (syncFuture != null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            blockOnSync(syncFuture);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          } catch (IOException ioe) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>              LOG.trace("Stale sync exception", ioe);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  @Override<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected void doShutdown() throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // Shutdown the disruptor. Will stop after all entries have been processed. Make sure we<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    // have stopped incoming appends before calling this else it will not shutdown. We are<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // conservative below waiting a long time and if not elapsed, then halting.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    if (this.disruptor != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      long timeoutms = conf.getLong("hbase.wal.disruptor.shutdown.timeout.ms", 60000);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        this.disruptor.shutdown(timeoutms, TimeUnit.MILLISECONDS);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      } catch (TimeoutException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        LOG.warn("Timed out bringing down disruptor after " + timeoutms + "ms; forcing halt "<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            + "(It is a problem if this is NOT an ABORT! -- DATALOSS!!!!)");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        this.disruptor.halt();<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        this.disruptor.shutdown();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (LOG.isDebugEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      LOG.debug("Closing WAL writer in " + FSUtils.getPath(walDir));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    if (this.writer != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.writer.close();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      this.writer = null;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_NULL_ON_SOME_PATH_EXCEPTION",<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      justification = "Will never be null")<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public long append(final RegionInfo hri, final WALKeyImpl key, final WALEdit edits,<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      final boolean inMemstore) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return stampSequenceIdAndPublishToRingBuffer(hri, key, edits, inMemstore,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      disruptor.getRingBuffer());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /**<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * Thread to runs the hdfs sync call. This call takes a while to complete. This is the longest<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * pole adding edits to the WAL and this must complete to be sure all edits persisted. We run<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * multiple threads sync'ng rather than one that just syncs in series so we have better latencies;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * otherwise, an edit that arrived just after a sync started, might have to wait almost the length<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * of two sync invocations before it is marked done.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * &lt;p&gt;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * When the sync completes, it marks all the passed in futures done. On the other end of the sync<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * future is a blocked thread, usually a regionserver Handler. There may be more than one future<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   * passed in the case where a few threads arrive at about the same time and all invoke 'sync'. In<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   * this case we'll batch up the invocations and run one filesystem sync only for a batch of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Handler sync invocations. Do not confuse these Handler SyncFutures with the futures an<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * ExecutorService returns when you call submit. We have no use for these in this model. These<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * SyncFutures are 'artificial', something to hold the Handler until the filesystem sync<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * completes.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private class SyncRunner extends HasThread {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    private volatile long sequence;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // Keep around last exception thrown. Clear on successful sync.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final BlockingQueue&lt;SyncFuture&gt; syncFutures;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private volatile SyncFuture takeSyncFuture = null;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    SyncRunner(final String name, final int maxHandlersCount) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      super(name);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // LinkedBlockingQueue because of<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Could use other blockingqueues here or concurrent queues.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      //<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      // We could let the capacity be 'open' but bound it so we get alerted in pathological case<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      // where we cannot sync and we have a bunch of threads all backed up waiting on their syncs<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      // to come in. LinkedBlockingQueue actually shrinks when you remove elements so Q should<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      // stay neat and tidy in usual case. Let the max size be three times the maximum handlers.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      // The passed in maxHandlerCount is the user-level handlers which is what we put up most of<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      // but HBase has other handlers running too -- opening region handlers which want to write<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      // the meta table when succesful (i.e. sync), closing handlers -- etc. These are usually<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      // much fewer in number than the user-space handlers so Q-size should be user handlers plus<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      // some space for these other handlers. Lets multiply by 3 for good-measure.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this.syncFutures = new LinkedBlockingQueue&lt;&gt;(maxHandlersCount * 3);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    void offer(final long sequence, final SyncFuture[] syncFutures, final int syncFutureCount) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Set sequence first because the add to the queue will wake the thread if sleeping.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      this.sequence = sequence;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      for (int i = 0; i &lt; syncFutureCount; ++i) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        this.syncFutures.add(syncFutures[i]);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * Release the passed &lt;code&gt;syncFuture&lt;/code&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * @return Returns 1.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    private int releaseSyncFuture(final SyncFuture syncFuture, final long currentSequence,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        final Throwable t) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!syncFuture.done(currentSequence, t)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        throw new IllegalStateException();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // This function releases one sync future only.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      return 1;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    /**<a name="line.500"></a>
-<span class="sourceLineNo">501</span>     * Release all SyncFutures whose sequence is &lt;= &lt;code&gt;currentSequence&lt;/code&gt;.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>     * @param t May be non-null if we are processing SyncFutures because an exception was thrown.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>     * @return Count of SyncFutures we let go.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>     */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    private int releaseSyncFutures(final long currentSequence, final Throwable t) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      int syncCount = 0;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      for (SyncFuture syncFuture; (syncFuture = this.syncFutures.peek()) != null;) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (syncFuture.getTxid() &gt; currentSequence) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        releaseSyncFuture(syncFuture, currentSequence, t);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        if (!this.syncFutures.remove(syncFuture)) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          throw new IllegalStateException(syncFuture.toString());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        syncCount++;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      return syncCount;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    /**<a name="line.520"></a>
-<span class="sourceLineNo">521</span>     * @param sequence The sequence we ran the filesystem sync against.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>     * @return Current highest synced sequence.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>     */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    private long updateHighestSyncedSequence(long sequence) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      long currentHighestSyncedSequence;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // Set the highestSyncedSequence IFF our current sequence id is the 'highest'.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      do {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        if (currentHighestSyncedSequence &gt;= sequence) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          // Set the sync number to current highwater mark; might be able to let go more<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // queued sync futures<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          sequence = currentHighestSyncedSequence;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          break;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } while (!highestSyncedTxid.compareAndSet(currentHighestSyncedSequence, sequence));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      return sequence;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    boolean areSyncFuturesReleased() {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // check whether there is no sync futures offered, and no in-flight sync futures that is being<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // processed.<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      return syncFutures.size() &lt;= 0<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          &amp;&amp; takeSyncFuture == null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>    @Override<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    public void run() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      long currentSequence;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      while (!isInterrupted()) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        int syncCount = 0;<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>        try {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          while (true) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>            takeSyncFuture = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>            // We have to process what we 'take' from the queue<a name="line.555"></a>
-<span class="sourceLineNo">556</span>            takeSyncFuture = this.syncFutures.take();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            currentSequence = this.sequence;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>            long syncFutureSequence = takeSyncFuture.getTxid();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>            if (syncFutureSequence &gt; currentSequence) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              throw new IllegalStateException("currentSequence=" + currentSequence<a name="line.560"></a>
-<span class="sourceLineNo">561</span>                  + ", syncFutureSequence=" + syncFutureSequence);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            // See if we can process any syncfutures BEFORE we go sync.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            long currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            if (currentSequence &lt; currentHighestSyncedSequence) {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>              syncC

<TRUNCATED>

[22/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a na

<TRUNCATED>

[15/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
index 9ee12ef..4c42811 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
@@ -51,889 +51,893 @@
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.44"></a>
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.HRegion.FlushResult;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.htrace.core.TraceScope;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * Thread that flushes cache on request<a name="line.61"></a>
-<span class="sourceLineNo">062</span> *<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * sleep time which is invariant.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * @see FlushRequester<a name="line.67"></a>
-<span class="sourceLineNo">068</span> */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>@InterfaceAudience.Private<a name="line.69"></a>
-<span class="sourceLineNo">070</span>class MemStoreFlusher implements FlushRequester {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private Configuration conf;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // These two data members go together.  Any entry in the one must have<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // a corresponding entry in the other.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private final long threadWakeFrequency;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private final HRegionServer server;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private final Object blockSignal = new Object();<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private long blockingWaitTime;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private final FlushHandler[] flushHandlers;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private FlushType flushType;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  /**<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public long getDelay(TimeUnit unit) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      return 0;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public int compareTo(Delayed o) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      return -1;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public boolean equals(Object obj) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return obj == this;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public int hashCode() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return 42;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  };<a name="line.116"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.htrace.core.TraceScope;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * Thread that flushes cache on request<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * sleep time which is invariant.<a name="line.64"></a>
+<span class="sourceLineNo">065</span> *<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * @see FlushRequester<a name="line.66"></a>
+<span class="sourceLineNo">067</span> */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>@InterfaceAudience.Private<a name="line.68"></a>
+<span class="sourceLineNo">069</span>class MemStoreFlusher implements FlushRequester {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private Configuration conf;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // These two data members go together.  Any entry in the one must have<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // a corresponding entry in the other.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final long threadWakeFrequency;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final HRegionServer server;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private final Object blockSignal = new Object();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private long blockingWaitTime;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      return 0;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
 <span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param conf<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param server<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public MemStoreFlusher(final Configuration conf,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      final HRegionServer server) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    super();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.conf = conf;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.server = server;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    this.threadWakeFrequency =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      90000);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    LOG.info("globalMemStoreLimit="<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        + TraditionalBinaryPrefix<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        + ", globalMemStoreLimitLowMark="<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        + TraditionalBinaryPrefix.long2String(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        + ", Offheap="<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    return this.updatesBlockedMsHighWater;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public void setFlushType(FlushType flushType) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.flushType = flushType;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * flush thread)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @return true if successful<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private boolean flushOneForGlobalPressure() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    switch(flushType) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        break;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      default:<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>    double secondaryMultiplier<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    boolean flushedOne = false;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    while (!flushedOne) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      HRegion bestFlushableRegion =<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // Find the biggest region that is a secondary region<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      if (bestAnyRegion == null) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        bestAnyRegion = bestRegionReplica;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return false;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>      HRegion regionToFlush;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      long bestAnyRegionSize;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      long bestFlushableRegionSize;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      switch(flushType) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          break;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          break;<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        default:<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        // life worse!<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (LOG.isDebugEnabled()) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.219"></a>
-<span class="sourceLineNo">220</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              + " has too many " + "store files, but is "<a name="line.221"></a>
-<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.222"></a>
-<span class="sourceLineNo">223</span>              + " vs best flushable region's "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + TraditionalBinaryPrefix.long2String(<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              bestFlushableRegionSize, "", 1)<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + ". Choosing the bigger.");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        regionToFlush = bestAnyRegion;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (bestFlushableRegion == null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          regionToFlush = bestAnyRegion;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          regionToFlush = bestFlushableRegion;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>      long regionToFlushSize;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      long bestRegionReplicaSize;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      switch(flushType) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          break;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          break;<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>        default:<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>      Preconditions.checkState(<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        (regionToFlush != null &amp;&amp; regionToFlushSize &gt; 0) || bestRegionReplicaSize &gt; 0);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (regionToFlush == null ||<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          (bestRegionReplica != null &amp;&amp;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.264"></a>
-<span class="sourceLineNo">265</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            TraditionalBinaryPrefix.long2String(<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (!flushedOne) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.272"></a>
-<span class="sourceLineNo">273</span>              " - trying to find a different region to refresh files.");<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          excludedRegions.add(bestRegionReplica);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      } else {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            "Flush type=" + flushType.toString() +<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            "Total Memstore Heap size=" +<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            TraditionalBinaryPrefix.long2String(<a name="line.280"></a>
-<span class="sourceLineNo">281</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            "Total Memstore Off-Heap size=" +<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
-<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            ", Region memstore size=" +<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (!flushedOne) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>              " - trying to find a different region to flush.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          excludedRegions.add(regionToFlush);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return true;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  private class FlushHandler extends HasThread {<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    private FlushHandler(String name) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      super(name);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    LOG.info("globalMemStoreLimit="<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        + TraditionalBinaryPrefix<a name="line.134"></a>
+<span class="sourceLineNo">135</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        + ", globalMemStoreLimitLowMark="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix.long2String(<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", Offheap="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    return this.updatesBlockedMsHighWater;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void setFlushType(FlushType flushType) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.flushType = flushType;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * flush thread)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @return true if successful<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private boolean flushOneForGlobalPressure() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    switch(flushType) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        break;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      default:<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    double secondaryMultiplier<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    boolean flushedOne = false;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    while (!flushedOne) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      HRegion bestFlushableRegion =<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Find the biggest region that is a secondary region<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      if (bestAnyRegion == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        bestAnyRegion = bestRegionReplica;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      if (bestAnyRegion == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return false;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>      HRegion regionToFlush;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestAnyRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      long bestFlushableRegionSize;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      switch(flushType) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          break;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          break;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>        default:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        // life worse!<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        if (LOG.isDebugEnabled()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + " has too many " + "store files, but is "<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " vs best flushable region's "<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              + TraditionalBinaryPrefix.long2String(<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              bestFlushableRegionSize, "", 1)<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              + ". Choosing the bigger.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        regionToFlush = bestAnyRegion;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      } else {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        if (bestFlushableRegion == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          regionToFlush = bestAnyRegion;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          regionToFlush = bestFlushableRegion;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long regionToFlushSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      long bestRegionReplicaSize;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      switch(flushType) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          break;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          break;<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>        default:<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return false;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (regionToFlush == null ||<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          (bestRegionReplica != null &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            TraditionalBinaryPrefix.long2String(<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        if (!flushedOne) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.276"></a>
+<span class="sourceLineNo">277</span>              " - trying to find a different region to refresh files.");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          excludedRegions.add(bestRegionReplica);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      } else {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            "Flush type=" + flushType.toString() +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            "Total Memstore Heap size=" +<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            TraditionalBinaryPrefix.long2String(<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            "Total Memstore Off-Heap size=" +<a name="line.286"></a>
+<span class="sourceLineNo">287</span>            TraditionalBinaryPrefix.long2String(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            ", Region memstore size=" +<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (!flushedOne) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.294"></a>
+<span class="sourceLineNo">295</span>              " - trying to find a different region to flush.");<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          excludedRegions.add(regionToFlush);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return true;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private class FlushHandler extends HasThread {<a name="line.324"></a>
 <span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public void run() {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      while (!server.isStopped()) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        FlushQueueEntry fqe = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>            FlushType type = isAboveLowWaterMark();<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            if (type != FlushType.NORMAL) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.337"></a>
-<span class="sourceLineNo">338</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              // we still select the regions based on the region's memstore data size.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              // it per region.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>              if (!flushOneForGlobalPressure()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                // This is unlikely to happen, but might happen when closing the<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                // entire server - another thread is flushing regions. We'll just<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                // we flushed one, so anyone blocked will check again<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                Thread.sleep(1000);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>                wakeUpIfBlocking();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.352"></a>
-<span class="sourceLineNo">353</span>              wakeupFlushThread();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          if (!flushRegion(fre)) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            break;<a name="line.359"></a>
+<span class="sourceLineNo">326</span>    private FlushHandler(String name) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      super(name);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    public void run() {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      while (!server.isStopped()) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        FlushQueueEntry fqe = null;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            FlushType type = isAboveLowWaterMark();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            if (type != FlushType.NORMAL) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // we still select the regions based on the region's memstore data size.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              // it per region.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              if (!flushOneForGlobalPressure()) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // This is unlikely to happen, but might happen when closing the<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // entire server - another thread is flushing regions. We'll just<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                // we flushed one, so anyone blocked will check again<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                Thread.sleep(1000);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                wakeUpIfBlocking();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              wakeupFlushThread();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            continue;<a name="line.359"></a>
 <span class="sourceLineNo">360</span>          }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        } catch (InterruptedException ex) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          continue;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        } catch (ConcurrentModificationException ex) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        } catch (Exception ex) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!server.checkFileSystem()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      synchronized (regionsInQueue) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>        regionsInQueue.clear();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        flushQueue.clear();<a name="line.374"></a>
+<span class="sourceLineNo">361</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          if (!flushRegion(fre)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>            break;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        } catch (InterruptedException ex) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          continue;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        } catch (ConcurrentModificationException ex) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          continue;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        } catch (Exception ex) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>          if (!server.checkFileSystem()) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>            break;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
 <span class="sourceLineNo">375</span>      }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>      // Signal anyone waiting, so they see the close flag<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      wakeUpIfBlocking();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      LOG.info(getName() + " exiting");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private void wakeupFlushThread() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private HRegion getBiggestMemStoreRegion(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      boolean checkStoreFileCount) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    synchronized (regionsInQueue) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        for (HRegion region : entry.getValue()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          if (excludedRegions.contains(region)) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            continue;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.401"></a>
+<span class="sourceLineNo">376</span>      synchronized (regionsInQueue) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        regionsInQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        flushQueue.clear();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>      // Signal anyone waiting, so they see the close flag<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      wakeUpIfBlocking();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      LOG.info(getName() + " exiting");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private void wakeupFlushThread() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private HRegion getBiggestMemStoreRegion(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      boolean checkStoreFileCount) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    synchronized (regionsInQueue) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        for (HRegion region : entry.getValue()) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          if (excludedRegions.contains(region)) {<a name="line.401"></a>
 <span class="sourceLineNo">402</span>            continue;<a name="line.402"></a>
 <span class="sourceLineNo">403</span>          }<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.405"></a>
+<span class="sourceLineNo">405</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.405"></a>
 <span class="sourceLineNo">406</span>            continue;<a name="line.406"></a>
 <span class="sourceLineNo">407</span>          }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          return region;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return null;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    synchronized (regionsInQueue) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        for (HRegion region : entry.getValue()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (excludedRegions.contains(region)) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.425"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            continue;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          return region;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return null;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    synchronized (regionsInQueue) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        for (HRegion region : entry.getValue()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          if (excludedRegions.contains(region)) {<a name="line.425"></a>
 <span class="sourceLineNo">426</span>            continue;<a name="line.426"></a>
 <span class="sourceLineNo">427</span>          }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return region;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    return null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    try {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      return region.refreshStoreFiles();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    } catch (IOException e) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return false;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  /**<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * Return true if global memory usage is above the high watermark<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private FlushType isAboveHighWaterMark() {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Return true if we're above the low watermark<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private FlushType isAboveLowWaterMark() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    r.incrementFlushesQueuedCount();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    synchronized (regionsInQueue) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        // queue. It'll come out near immediately.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        this.regionsInQueue.put(r, fqe);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        this.flushQueue.add(fqe);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    r.incrementFlushesQueuedCount();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    synchronized (regionsInQueue) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        // This entry has some delay<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        FlushRegionEntry fqe =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        fqe.requeue(delay);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        this.regionsInQueue.put(r, fqe);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        this.flushQueue.add(fqe);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public int getFlushQueueSize() {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return flushQueue.size();<a name="line.490"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            continue;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return region;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    try {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      return region.refreshStoreFiles();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    } catch (IOException e) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return false;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * Return true if global memory usage is above the high watermark<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private FlushType isAboveHighWaterMark() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * Return true if we're above the low watermark<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private FlushType isAboveLowWaterMark() {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    r.incrementFlushesQueuedCount();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (regionsInQueue) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        // queue. It'll come out near immediately.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.regionsInQueue.put(r, fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        this.flushQueue.add(fqe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      } else {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  @Override<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    r.incrementFlushesQueuedCount();<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    synchronized (regionsInQueue) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        // This entry has some delay<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushRegionEntry fqe =<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        fqe.requeue(delay);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        this.regionsInQueue.put(r, fqe);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.flushQueue.add(fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
 <span class="sourceLineNo">491</span>  }<a name="line.491"></a>
 <span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /**<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  void interruptIfNecessary() {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    lock.writeLock().lock();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    try {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        if (flushHander != null) flushHander.interrupt();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    } finally {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      lock.writeLock().unlock();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.510"></a>
-<span class="s

<TRUNCATED>

[32/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a na

<TRUNCATED>

[45/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index 5066d3e..02f787d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -121,7 +121,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6166">HRegion.RegionScannerImpl</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.6178">HRegion.RegionScannerImpl</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>, <a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html" title="interface in org.apache.hadoop.hbase.regionserver">Shipper</a>, <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html" title="interface in org.apache.hadoop.hbase.ipc">RpcCallback</a></pre>
 <div class="block">RegionScannerImpl is used to combine scanners from multiple Stores (aka column families).</div>
@@ -425,7 +425,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>storeHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6169">storeHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6181">storeHeap</a></pre>
 </li>
 </ul>
 <a name="joinedHeap">
@@ -434,7 +434,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeap</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6172">joinedHeap</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6184">joinedHeap</a></pre>
 <div class="block">Heap of key-values that are not essential for the provided filters and are thus read
  on demand, if on-demand column family loading is enabled.</div>
 </li>
@@ -445,7 +445,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedContinuationRow</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6176">joinedContinuationRow</a></pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6188">joinedContinuationRow</a></pre>
 <div class="block">If the joined heap data gathering is interrupted due to scan limits, this will
  contain the row for which we are populating the values.</div>
 </li>
@@ -456,7 +456,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterClosed</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6177">filterClosed</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6189">filterClosed</a></pre>
 </li>
 </ul>
 <a name="stopRow">
@@ -465,7 +465,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>stopRow</h4>
-<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6179">stopRow</a></pre>
+<pre>protected final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6191">stopRow</a></pre>
 </li>
 </ul>
 <a name="includeStopRow">
@@ -474,7 +474,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>includeStopRow</h4>
-<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6180">includeStopRow</a></pre>
+<pre>protected final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6192">includeStopRow</a></pre>
 </li>
 </ul>
 <a name="region">
@@ -483,7 +483,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6181">region</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6193">region</a></pre>
 </li>
 </ul>
 <a name="comparator">
@@ -492,7 +492,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>comparator</h4>
-<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6182">comparator</a></pre>
+<pre>protected final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6194">comparator</a></pre>
 </li>
 </ul>
 <a name="readPt">
@@ -501,7 +501,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>readPt</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6184">readPt</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6196">readPt</a></pre>
 </li>
 </ul>
 <a name="maxResultSize">
@@ -510,7 +510,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>maxResultSize</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6185">maxResultSize</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6197">maxResultSize</a></pre>
 </li>
 </ul>
 <a name="defaultScannerContext">
@@ -519,7 +519,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>defaultScannerContext</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6186">defaultScannerContext</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6198">defaultScannerContext</a></pre>
 </li>
 </ul>
 <a name="filter">
@@ -528,7 +528,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>filter</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6187">filter</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.html" title="class in org.apache.hadoop.hbase.filter">FilterWrapper</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6199">filter</a></pre>
 </li>
 </ul>
 </li>
@@ -545,7 +545,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>RegionScannerImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6194">RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6206">RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;additionalScanners,
                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -561,7 +561,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionScannerImpl</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6199">RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6211">RegionScannerImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;additionalScanners,
                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                   long&nbsp;nonceGroup,
@@ -587,7 +587,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionInfo</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6190">getRegionInfo</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6202">getRegionInfo</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getRegionInfo--">getRegionInfo</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -602,7 +602,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeScanners</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6237">initializeScanners</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6249">initializeScanners</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Scan.html" title="class in org.apache.hadoop.hbase.client">Scan</a>&nbsp;scan,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;additionalScanners)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -617,7 +617,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeKVHeap</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6269">initializeKVHeap</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6281">initializeKVHeap</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;scanners,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;joinedScanners,
                                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region)
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -633,7 +633,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>handleException</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6278">handleException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;instantiatedScanners,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6290">handleException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;instantiatedScanners,
                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</pre>
 </li>
 </ul>
@@ -643,7 +643,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxResultSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6299">getMaxResultSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6311">getMaxResultSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMaxResultSize--">getMaxResultSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -659,7 +659,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getMvccReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6304">getMvccReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6316">getMvccReadPoint</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getMvccReadPoint--">getMvccReadPoint</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -674,7 +674,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getBatch</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6309">getBatch</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6321">getBatch</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#getBatch--">getBatch</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a></code></dd>
@@ -690,7 +690,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>resetFilters</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6318">resetFilters</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6330">resetFilters</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Reset both the filter and the old filter.</div>
 <dl>
@@ -705,7 +705,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6325">next</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6337">next</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#next-java.util.List-">InternalScanner</a></code></span></div>
 <div class="block">Grab the next row's worth of values.</div>
@@ -727,7 +727,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6332">next</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6344">next</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#next-java.util.List-org.apache.hadoop.hbase.regionserver.ScannerContext-">InternalScanner</a></code></span></div>
@@ -750,7 +750,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6348">nextRaw</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6360">nextRaw</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#nextRaw-java.util.List-">RegionScanner</a></code></span></div>
 <div class="block">Grab the next row's worth of values. This is a special internal method to be called from
@@ -775,7 +775,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRaw</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6354">nextRaw</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6366">nextRaw</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;outResults,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#nextRaw-java.util.List-org.apache.hadoop.hbase.regionserver.ScannerContext-">RegionScanner</a></code></span></div>
@@ -821,7 +821,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateFromJoinedHeap</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6391">populateFromJoinedHeap</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6403">populateFromJoinedHeap</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -838,7 +838,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>populateResult</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6415">populateResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6427">populateResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                                <a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;heap,
                                <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
                                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
@@ -863,7 +863,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>moreCellsInRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6456">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6468">moreCellsInRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;nextKv,
                                <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 <div class="block">Based on the nextKv in the heap, and the current row, decide whether or not there are more
  cells to be read in the heap. If the row of the nextKv in the heap matches the current row
@@ -883,7 +883,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDone</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6464">isFilterDone</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6476">isFilterDone</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -901,7 +901,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterDoneInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6468">isFilterDoneInternal</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6480">isFilterDoneInternal</a>()
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -915,7 +915,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextInternal</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6472">nextInternal</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6484">nextInternal</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;results,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -930,7 +930,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsFilteredMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6695">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6707">incrementCountOfRowsFilteredMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="incrementCountOfRowsScannedMetric-org.apache.hadoop.hbase.regionserver.ScannerContext-">
@@ -939,7 +939,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCountOfRowsScannedMetric</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6703">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6715">incrementCountOfRowsScannedMetric</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext)</pre>
 </li>
 </ul>
 <a name="joinedHeapMayHaveData-org.apache.hadoop.hbase.Cell-">
@@ -948,7 +948,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>joinedHeapMayHaveData</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6714">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6726">joinedHeapMayHaveData</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -966,7 +966,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRow</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6741">filterRow</a>()
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6753">filterRow</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This function is to maintain backward compatibility for 0.94 filters. HBASE-6429 combines
  both filterRow & filterRow(<code>List&lt;KeyValue&gt; kvs</code>) functions. While 0.94 code or older,
@@ -985,7 +985,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>filterRowKey</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6748">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6760">filterRowKey</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;current)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -999,7 +999,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRow</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6752">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6764">nextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.html" title="class in org.apache.hadoop.hbase.regionserver">ScannerContext</a>&nbsp;scannerContext,
                           <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;curRowCell)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -1014,7 +1014,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldStop</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6767">shouldStop</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6779">shouldStop</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentRowCell)</pre>
 </li>
 </ul>
 <a name="close--">
@@ -1023,7 +1023,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6779">close</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6791">close</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/InternalScanner.html#close--">InternalScanner</a></code></span></div>
 <div class="block">Closes the scanner and releases any resources it has allocated</div>
 <dl>
@@ -1042,7 +1042,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreHeapForTesting</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6793">getStoreHeapForTesting</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueHeap.html" title="class in org.apache.hadoop.hbase.regionserver">KeyValueHeap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6805">getStoreHeapForTesting</a>()</pre>
 </li>
 </ul>
 <a name="reseek-byte:A-">
@@ -1051,7 +1051,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>reseek</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6798">reseek</a>(byte[]&nbsp;row)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6810">reseek</a>(byte[]&nbsp;row)
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html#reseek-byte:A-">RegionScanner</a></code></span></div>
 <div class="block">Do a reseek to the required row. Should not be used to seek to a key which
@@ -1071,7 +1071,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockList">
 <li class="blockList">
 <h4>shipped</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6818">shipped</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6830">shipped</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Shipper.html#shipped--">Shipper</a></code></span></div>
 <div class="block">Called after a batch of rows scanned and set to be returned to client. Any in between cleanup
@@ -1090,7 +1090,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSc
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6828">run</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html#line.6840">run</a>()
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallback.html#run--">RpcCallback</a></code></span></div>
 <div class="block">Called at the end of an Rpc Call <a href="../../../../../org/apache/hadoop/hbase/ipc/RpcCallContext.html" title="interface in org.apache.hadoop.hbase.ipc"><code>RpcCallContext</code></a></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
index cf1fa2a..cc4d0a3 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3712">HRegion.ReplayBatchOperation</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3724">HRegion.ReplayBatchOperation</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</pre>
 <div class="block">Batch of mutations for replay. Base class is shared with <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver"><code>HRegion.MutationBatchOperation</code></a> as most
  of the logic is same.</div>
@@ -306,7 +306,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>origLogSeqNum</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3713">origLogSeqNum</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3725">origLogSeqNum</a></pre>
 </li>
 </ul>
 </li>
@@ -323,7 +323,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ReplayBatchOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3714">ReplayBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3726">ReplayBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                             <a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>[]&nbsp;operations,
                             long&nbsp;origLogSeqNum)</pre>
 </li>
@@ -342,7 +342,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutation</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3721">getMutation</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3733">getMutation</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutation-int-">getMutation</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -355,7 +355,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3726">getNonceGroup</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3738">getNonceGroup</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonceGroup-int-">getNonceGroup</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -368,7 +368,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3731">getNonce</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3743">getNonce</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonce-int-">getNonce</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -381,7 +381,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutationsForCoprocs</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3736">getMutationsForCoprocs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3748">getMutationsForCoprocs</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutationsForCoprocs--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">This method is potentially expensive and useful mostly for non-replay CP path.</div>
 <dl>
@@ -396,7 +396,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>isInReplay</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3741">isInReplay</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3753">isInReplay</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#isInReplay--">isInReplay</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -409,7 +409,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3746">getOrigLogSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3758">getOrigLogSeqNum</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getOrigLogSeqNum--">getOrigLogSeqNum</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALSplitter.MutationReplay.html" title="class in org.apache.hadoop.hbase.wal">WALSplitter.MutationReplay</a>&gt;</code></dd>
@@ -422,7 +422,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3751">startRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3763">startRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -438,7 +438,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3756">closeRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3768">closeRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -454,7 +454,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPreparePut</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3765">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3777">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">During replay, there could exist column families which are removed between region server
  failure and replay</div>
@@ -472,7 +472,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepare</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3786">checkAndPrepare</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3798">checkAndPrepare</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPrepare--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Validates each mutation and prepares a batch for write. If necessary (non-replay case), runs
@@ -494,7 +494,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3795">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3807">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                        long&nbsp;timestamp,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -515,7 +515,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3807">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3819">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                                                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#writeMiniBatchOperationsToMemStore-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">HRegion.BatchOperation</a></code></span></div>
@@ -534,7 +534,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>completeMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3815">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html#line.3827">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#completeMiniBatchOperations-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">HRegion.BatchOperation</a></code></span></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
index bc0aedf..90d7b92 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5774">HRegion.RowLockContext</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5786">HRegion.RowLockContext</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -241,7 +241,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>row</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5775">row</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5787">row</a></pre>
 </li>
 </ul>
 <a name="readWriteLock">
@@ -250,7 +250,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readWriteLock</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5776">readWriteLock</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5788">readWriteLock</a></pre>
 </li>
 </ul>
 <a name="usable">
@@ -259,7 +259,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>usable</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5777">usable</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5789">usable</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -268,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>count</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5778">count</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5790">count</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5779">lock</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5791">lock</a></pre>
 </li>
 </ul>
 <a name="threadName">
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>threadName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5780">threadName</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5792">threadName</a></pre>
 </li>
 </ul>
 </li>
@@ -303,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RowLockContext</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5782">RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5794">RowLockContext</a>(<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>&nbsp;row)</pre>
 </li>
 </ul>
 </li>
@@ -320,7 +320,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>newWriteLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5786">newWriteLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5798">newWriteLock</a>()</pre>
 </li>
 </ul>
 <a name="newReadLock--">
@@ -329,7 +329,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>newReadLock</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5790">newReadLock</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5802">newReadLock</a>()</pre>
 </li>
 </ul>
 <a name="getRowLock-java.util.concurrent.locks.Lock-">
@@ -338,7 +338,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowLock</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5795">getRowLock</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5807">getRowLock</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;l)</pre>
 </li>
 </ul>
 <a name="cleanUp--">
@@ -347,7 +347,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanUp</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5806">cleanUp</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5818">cleanUp</a>()</pre>
 </li>
 </ul>
 <a name="setThreadName-java.lang.String-">
@@ -356,7 +356,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setThreadName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5819">setThreadName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;threadName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5831">setThreadName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;threadName)</pre>
 </li>
 </ul>
 <a name="toString--">
@@ -365,7 +365,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5824">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html#line.5836">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index 9e882a0..d080a2b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5837">HRegion.RowLockImpl</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.5849">HRegion.RowLockImpl</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a></pre>
 <div class="block">Class used to represent a lock on a row.</div>
@@ -226,7 +226,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>context</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5838">context</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5850">context</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -235,7 +235,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5839">lock</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5851">lock</a></pre>
 </li>
 </ul>
 </li>
@@ -252,7 +252,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RowLockImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5841">RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5853">RowLockImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;context,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;lock)</pre>
 </li>
 </ul>
@@ -270,7 +270,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getLock</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5846">getLock</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html?is-external=true" title="class or interface in java.util.concurrent.locks">Lock</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5858">getLock</a>()</pre>
 </li>
 </ul>
 <a name="getContext--">
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>getContext</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5851">getContext</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5863">getContext</a>()</pre>
 </li>
 </ul>
 <a name="release--">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockList">
 <li class="blockList">
 <h4>release</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5856">release</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5868">release</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html#release--">Region.RowLock</a></code></span></div>
 <div class="block">Release the given lock.  If there are no remaining locks held by the current thread
  then unlock the row and allow other threads to acquire the lock.</div>
@@ -304,7 +304,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.R
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5862">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html#line.5874">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>


[51/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.


Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/6eb695c8
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/6eb695c8
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/6eb695c8

Branch: refs/heads/asf-site
Commit: 6eb695c8b89c468352c98e450c3c799606b0222d
Parents: 4e1efd6
Author: jenkins <bu...@apache.org>
Authored: Wed Mar 21 14:53:41 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Wed Mar 21 14:53:41 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 .../apache/hadoop/hbase/client/Durability.html  |     3 +-
 .../apache/hadoop/hbase/client/Durability.html  |     9 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 26294 +++++++++--------
 checkstyle.rss                                  |    40 +-
 coc.html                                        |     4 +-
 cygwin.html                                     |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     4 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |     4 +-
 devapidocs/constant-values.html                 |    32 +-
 devapidocs/index-all.html                       |    30 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../apache/hadoop/hbase/client/Durability.html  |     3 +-
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../hadoop/hbase/filter/package-tree.html       |    10 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     8 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     4 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 .../master/procedure/RecoverMetaProcedure.html  |    30 +-
 .../hbase/master/procedure/package-tree.html    |     2 +-
 .../hadoop/hbase/monitoring/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    16 +-
 .../procedure2/StateMachineProcedure.Flow.html  |    10 +-
 .../hbase/procedure2/StateMachineProcedure.html |    46 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hadoop/hbase/quotas/package-tree.html       |     6 +-
 ...ompactingMemStore.InMemoryFlushRunnable.html |     6 +-
 .../hbase/regionserver/CompactingMemStore.html  |    70 +-
 .../HRegion.BatchOperation.Visitor.html         |     4 +-
 .../regionserver/HRegion.BatchOperation.html    |    80 +-
 .../regionserver/HRegion.BulkLoadListener.html  |     8 +-
 .../HRegion.FlushResult.Result.html             |    10 +-
 .../hbase/regionserver/HRegion.FlushResult.html |     8 +-
 .../regionserver/HRegion.FlushResultImpl.html   |    24 +-
 .../HRegion.MutationBatchOperation.html         |    44 +-
 .../HRegion.ObservedExceptionsInBatch.html      |    22 +-
 .../HRegion.PrepareFlushResult.html             |    26 +-
 .../regionserver/HRegion.RegionScannerImpl.html |    90 +-
 .../HRegion.ReplayBatchOperation.html           |    32 +-
 .../regionserver/HRegion.RowLockContext.html    |    28 +-
 .../hbase/regionserver/HRegion.RowLockImpl.html |    16 +-
 .../hbase/regionserver/HRegion.WriteState.html  |    26 +-
 .../hadoop/hbase/regionserver/HRegion.html      |   864 +-
 .../MemStoreFlusher.FlushHandler.html           |     6 +-
 .../MemStoreFlusher.FlushQueueEntry.html        |     2 +-
 .../MemStoreFlusher.FlushRegionEntry.html       |    36 +-
 .../hbase/regionserver/MemStoreFlusher.html     |    96 +-
 .../hadoop/hbase/regionserver/package-tree.html |    20 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/AbstractFSWAL.html   |     2 +-
 .../hbase/regionserver/wal/AsyncFSWAL.html      |     7 +
 .../wal/FSHLog.RingBufferEventHandler.html      |    38 +-
 .../wal/FSHLog.RingBufferExceptionHandler.html  |    10 +-
 .../wal/FSHLog.SafePointZigZagLatch.html        |    18 +-
 .../regionserver/wal/FSHLog.SyncRunner.html     |    22 +-
 .../hadoop/hbase/regionserver/wal/FSHLog.html   |   144 +-
 .../regionserver/wal/ProtobufLogWriter.html     |    18 +-
 .../wal/SecureProtobufLogWriter.html            |     2 +-
 .../hbase/regionserver/wal/SyncFuture.html      |    71 +-
 .../regionserver/wal/class-use/SyncFuture.html  |    11 +-
 .../hbase/regionserver/wal/package-tree.html    |     2 +-
 .../replication/ZKReplicationQueueStorage.html  |    97 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hbase/security/access/package-tree.html     |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hadoop/hbase/thrift/package-tree.html       |     2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    10 +-
 .../wal/DisabledWALProvider.DisabledWAL.html    |     7 +
 .../hadoop/hbase/wal/FSHLogProvider.Writer.html |     2 +-
 .../org/apache/hadoop/hbase/wal/WAL.Entry.html  |    18 +-
 .../org/apache/hadoop/hbase/wal/WAL.Reader.html |    12 +-
 devapidocs/org/apache/hadoop/hbase/wal/WAL.html |    73 +-
 .../hadoop/hbase/wal/WALProvider.Writer.html    |     6 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     6 +-
 .../apache/hadoop/hbase/client/Durability.html  |     9 +-
 .../cleaner/HFileCleaner.HFileDeleteTask.html   |     6 +-
 .../hbase/master/cleaner/HFileCleaner.html      |     6 +-
 .../master/procedure/RecoverMetaProcedure.html  |   361 +-
 .../procedure2/StateMachineProcedure.Flow.html  |   489 +-
 .../hbase/procedure2/StateMachineProcedure.html |   489 +-
 .../regionserver/ChunkCreator.ChunkType.html    |     6 +-
 ...ator.MemStoreChunkPool.StatisticsThread.html |     6 +-
 .../ChunkCreator.MemStoreChunkPool.html         |     6 +-
 .../hadoop/hbase/regionserver/ChunkCreator.html |     6 +-
 ...ompactingMemStore.InMemoryFlushRunnable.html |   767 +-
 .../CompactingMemStore.IndexType.html           |   767 +-
 .../hbase/regionserver/CompactingMemStore.html  |   767 +-
 .../hbase/regionserver/DefaultStoreFlusher.html |    15 +-
 .../HRegion.BatchOperation.Visitor.html         | 16447 +++++------
 .../regionserver/HRegion.BatchOperation.html    | 16447 +++++------
 .../regionserver/HRegion.BulkLoadListener.html  | 16447 +++++------
 .../HRegion.FlushResult.Result.html             | 16447 +++++------
 .../hbase/regionserver/HRegion.FlushResult.html | 16447 +++++------
 .../regionserver/HRegion.FlushResultImpl.html   | 16447 +++++------
 .../HRegion.MutationBatchOperation.html         | 16447 +++++------
 .../HRegion.ObservedExceptionsInBatch.html      | 16447 +++++------
 .../HRegion.PrepareFlushResult.html             | 16447 +++++------
 .../regionserver/HRegion.RegionScannerImpl.html | 16447 +++++------
 .../HRegion.ReplayBatchOperation.html           | 16447 +++++------
 .../regionserver/HRegion.RowLockContext.html    | 16447 +++++------
 .../hbase/regionserver/HRegion.RowLockImpl.html | 16447 +++++------
 .../hbase/regionserver/HRegion.WriteState.html  | 16447 +++++------
 .../hadoop/hbase/regionserver/HRegion.html      | 16447 +++++------
 .../hbase/regionserver/HRegionFileSystem.html   |     2 +-
 .../HRegionServer.CompactionChecker.html        |     4 +-
 .../HRegionServer.MovedRegionInfo.html          |     4 +-
 .../HRegionServer.MovedRegionsCleaner.html      |     4 +-
 .../HRegionServer.PeriodicMemStoreFlusher.html  |     4 +-
 .../hbase/regionserver/HRegionServer.html       |     4 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |     2 +-
 .../hadoop/hbase/regionserver/HStore.html       |     2 +-
 .../MemStoreFlusher.FlushHandler.html           |  1734 +-
 .../MemStoreFlusher.FlushQueueEntry.html        |  1734 +-
 .../MemStoreFlusher.FlushRegionEntry.html       |  1734 +-
 .../hbase/regionserver/MemStoreFlusher.html     |  1734 +-
 .../handler/CloseRegionHandler.html             |    55 +-
 .../wal/FSHLog.RingBufferEventHandler.html      |  2103 +-
 .../wal/FSHLog.RingBufferExceptionHandler.html  |  2103 +-
 .../wal/FSHLog.SafePointZigZagLatch.html        |  2103 +-
 .../regionserver/wal/FSHLog.SyncRunner.html     |  2103 +-
 .../hadoop/hbase/regionserver/wal/FSHLog.html   |  2103 +-
 .../regionserver/wal/ProtobufLogWriter.html     |    79 +-
 .../hbase/regionserver/wal/SyncFuture.html      |   187 +-
 .../replication/ZKReplicationQueueStorage.html  |  1020 +-
 .../org/apache/hadoop/hbase/wal/WAL.Entry.html  |   287 +-
 .../org/apache/hadoop/hbase/wal/WAL.Reader.html |   287 +-
 .../org/apache/hadoop/hbase/wal/WAL.html        |   287 +-
 .../hbase/wal/WALProvider.AsyncWriter.html      |     2 +-
 .../hadoop/hbase/wal/WALProvider.Writer.html    |     2 +-
 .../hbase/wal/WALProvider.WriterBase.html       |     2 +-
 .../apache/hadoop/hbase/wal/WALProvider.html    |     2 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/allclasses-frame.html            |     2 +
 testdevapidocs/allclasses-noframe.html          |     2 +
 testdevapidocs/constant-values.html             |    19 +
 testdevapidocs/index-all.html                   |    60 +-
 ...cing.BlockCompactionsInCompletionRegion.html |     2 +-
 ...tIOFencing.BlockCompactionsInPrepRegion.html |     2 +-
 .../TestIOFencing.CompactionBlockerRegion.html  |     2 +-
 .../hbase/class-use/HBaseClassTestRule.html     |    56 +-
 .../hbase/class-use/HBaseTestingUtility.html    |    24 +-
 ...stFromClientSideScanExcpetion.MyHRegion.html |     2 +-
 ...ook.CompactionCompletionNotifyingRegion.html |     2 +-
 ...FilesEndpoint.HRegionForRefreshHFilesEP.html |     2 +-
 .../master/TestAssignmentManagerMetrics.html    |     2 +-
 .../procedure/TestProcedurePriority.MyCP.html   |     4 +-
 .../procedure/TestRecoverMetaProcedure.html     |   406 +
 .../procedure/TestRestoreSnapshotProcedure.html |     4 +-
 .../class-use/TestRecoverMetaProcedure.html     |   125 +
 .../hbase/master/procedure/package-frame.html   |     1 +
 .../hbase/master/procedure/package-summary.html |    16 +-
 .../hbase/master/procedure/package-tree.html    |     1 +
 .../org/apache/hadoop/hbase/package-tree.html   |    10 +-
 .../hadoop/hbase/procedure/package-tree.html    |     8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../TestAtomicOperation.MockHRegion.html        |     2 +-
 .../TestHRegion.HRegionForTesting.html          |     2 +-
 .../TestHRegion.HRegionWithSeqId.html           |     2 +-
 ...tRegionServerAbort.ErrorThrowingHRegion.html |     2 +-
 ...annerHeartbeatMessages.HeartbeatHRegion.html |     2 +-
 .../regionserver/TestWALLockup.DodgyFSLog.html  |     2 +-
 .../hadoop/hbase/regionserver/package-tree.html |     6 +-
 .../wal/AbstractTestWALReplay.MockWAL.html      |     2 +-
 ...gRollingNoCluster.HighLatencySyncWriter.html |     6 +-
 .../wal/TestWALCellCodecWithCompression.html    |     4 +-
 .../regionserver/wal/TestWALDurability.html     |   467 +
 .../hbase/regionserver/wal/TestWALReplay.html   |     4 +-
 .../wal/class-use/TestWALDurability.html        |   125 +
 .../hbase/regionserver/wal/package-frame.html   |     1 +
 .../hbase/regionserver/wal/package-summary.html |    10 +-
 .../hbase/regionserver/wal/package-tree.html    |     1 +
 .../replication/TestReplicationStateBasic.html  |     6 +-
 .../TestZKReplicationQueueStorage.html          |    54 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     2 +-
 .../apache/hadoop/hbase/wal/FaultyFSLog.html    |    30 +-
 .../hbase/wal/IOTestProvider.IOTestWAL.html     |     2 +-
 .../hbase/wal/IOTestProvider.IOTestWriter.html  |     6 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     2 +-
 testdevapidocs/overview-tree.html               |     2 +
 .../master/TestAssignmentManagerMetrics.html    |   113 +-
 .../procedure/TestRecoverMetaProcedure.html     |   181 +
 .../regionserver/TestFailedAppendAndSync.html   |     4 +-
 .../regionserver/TestHRegion.Appender.html      |     4 +-
 .../regionserver/TestHRegion.FlushThread.html   |     4 +-
 .../TestHRegion.GetTillDoneOrException.html     |     4 +-
 .../TestHRegion.HRegionForTesting.html          |     4 +-
 .../TestHRegion.HRegionWithSeqId.html           |     4 +-
 .../TestHRegion.HStoreForTesting.html           |     4 +-
 .../regionserver/TestHRegion.Incrementer.html   |     4 +-
 .../TestHRegion.IsFlushWALMarker.html           |     4 +-
 .../regionserver/TestHRegion.PutThread.html     |     4 +-
 .../hadoop/hbase/regionserver/TestHRegion.html  |     4 +-
 .../regionserver/TestWALLockup.DodgyFSLog.html  |    12 +-
 .../regionserver/TestWALLockup.DummyServer.html |    12 +-
 .../TestWALLockup.DummyWALActionsListener.html  |    12 +-
 .../hbase/regionserver/TestWALLockup.html       |    12 +-
 ...bstractTestWALReplay.CustomStoreFlusher.html |     2 +-
 .../wal/AbstractTestWALReplay.MockWAL.html      |     2 +-
 .../wal/AbstractTestWALReplay.TestFlusher.html  |     2 +-
 .../regionserver/wal/AbstractTestWALReplay.html |     2 +-
 .../wal/TestLogRollingNoCluster.Appender.html   |     4 +-
 ...gRollingNoCluster.HighLatencySyncWriter.html |     4 +-
 .../wal/TestLogRollingNoCluster.html            |     4 +-
 .../hbase/regionserver/wal/TestProtobufLog.html |     2 +-
 .../regionserver/wal/TestWALDurability.html     |   233 +
 ...icationSource.ShutdownDelayRegionServer.html |     2 +-
 .../replication/TestReplicationSource.html      |     2 +-
 .../replication/TestReplicationStateBasic.html  |   155 +-
 ...ialReplication.LocalReplicationEndpoint.html |     2 +-
 .../replication/TestSerialReplication.html      |     2 +-
 .../TestZKReplicationQueueStorage.html          |   438 +-
 .../hbase/wal/FaultyFSLog.FailureType.html      |    37 +-
 .../apache/hadoop/hbase/wal/FaultyFSLog.html    |    37 +-
 .../wal/IOTestProvider.AllowedOperations.html   |     4 +-
 .../hbase/wal/IOTestProvider.IOTestWAL.html     |     4 +-
 .../hbase/wal/IOTestProvider.IOTestWriter.html  |     4 +-
 .../apache/hadoop/hbase/wal/IOTestProvider.html |     4 +-
 .../hbase/wal/TestWALSplit.Corruptions.html     |     6 +-
 ...ALSplit.ZombieLastLogWriterRegionServer.html |     6 +-
 .../apache/hadoop/hbase/wal/TestWALSplit.html   |     6 +-
 247 files changed, 152060 insertions(+), 149691 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index e9e10da..ca97afc 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -594,7 +594,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 75f2999..bbe2fbb 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180320144638+00'00')
-/CreationDate (D:20180320144638+00'00')
+/ModDate (D:20180321144703+00'00')
+/CreationDate (D:20180321144703+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/apidocs/org/apache/hadoop/hbase/client/Durability.html
----------------------------------------------------------------------
diff --git a/apidocs/org/apache/hadoop/hbase/client/Durability.html b/apidocs/org/apache/hadoop/hbase/client/Durability.html
index 881a984..7f56f9e 100644
--- a/apidocs/org/apache/hadoop/hbase/client/Durability.html
+++ b/apidocs/org/apache/hadoop/hbase/client/Durability.html
@@ -273,9 +273,8 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FSYNC_WAL</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Durability.html#line.56">FSYNC_WAL</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Durability.html#line.55">FSYNC_WAL</a></pre>
 <div class="block">Write the Mutation to the WAL synchronously and force the entries to disk.
- (Note: this is currently not supported and will behave identical to <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html#SYNC_WAL"><code>SYNC_WAL</code></a>)
  See <a href="https://issues.apache.org/jira/browse/HADOOP-6313">HADOOP-6313</a></div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/apidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
----------------------------------------------------------------------
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/client/Durability.html b/apidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
index fe0fb30..0cdca93 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
@@ -58,11 +58,10 @@
 <span class="sourceLineNo">050</span>  SYNC_WAL,<a name="line.50"></a>
 <span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
 <span class="sourceLineNo">052</span>   * Write the Mutation to the WAL synchronously and force the entries to disk.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   * (Note: this is currently not supported and will behave identical to {@link #SYNC_WAL})<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   * See &lt;a href="https://issues.apache.org/jira/browse/HADOOP-6313"&gt;HADOOP-6313&lt;/a&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   */<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  FSYNC_WAL<a name="line.56"></a>
-<span class="sourceLineNo">057</span>}<a name="line.57"></a>
+<span class="sourceLineNo">053</span>   * See &lt;a href="https://issues.apache.org/jira/browse/HADOOP-6313"&gt;HADOOP-6313&lt;/a&gt;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  FSYNC_WAL<a name="line.55"></a>
+<span class="sourceLineNo">056</span>}<a name="line.56"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 6319c1e..27131f0 100644
--- a/book.html
+++ b/book.html
@@ -37288,7 +37288,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-03-20 14:29:42 UTC
+Last updated 2018-03-21 14:29:53 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 5e1499a..35a5363 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -299,7 +299,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 


[50/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 5373c92..69a323c 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -274,10 +274,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3585</td>
+<td>3587</td>
 <td>0</td>
 <td>0</td>
-<td>16086</td></tr></table></div>
+<td>16088</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5427,4831 +5427,4836 @@
 <td>0</td>
 <td>2</td></tr>
 <tr class="b">
+<td><a href="#org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure.java">org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.java</a></td>
+<td>0</td>
+<td>0</td>
+<td>3</td></tr>
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.TestSafemodeBringsDownMaster.java">org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.TestServerCrashProcedure.java">org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.TestTableDDLProcedureBase.java">org/apache/hadoop/hbase/master/procedure/TestTableDDLProcedureBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.TestTableDescriptorModificationFromClient.java">org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.TestWALProcedureStoreOnHDFS.java">org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.TruncateTableProcedure.java">org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.EnabledTableSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/EnabledTableSnapshotHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.MasterSnapshotVerifier.java">org/apache/hadoop/hbase/master/snapshot/MasterSnapshotVerifier.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotFileCache.java">org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/SnapshotHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.SnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TakeSnapshotHandler.java">org/apache/hadoop/hbase/master/snapshot/TakeSnapshotHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TestAssignProcedure.java">org/apache/hadoop/hbase/master/snapshot/TestAssignProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TestSnapshotHFileCleaner.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.snapshot.TestSnapshotManager.java">org/apache/hadoop/hbase/master/snapshot/TestSnapshotManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.metrics.BaseSourceImpl.java">org/apache/hadoop/hbase/metrics/BaseSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.metrics.Interns.java">org/apache/hadoop/hbase/metrics/Interns.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.metrics.MBeanSourceImpl.java">org/apache/hadoop/hbase/metrics/MBeanSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.metrics.MetricsInfoImpl.java">org/apache/hadoop/hbase/metrics/MetricsInfoImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.metrics.impl.GlobalMetricRegistriesAdapter.java">org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.CachedMobFile.java">org/apache/hadoop/hbase/mob/CachedMobFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.DefaultMobStoreCompactor.java">org/apache/hadoop/hbase/mob/DefaultMobStoreCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.DefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/DefaultMobStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.ExpiredMobFileCleaner.java">org/apache/hadoop/hbase/mob/ExpiredMobFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobCacheConfig.java">org/apache/hadoop/hbase/mob/MobCacheConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.MobConstants.java">org/apache/hadoop/hbase/mob/MobConstants.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobFile.java">org/apache/hadoop/hbase/mob/MobFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.MobFileCache.java">org/apache/hadoop/hbase/mob/MobFileCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobFileName.java">org/apache/hadoop/hbase/mob/MobFileName.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.MobTestUtil.java">org/apache/hadoop/hbase/mob/MobTestUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.MobUtils.java">org/apache/hadoop/hbase/mob/MobUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.TestDefaultMobStoreFlusher.java">org/apache/hadoop/hbase/mob/TestDefaultMobStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>35</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.TestExpiredMobFileCleaner.java">org/apache/hadoop/hbase/mob/TestExpiredMobFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.MobCompactor.java">org/apache/hadoop/hbase/mob/compactions/MobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.PartitionedMobCompactionRequest.java">org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.PartitionedMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.TestMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mob.compactions.TestPartitionedMobCompactor.java">org/apache/hadoop/hbase/mob/compactions/TestPartitionedMobCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.LogMonitoring.java">org/apache/hadoop/hbase/monitoring/LogMonitoring.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.MemoryBoundedLogMessageBuffer.java">org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.MonitoredRPCHandlerImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredRPCHandlerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.MonitoredTaskImpl.java">org/apache/hadoop/hbase/monitoring/MonitoredTaskImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.StateDumpServlet.java">org/apache/hadoop/hbase/monitoring/StateDumpServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.TaskMonitor.java">org/apache/hadoop/hbase/monitoring/TaskMonitor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.monitoring.TestTaskMonitor.java">org/apache/hadoop/hbase/monitoring/TestTaskMonitor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.monitoring.ThreadMonitoring.java">org/apache/hadoop/hbase/monitoring/ThreadMonitoring.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mttr.IntegrationTestMTTR.java">org/apache/hadoop/hbase/mttr/IntegrationTestMTTR.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.namespace.NamespaceStateManager.java">org/apache/hadoop/hbase/namespace/NamespaceStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.namespace.NamespaceTableAndRegionInfo.java">org/apache/hadoop/hbase/namespace/NamespaceTableAndRegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.namespace.TestNamespaceAuditor.java">org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.net.Address.java">org/apache/hadoop/hbase/net/Address.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.net.TestAddress.java">org/apache/hadoop/hbase/net/TestAddress.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.nio.ByteBuff.java">org/apache/hadoop/hbase/nio/ByteBuff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.nio.MultiByteBuff.java">org/apache/hadoop/hbase/nio/MultiByteBuff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.nio.SingleByteBuff.java">org/apache/hadoop/hbase/nio/SingleByteBuff.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.MasterProcedureManager.java">org/apache/hadoop/hbase/procedure/MasterProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.Procedure.java">org/apache/hadoop/hbase/procedure/Procedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureCoordinatorRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureCoordinatorRpcs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureManagerHost.java">org/apache/hadoop/hbase/procedure/ProcedureManagerHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureMember.java">org/apache/hadoop/hbase/procedure/ProcedureMember.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ProcedureMemberRpcs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.RegionServerProcedureManager.java">org/apache/hadoop/hbase/procedure/RegionServerProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.SimpleMasterProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleMasterProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.SimpleRSProcedureManager.java">org/apache/hadoop/hbase/procedure/SimpleRSProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.Subprocedure.java">org/apache/hadoop/hbase/procedure/Subprocedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/TestProcedureCoordinator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestProcedureDescriber.java">org/apache/hadoop/hbase/procedure/TestProcedureDescriber.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestProcedureMember.java">org/apache/hadoop/hbase/procedure/TestProcedureMember.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestZKProcedure.java">org/apache/hadoop/hbase/procedure/TestZKProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>29</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.TestZKProcedureControllers.java">org/apache/hadoop/hbase/procedure/TestZKProcedureControllers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ZKProcedureCoordinator.java">org/apache/hadoop/hbase/procedure/ZKProcedureCoordinator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.ZKProcedureMemberRpcs.java">org/apache/hadoop/hbase/procedure/ZKProcedureMemberRpcs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.ZKProcedureUtil.java">org/apache/hadoop/hbase/procedure/ZKProcedureUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.flush.FlushTableSubprocedure.java">org/apache/hadoop/hbase/procedure/flush/FlushTableSubprocedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure.flush.MasterFlushTableProcedureManager.java">org/apache/hadoop/hbase/procedure/flush/MasterFlushTableProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure.flush.RegionServerFlushTableProcedureManager.java">org/apache/hadoop/hbase/procedure/flush/RegionServerFlushTableProcedureManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.AbstractProcedureScheduler.java">org/apache/hadoop/hbase/procedure2/AbstractProcedureScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.BadProcedureException.java">org/apache/hadoop/hbase/procedure2/BadProcedureException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.LockAndQueue.java">org/apache/hadoop/hbase/procedure2/LockAndQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.LockedResource.java">org/apache/hadoop/hbase/procedure2/LockedResource.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.Procedure.java">org/apache/hadoop/hbase/procedure2/Procedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureDeque.java">org/apache/hadoop/hbase/procedure2/ProcedureDeque.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureException.java">org/apache/hadoop/hbase/procedure2/ProcedureException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.java">org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureScheduler.java">org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureTestingUtility.java">org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.ProcedureUtil.java">org/apache/hadoop/hbase/procedure2/ProcedureUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureDispatcher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RemoteProcedureException.java">org/apache/hadoop/hbase/procedure2/RemoteProcedureException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.RootProcedureState.java">org/apache/hadoop/hbase/procedure2/RootProcedureState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.StateMachineProcedure.java">org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureExecution.java">org/apache/hadoop/hbase/procedure2/TestProcedureExecution.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureExecutor.java">org/apache/hadoop/hbase/procedure2/TestProcedureExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureMetrics.java">org/apache/hadoop/hbase/procedure2/TestProcedureMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureNonce.java">org/apache/hadoop/hbase/procedure2/TestProcedureNonce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureRecovery.java">org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureReplayOrder.java">org/apache/hadoop/hbase/procedure2/TestProcedureReplayOrder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureSchedulerConcurrency.java">org/apache/hadoop/hbase/procedure2/TestProcedureSchedulerConcurrency.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureSuspended.java">org/apache/hadoop/hbase/procedure2/TestProcedureSuspended.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestProcedureToString.java">org/apache/hadoop/hbase/procedure2/TestProcedureToString.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestStateMachineProcedure.java">org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.TestYieldProcedures.java">org/apache/hadoop/hbase/procedure2/TestYieldProcedures.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.ProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.TestProcedureStoreTracker.java">org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFile.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFormat.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALFormatReader.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFormatReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALLoaderPerformanceEvaluation.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALLoaderPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALPerformanceEvaluation.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALPrettyPrinter.java">org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPrettyPrinter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.TestStressWALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.TestWALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.util.DelayedUtil.java">org/apache/hadoop/hbase/procedure2/util/DelayedUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.procedure2.util.StringUtils.java">org/apache/hadoop/hbase/procedure2/util/StringUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ProtobufMagic.java">org/apache/hadoop/hbase/protobuf/ProtobufMagic.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ProtobufMessageConverter.java">org/apache/hadoop/hbase/protobuf/ProtobufMessageConverter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ProtobufUtil.java">org/apache/hadoop/hbase/protobuf/ProtobufUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>106</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil.java">org/apache/hadoop/hbase/protobuf/ReplicationProtbufUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.protobuf.TestProtobufUtil.java">org/apache/hadoop/hbase/protobuf/TestProtobufUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.protobuf.TestReplicationProtobuf.java">org/apache/hadoop/hbase/protobuf/TestReplicationProtobuf.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.ActivePolicyEnforcement.java">org/apache/hadoop/hbase/quotas/ActivePolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.AverageIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/AverageIntervalRateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.DefaultOperationQuota.java">org/apache/hadoop/hbase/quotas/DefaultOperationQuota.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.FileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/FileSystemUtilizationChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.FixedIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/FixedIntervalRateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.GlobalQuotaSettings.java">org/apache/hadoop/hbase/quotas/GlobalQuotaSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.GlobalQuotaSettingsImpl.java">org/apache/hadoop/hbase/quotas/GlobalQuotaSettingsImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.MasterSpaceQuotaObserver.java">org/apache/hadoop/hbase/quotas/MasterSpaceQuotaObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.NamespaceQuotaSnapshotStore.java">org/apache/hadoop/hbase/quotas/NamespaceQuotaSnapshotStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.NoopOperationQuota.java">org/apache/hadoop/hbase/quotas/NoopOperationQuota.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.NoopQuotaLimiter.java">org/apache/hadoop/hbase/quotas/NoopQuotaLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.OperationQuota.java">org/apache/hadoop/hbase/quotas/OperationQuota.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaCache.java">org/apache/hadoop/hbase/quotas/QuotaCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaLimiter.java">org/apache/hadoop/hbase/quotas/QuotaLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaLimiterFactory.java">org/apache/hadoop/hbase/quotas/QuotaLimiterFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaObserverChore.java">org/apache/hadoop/hbase/quotas/QuotaObserverChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaRetriever.java">org/apache/hadoop/hbase/quotas/QuotaRetriever.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaSettings.java">org/apache/hadoop/hbase/quotas/QuotaSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaSettingsFactory.java">org/apache/hadoop/hbase/quotas/QuotaSettingsFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaState.java">org/apache/hadoop/hbase/quotas/QuotaState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaTableUtil.java">org/apache/hadoop/hbase/quotas/QuotaTableUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.QuotaUtil.java">org/apache/hadoop/hbase/quotas/QuotaUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.RateLimiter.java">org/apache/hadoop/hbase/quotas/RateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.RegionServerRpcQuotaManager.java">org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.RegionServerSpaceQuotaManager.java">org/apache/hadoop/hbase/quotas/RegionServerSpaceQuotaManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore.java">org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceLimitSettings.java">org/apache/hadoop/hbase/quotas/SpaceLimitSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaRefresherChore.java">org/apache/hadoop/hbase/quotas/SpaceQuotaRefresherChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshot.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifierFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierForTest.java">org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifierForTest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/SpaceViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.SpaceViolationPolicyEnforcementFactory.java">org/apache/hadoop/hbase/quotas/SpaceViolationPolicyEnforcementFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TableQuotaSnapshotStore.java">org/apache/hadoop/hbase/quotas/TableQuotaSnapshotStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestFileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/TestFileSystemUtilizationChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestMasterSpaceQuotaObserver.java">org/apache/hadoop/hbase/quotas/TestMasterSpaceQuotaObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestNamespaceQuotaViolationStore.java">org/apache/hadoop/hbase/quotas/TestNamespaceQuotaViolationStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaFilter.java">org/apache/hadoop/hbase/quotas/TestQuotaFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaObserverChoreWithMiniCluster.java">org/apache/hadoop/hbase/quotas/TestQuotaObserverChoreWithMiniCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaSettingsFactory.java">org/apache/hadoop/hbase/quotas/TestQuotaSettingsFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaStatusRPCs.java">org/apache/hadoop/hbase/quotas/TestQuotaStatusRPCs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestQuotaThrottle.java">org/apache/hadoop/hbase/quotas/TestQuotaThrottle.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestRateLimiter.java">org/apache/hadoop/hbase/quotas/TestRateLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestSpaceQuotas.java">org/apache/hadoop/hbase/quotas/TestSpaceQuotas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestTableQuotaViolationStore.java">org/apache/hadoop/hbase/quotas/TestTableQuotaViolationStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TestTablesWithQuotas.java">org/apache/hadoop/hbase/quotas/TestTablesWithQuotas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.ThrottleSettings.java">org/apache/hadoop/hbase/quotas/ThrottleSettings.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.TimeBasedLimiter.java">org/apache/hadoop/hbase/quotas/TimeBasedLimiter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.UserQuotaState.java">org/apache/hadoop/hbase/quotas/UserQuotaState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.BaseViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/BaseViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.DefaultViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/DefaultViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.DisableTableViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/DisableTableViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.MissingSnapshotViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/MissingSnapshotViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.NoInsertsViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoInsertsViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.NoWritesCompactionsViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoWritesCompactionsViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.NoWritesViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/NoWritesViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.quotas.policies.TestBulkLoadCheckingViolationPolicyEnforcement.java">org/apache/hadoop/hbase/quotas/policies/TestBulkLoadCheckingViolationPolicyEnforcement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AbstractMemStore.java">org/apache/hadoop/hbase/regionserver/AbstractMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AbstractMultiFileWriter.java">org/apache/hadoop/hbase/regionserver/AbstractMultiFileWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AbstractTestDateTieredCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/AbstractTestDateTieredCompactionPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.AnnotationReadingPriorityFunction.java">org/apache/hadoop/hbase/regionserver/AnnotationReadingPriorityFunction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.BaseRowProcessor.java">org/apache/hadoop/hbase/regionserver/BaseRowProcessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.BusyRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/BusyRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ByteBufferChunkKeyValue.java">org/apache/hadoop/hbase/regionserver/ByteBufferChunkKeyValue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CSLMImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CSLMImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellArrayImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CellArrayImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellArrayMap.java">org/apache/hadoop/hbase/regionserver/CellArrayMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellChunkMap.java">org/apache/hadoop/hbase/regionserver/CellChunkMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellFlatMap.java">org/apache/hadoop/hbase/regionserver/CellFlatMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellSet.java">org/apache/hadoop/hbase/regionserver/CellSet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CellSink.java">org/apache/hadoop/hbase/regionserver/CellSink.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ChangedReadersObserver.java">org/apache/hadoop/hbase/regionserver/ChangedReadersObserver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Chunk.java">org/apache/hadoop/hbase/regionserver/Chunk.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ChunkCreator.java">org/apache/hadoop/hbase/regionserver/ChunkCreator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactSplit.java">org/apache/hadoop/hbase/regionserver/CompactSplit.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactedHFilesDischargeHandler.java">org/apache/hadoop/hbase/regionserver/CompactedHFilesDischargeHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactedHFilesDischarger.java">org/apache/hadoop/hbase/regionserver/CompactedHFilesDischarger.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactingMemStore.java">org/apache/hadoop/hbase/regionserver/CompactingMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactionPipeline.java">org/apache/hadoop/hbase/regionserver/CompactionPipeline.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompactionTool.java">org/apache/hadoop/hbase/regionserver/CompactionTool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CompositeImmutableSegment.java">org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ConstantSizeRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/ConstantSizeRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.CreateRandomStoreFile.java">org/apache/hadoop/hbase/regionserver/CreateRandomStoreFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DataBlockEncodingTool.java">org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine.java">org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DefaultHeapMemoryTuner.java">org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>31</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DefaultMemStore.java">org/apache/hadoop/hbase/regionserver/DefaultMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher.java">org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DelegatingKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/DelegatingKeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DelimitedKeyPrefixRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/DelimitedKeyPrefixRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DisabledRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/DisabledRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.DumpRegionServerMetrics.java">org/apache/hadoop/hbase/regionserver/DumpRegionServerMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FavoredNodesForRegion.java">org/apache/hadoop/hbase/regionserver/FavoredNodesForRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FifoRpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/FifoRpcSchedulerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FlushPolicyFactory.java">org/apache/hadoop/hbase/regionserver/FlushPolicyFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FlushRequestListener.java">org/apache/hadoop/hbase/regionserver/FlushRequestListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.FlushRequester.java">org/apache/hadoop/hbase/regionserver/FlushRequester.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HMobStore.java">org/apache/hadoop/hbase/regionserver/HMobStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegion.java">org/apache/hadoop/hbase/regionserver/HRegion.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>209</td></tr>
-<tr class="b">
+<td>207</td></tr>
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionServer.java">org/apache/hadoop/hbase/regionserver/HRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>88</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.java">org/apache/hadoop/hbase/regionserver/HRegionServerCommandLine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HStore.java">org/apache/hadoop/hbase/regionserver/HStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HeapMemoryManager.java">org/apache/hadoop/hbase/regionserver/HeapMemoryManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.HeapMemoryTuner.java">org/apache/hadoop/hbase/regionserver/HeapMemoryTuner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ImmutableSegment.java">org/apache/hadoop/hbase/regionserver/ImmutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.InternalScan.java">org/apache/hadoop/hbase/regionserver/InternalScan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.InternalScanner.java">org/apache/hadoop/hbase/regionserver/InternalScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyPrefixRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/KeyPrefixRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyValueHeap.java">org/apache/hadoop/hbase/regionserver/KeyValueHeap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.KeyValueScanner.java">org/apache/hadoop/hbase/regionserver/KeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.LeaseException.java">org/apache/hadoop/hbase/regionserver/LeaseException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Leases.java">org/apache/hadoop/hbase/regionserver/Leases.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.LogRoller.java">org/apache/hadoop/hbase/regionserver/LogRoller.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStore.java">org/apache/hadoop/hbase/regionserver/MemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreCompactor.java">org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreFlusher.java">org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>30</td></tr>
-<tr class="b">
+<td>29</td></tr>
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreLAB.java">org/apache/hadoop/hbase/regionserver/MemStoreLAB.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreLABImpl.java">org/apache/hadoop/hbase/regionserver/MemStoreLABImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreMergerSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreSegmentsIterator.java">org/apache/hadoop/hbase/regionserver/MemStoreSegmentsIterator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MemStoreSnapshot.java">org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsHeapMemoryManagerSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsHeapMemoryManagerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegion.java">org/apache/hadoop/hbase/regionserver/MetricsRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionAggregateSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceFactoryImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerWrapperImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionServerWrapperStub.java">org/apache/hadoop/hbase/regionserver/MetricsRegionServerWrapperStub.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsRegionSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTable.java">org/apache/hadoop/hbase/regionserver/MetricsTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableAggregateSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableSourceImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MetricsTableWrapperAggregateImpl.java">org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress.java">org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MobReferenceOnlyFilter.java">org/apache/hadoop/hbase/regionserver/MobReferenceOnlyFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MutableOnlineRegions.java">org/apache/hadoop/hbase/regionserver/MutableOnlineRegions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.MutableSegment.java">org/apache/hadoop/hbase/regionserver/MutableSegment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.NoTagByteBufferChunkKeyValue.java">org/apache/hadoop/hbase/regionserver/NoTagByteBufferChunkKeyValue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.NonLazyKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/NonLazyKeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.NonReversedNonLazyKeyValueScanner.java">org/apache/hadoop/hbase/regionserver/NonReversedNonLazyKeyValueScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.OOMERegionServer.java">org/apache/hadoop/hbase/regionserver/OOMERegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.OnlineRegions.java">org/apache/hadoop/hbase/regionserver/OnlineRegions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.OperationStatus.java">org/apache/hadoop/hbase/regionserver/OperationStatus.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RSDumpServlet.java">org/apache/hadoop/hbase/regionserver/RSDumpServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RSRpcServices.java">org/apache/hadoop/hbase/regionserver/RSRpcServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RSStatusServlet.java">org/apache/hadoop/hbase/regionserver/RSStatusServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Region.java">org/apache/hadoop/hbase/regionserver/Region.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionAsTable.java">org/apache/hadoop/hbase/regionserver/RegionAsTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>79</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionScanner.java">org/apache/hadoop/hbase/regionserver/RegionScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServerAccounting.java">org/apache/hadoop/hbase/regionserver/RegionServerAccounting.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServerCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/RegionServerCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServerServices.java">org/apache/hadoop/hbase/regionserver/RegionServerServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionServicesForStores.java">org/apache/hadoop/hbase/regionserver/RegionServicesForStores.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReplicationSinkService.java">org/apache/hadoop/hbase/regionserver/ReplicationSinkService.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReversedKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/ReversedKeyValueHeap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReversedRegionScannerImpl.java">org/apache/hadoop/hbase/regionserver/ReversedRegionScannerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ReversedStoreScanner.java">org/apache/hadoop/hbase/regionserver/ReversedStoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RowProcessor.java">org/apache/hadoop/hbase/regionserver/RowProcessor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.RpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/RpcSchedulerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScanInfo.java">org/apache/hadoop/hbase/regionserver/ScanInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScanOptions.java">org/apache/hadoop/hbase/regionserver/ScanOptions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScannerContext.java">org/apache/hadoop/hbase/regionserver/ScannerContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ScannerIdGenerator.java">org/apache/hadoop/hbase/regionserver/ScannerIdGenerator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SecureBulkLoadEndpointClient.java">org/apache/hadoop/hbase/regionserver/SecureBulkLoadEndpointClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SecureBulkLoadManager.java">org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Segment.java">org/apache/hadoop/hbase/regionserver/Segment.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SegmentFactory.java">org/apache/hadoop/hbase/regionserver/SegmentFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SegmentScanner.java">org/apache/hadoop/hbase/regionserver/SegmentScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ServerNonceManager.java">org/apache/hadoop/hbase/regionserver/ServerNonceManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ShipperListener.java">org/apache/hadoop/hbase/regionserver/ShipperListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.ShutdownHook.java">org/apache/hadoop/hbase/regionserver/ShutdownHook.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SimpleRpcSchedulerFactory.java">org/apache/hadoop/hbase/regionserver/SimpleRpcSchedulerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SplitLogWorker.java">org/apache/hadoop/hbase/regionserver/SplitLogWorker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SplitRequest.java">org/apache/hadoop/hbase/regionserver/SplitRequest.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.SteppingSplitPolicy.java">org/apache/hadoop/hbase/regionserver/SteppingSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.Store.java">org/apache/hadoop/hbase/regionserver/Store.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileComparators.java">org/apache/hadoop/hbase/regionserver/StoreFileComparators.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileInfo.java">org/apache/hadoop/hbase/regionserver/StoreFileInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileManager.java">org/apache/hadoop/hbase/regionserver/StoreFileManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileReader.java">org/apache/hadoop/hbase/regionserver/StoreFileReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileScanner.java">org/apache/hadoop/hbase/regionserver/StoreFileScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFileWriter.java">org/apache/hadoop/hbase/regionserver/StoreFileWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFlushContext.java">org/apache/hadoop/hbase/regionserver/StoreFlushContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreFlusher.java">org/apache/hadoop/hbase/regionserver/StoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreScanner.java">org/apache/hadoop/hbase/regionserver/StoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StoreUtils.java">org/apache/hadoop/hbase/regionserver/StoreUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StorefileRefresherChore.java">org/apache/hadoop/hbase/regionserver/StorefileRefresherChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeMultiFileWriter.java">org/apache/hadoop/hbase/regionserver/StripeMultiFileWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreConfig.java">org/apache/hadoop/hbase/regionserver/StripeStoreConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreEngine.java">org/apache/hadoop/hbase/regionserver/StripeStoreEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreFileManager.java">org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.StripeStoreFlusher.java">org/apache/hadoop/hbase/regionserver/StripeStoreFlusher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestAtomicOperation.java">org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestBlocksRead.java">org/apache/hadoop/hbase/regionserver/TestBlocksRead.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestBlocksScanned.java">org/apache/hadoop/hbase/regionserver/TestBlocksScanned.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestBulkLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCacheOnWriteInSchema.java">org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCellFlatSet.java">org/apache/hadoop/hbase/regionserver/TestCellFlatSet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCellSkipListSet.java">org/apache/hadoop/hbase/regionserver/TestCellSkipListSet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestClearRegionBlockCache.java">org/apache/hadoop/hbase/regionserver/TestClearRegionBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestColumnSeeking.java">org/apache/hadoop/hbase/regionserver/TestColumnSeeking.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactSplitThread.java">org/apache/hadoop/hbase/regionserver/TestCompactSplitThread.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactingMemStore.java">org/apache/hadoop/hbase/regionserver/TestCompactingMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactingToCellFlatMapMemStore.java">org/apache/hadoop/hbase/regionserver/TestCompactingToCellFlatMapMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompaction.java">org/apache/hadoop/hbase/regionserver/TestCompaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompactionState.java">org/apache/hadoop/hbase/regionserver/TestCompactionState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestCompoundBloomFilter.java">org/apache/hadoop/hbase/regionserver/TestCompoundBloomFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDateTieredCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDateTieredCompactionPolicyOverflow.java">org/apache/hadoop/hbase/regionserver/TestDateTieredCompactionPolicyOverflow.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDefaultMemStore.java">org/apache/hadoop/hbase/regionserver/TestDefaultMemStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestDeleteMobTable.java">org/apache/hadoop/hbase/regionserver/TestDeleteMobTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestEndToEndSplitTransaction.java">org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestFSErrorsExposed.java">org/apache/hadoop/hbase/regionserver/TestFSErrorsExposed.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestFailedAppendAndSync.java">org/apache/hadoop/hbase/regionserver/TestFailedAppendAndSync.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHMobStore.java">org/apache/hadoop/hbase/regionserver/TestHMobStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegion.java">org/apache/hadoop/hbase/regionserver/TestHRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>54</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionInfo.java">org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestHRegionOnCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionReplayEvents.java">org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoadWithOldClient.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoadWithOldClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoadWithOldSecureEndpoint.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoadWithOldSecureEndpoint.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHStore.java">org/apache/hadoop/hbase/regionserver/TestHStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHStoreFile.java">org/apache/hadoop/hbase/regionserver/TestHStoreFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestJoinedScanners.java">org/apache/hadoop/hbase/regionserver/TestJoinedScanners.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestKeepDeletes.java">org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/TestKeyValueHeap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestKeyValueScanFixture.java">org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMajorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMajorCompaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMasterAddressTracker.java">org/apache/hadoop/hbase/regionserver/TestMasterAddressTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMemStoreLAB.java">org/apache/hadoop/hbase/regionserver/TestMemStoreLAB.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMemstoreLABWithoutPool.java">org/apache/hadoop/hbase/regionserver/TestMemstoreLABWithoutPool.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsRegion.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsRegionSourceImpl.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsTableAggregate.java">org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMetricsTableSourceImpl.java">org/apache/hadoop/hbase/regionserver/TestMetricsTableSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMinorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMinorCompaction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMobStoreScanner.java">org/apache/hadoop/hbase/regionserver/TestMobStoreScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMultiColumnScanner.java">org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMultiLogThreshold.java">org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestMultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestParallelPut.java">org/apache/hadoop/hbase/regionserver/TestParallelPut.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestPerColumnFamilyFlush.java">org/apache/hadoop/hbase/regionserver/TestPerColumnFamilyFlush.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestPriorityRpc.java">org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestQosFunction.java">org/apache/hadoop/hbase/regionserver/TestQosFunction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRSKilledWhenInitializing.java">org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRecoveredEdits.java">org/apache/hadoop/hbase/regionserver/TestRecoveredEdits.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionIncrement.java">org/apache/hadoop/hbase/regionserver/TestRegionIncrement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionInfoBuilder.java">org/apache/hadoop/hbase/regionserver/TestRegionInfoBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionMergeTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionOpen.java">org/apache/hadoop/hbase/regionserver/TestRegionOpen.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionReplicaFailover.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicaFailover.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionReplicas.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerAbort.java">org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerHostname.java">org/apache/hadoop/hbase/regionserver/TestRegionServerHostname.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerNoMaster.java">org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerOnlineConfigChange.java">org/apache/hadoop/hbase/regionserver/TestRegionServerOnlineConfigChange.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerReadRequestMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionServerReportForDuty.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestResettingCounters.java">org/apache/hadoop/hbase/regi

<TRUNCATED>

[41/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
index 92de9a1..a544da6 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.866">FSHLog.RingBufferEventHandler</a>
+<pre>class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.881">FSHLog.RingBufferEventHandler</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&gt;, com.lmax.disruptor.LifecycleAware</pre>
 <div class="block">Handler that is run by the disruptor ringbuffer consumer. Consumer is a SINGLE
@@ -302,7 +302,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>syncRunners</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SyncRunner</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.867">syncRunners</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SyncRunner</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.882">syncRunners</a></pre>
 </li>
 </ul>
 <a name="syncFutures">
@@ -311,7 +311,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>syncFutures</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.868">syncFutures</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.883">syncFutures</a></pre>
 </li>
 </ul>
 <a name="syncFuturesCount">
@@ -320,7 +320,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>syncFuturesCount</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.871">syncFuturesCount</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.886">syncFuturesCount</a></pre>
 </li>
 </ul>
 <a name="zigzagLatch">
@@ -329,7 +329,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>zigzagLatch</h4>
-<pre>private volatile&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SafePointZigZagLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.872">zigzagLatch</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SafePointZigZagLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.887">zigzagLatch</a></pre>
 </li>
 </ul>
 <a name="exception">
@@ -338,7 +338,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>exception</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.877">exception</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.892">exception</a></pre>
 <div class="block">Set if we get an exception appending or syncing so that all subsequence appends and syncs on
  this WAL fail until WAL is replaced.</div>
 </li>
@@ -349,7 +349,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>safePointWaiter</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.881">safePointWaiter</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.896">safePointWaiter</a></pre>
 <div class="block">Object to block on while waiting on safe point.</div>
 </li>
 </ul>
@@ -359,7 +359,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.882">shutdown</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.897">shutdown</a></pre>
 </li>
 </ul>
 <a name="syncRunnerIndex">
@@ -368,7 +368,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>syncRunnerIndex</h4>
-<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.887">syncRunnerIndex</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.902">syncRunnerIndex</a></pre>
 <div class="block">Which syncrunner to use next.</div>
 </li>
 </ul>
@@ -386,7 +386,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RingBufferEventHandler</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.889">RingBufferEventHandler</a>(int&nbsp;syncRunnerCount,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.904">RingBufferEventHandler</a>(int&nbsp;syncRunnerCount,
                        int&nbsp;maxHandlersCount)</pre>
 </li>
 </ul>
@@ -404,7 +404,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupOutstandingSyncsOnException</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.897">cleanupOutstandingSyncsOnException</a>(long&nbsp;sequence,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.912">cleanupOutstandingSyncsOnException</a>(long&nbsp;sequence,
                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a>&nbsp;e)</pre>
 </li>
 </ul>
@@ -414,7 +414,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>isOutstandingSyncs</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.908">isOutstandingSyncs</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.923">isOutstandingSyncs</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True if outstanding sync futures still</dd>
@@ -427,7 +427,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>isOutstandingSyncsFromRunners</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.919">isOutstandingSyncsFromRunners</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.934">isOutstandingSyncsFromRunners</a>()</pre>
 </li>
 </ul>
 <a name="onEvent-org.apache.hadoop.hbase.regionserver.wal.RingBufferTruck-long-boolean-">
@@ -436,7 +436,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>onEvent</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.931">onEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&nbsp;truck,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.946">onEvent</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&nbsp;truck,
                     long&nbsp;sequence,
                     boolean&nbsp;endOfBatch)
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
@@ -454,7 +454,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>attainSafePoint</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SafePointZigZagLatch</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1021">attainSafePoint</a>()</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.SafePointZigZagLatch</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1036">attainSafePoint</a>()</pre>
 </li>
 </ul>
 <a name="attainSafePoint-long-">
@@ -463,7 +463,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>attainSafePoint</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1030">attainSafePoint</a>(long&nbsp;currentSequence)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1045">attainSafePoint</a>(long&nbsp;currentSequence)</pre>
 <div class="block">Check if we should attain safe point. If so, go there and then wait till signalled before we
  proceeding.</div>
 </li>
@@ -474,7 +474,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1065">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSWALEntry</a>&nbsp;entry)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1080">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSWALEntry</a>&nbsp;entry)
      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Append to the WAL. Does all CP and WAL listener calls.</div>
 <dl>
@@ -489,7 +489,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockList">
 <li class="blockList">
 <h4>onStart</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1078">onStart</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1093">onStart</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>onStart</code>&nbsp;in interface&nbsp;<code>com.lmax.disruptor.LifecycleAware</code></dd>
@@ -502,7 +502,7 @@ implements com.lmax.disruptor.EventHandler&lt;<a href="../../../../../../org/apa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onShutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1085">onShutdown</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html#line.1100">onShutdown</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>onShutdown</code>&nbsp;in interface&nbsp;<code>com.lmax.disruptor.LifecycleAware</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
index 48c9bd2..6f311ef 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.154">FSHLog.RingBufferExceptionHandler</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.157">FSHLog.RingBufferExceptionHandler</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&gt;</pre>
 <div class="block">Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs
@@ -199,7 +199,7 @@ implements com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RingBufferExceptionHandler</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.154">RingBufferExceptionHandler</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.157">RingBufferExceptionHandler</a>()</pre>
 </li>
 </ul>
 </li>
@@ -216,7 +216,7 @@ implements com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org
 <ul class="blockList">
 <li class="blockList">
 <h4>handleEventException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.157">handleEventException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.160">handleEventException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex,
                                  long&nbsp;sequence,
                                  <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&nbsp;event)</pre>
 <dl>
@@ -231,7 +231,7 @@ implements com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org
 <ul class="blockList">
 <li class="blockList">
 <h4>handleOnStartException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.163">handleOnStartException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.166">handleOnStartException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>handleOnStartException</code>&nbsp;in interface&nbsp;<code>com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&gt;</code></dd>
@@ -244,7 +244,7 @@ implements com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org
 <ul class="blockListLast">
 <li class="blockList">
 <h4>handleOnShutdownException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.169">handleOnShutdownException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html#line.172">handleOnShutdownException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;ex)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>handleOnShutdownException</code>&nbsp;in interface&nbsp;<code>com.lmax.disruptor.ExceptionHandler&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
index 2983a27..9c4d50f 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.784">FSHLog.SafePointZigZagLatch</a>
+<pre>static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.799">FSHLog.SafePointZigZagLatch</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">This class is used coordinating two threads holding one thread at a 'safe point' while the
  orchestrating thread does some work that requires the first thread paused: e.g. holding the WAL
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>safePointAttainedLatch</h4>
-<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.788">safePointAttainedLatch</a></pre>
+<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.803">safePointAttainedLatch</a></pre>
 <div class="block">Count down this latch when safe point attained.</div>
 </li>
 </ul>
@@ -264,7 +264,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>safePointReleasedLatch</h4>
-<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.792">safePointReleasedLatch</a></pre>
+<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CountDownLatch.html?is-external=true" title="class or interface in java.util.concurrent">CountDownLatch</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.807">safePointReleasedLatch</a></pre>
 <div class="block">Latch to wait on. Will be released when we can proceed.</div>
 </li>
 </ul>
@@ -282,7 +282,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SafePointZigZagLatch</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.784">SafePointZigZagLatch</a>()</pre>
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.799">SafePointZigZagLatch</a>()</pre>
 </li>
 </ul>
 </li>
@@ -299,7 +299,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkIfSyncFailed</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.794">checkIfSyncFailed</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.809">checkIfSyncFailed</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)
                         throws <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FailedSyncBeforeLogCloseException.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FailedSyncBeforeLogCloseException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -313,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>waitSafePoint</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.807">waitSafePoint</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)
+<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.822">waitSafePoint</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                          <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FailedSyncBeforeLogCloseException.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FailedSyncBeforeLogCloseException</a></pre>
 <div class="block">For Thread A to call when it is ready to wait on the 'safe point' to be attained. Thread A
@@ -336,7 +336,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>safePointAttained</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.821">safePointAttained</a>()
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.836">safePointAttained</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Called by Thread B when it attains the 'safe point'. In this method, Thread B signals Thread
  A it can proceed. Thread B will be held in here until <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#releaseSafePoint--"><code>releaseSafePoint()</code></a> is called
@@ -353,7 +353,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseSafePoint</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.830">releaseSafePoint</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.845">releaseSafePoint</a>()</pre>
 <div class="block">Called by Thread A when it is done with the work it needs to do while Thread B is halted.
  This will release the Thread B held in a call to <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#safePointAttained--"><code>safePointAttained()</code></a></div>
 </li>
@@ -364,7 +364,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isCocked</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.837">isCocked</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#line.852">isCocked</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>True is this is a 'cocked', fresh instance, and not one that has already fired.</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
index 028ebe5..4590157 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.454">FSHLog.SyncRunner</a>
+<pre>private class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.459">FSHLog.SyncRunner</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html" title="class in org.apache.hadoop.hbase.util">HasThread</a></pre>
 <div class="block">Thread to runs the hdfs sync call. This call takes a while to complete. This is the longest
  pole adding edits to the WAL and this must complete to be sure all edits persisted. We run
@@ -269,7 +269,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>sequence</h4>
-<pre>private volatile&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.455">sequence</a></pre>
+<pre>private volatile&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.460">sequence</a></pre>
 </li>
 </ul>
 <a name="syncFutures">
@@ -278,7 +278,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>syncFutures</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">BlockingQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.457">syncFutures</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">BlockingQueue</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.462">syncFutures</a></pre>
 </li>
 </ul>
 <a name="takeSyncFuture">
@@ -287,7 +287,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>takeSyncFuture</h4>
-<pre>private volatile&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.458">takeSyncFuture</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.463">takeSyncFuture</a></pre>
 </li>
 </ul>
 </li>
@@ -304,7 +304,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SyncRunner</h4>
-<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.460">SyncRunner</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre><a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.465">SyncRunner</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
            int&nbsp;maxHandlersCount)</pre>
 </li>
 </ul>
@@ -322,7 +322,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>offer</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.478">offer</a>(long&nbsp;sequence,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.483">offer</a>(long&nbsp;sequence,
            <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>[]&nbsp;syncFutures,
            int&nbsp;syncFutureCount)</pre>
 </li>
@@ -333,7 +333,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseSyncFuture</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.490">releaseSyncFuture</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.495">releaseSyncFuture</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture,
                               long&nbsp;currentSequence,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</pre>
 <div class="block">Release the passed <code>syncFuture</code></div>
@@ -349,7 +349,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseSyncFutures</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.505">releaseSyncFutures</a>(long&nbsp;currentSequence,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.510">releaseSyncFutures</a>(long&nbsp;currentSequence,
                                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</pre>
 <div class="block">Release all SyncFutures whose sequence is <= <code>currentSequence</code>.</div>
 <dl>
@@ -366,7 +366,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>updateHighestSyncedSequence</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.524">updateHighestSyncedSequence</a>(long&nbsp;sequence)</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.529">updateHighestSyncedSequence</a>(long&nbsp;sequence)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>sequence</code> - The sequence we ran the filesystem sync against.</dd>
@@ -381,7 +381,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>areSyncFuturesReleased</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.539">areSyncFuturesReleased</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.544">areSyncFuturesReleased</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -390,7 +390,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/util/HasThread.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.547">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html#line.552">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
index 8474a24..1f68d23 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.67">FSHLog</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.68">FSHLog</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractFSWAL</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&gt;</pre>
 <div class="block">The default implementation of FSWAL.</div>
 </li>
@@ -240,6 +240,10 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
  and syncs; it may shutdown without cleaning out the last few appends or syncs.</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#useHsync">useHsync</a></span></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL">
@@ -385,15 +389,17 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 </tr>
 <tr id="i15" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer--">publishSyncOnRingBuffer</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-boolean-">publishSyncOnRingBuffer</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 <tr id="i16" class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-long-">publishSyncOnRingBuffer</a></span>(long&nbsp;sequence)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-long-boolean-">publishSyncOnRingBuffer</a></span>(long&nbsp;sequence,
+                       boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 <tr id="i17" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncThenBlockOnCompletion-org.apache.htrace.core.TraceScope-">publishSyncThenBlockOnCompletion</a></span>(org.apache.htrace.core.TraceScope&nbsp;scope)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncThenBlockOnCompletion-org.apache.htrace.core.TraceScope-boolean-">publishSyncThenBlockOnCompletion</a></span>(org.apache.htrace.core.TraceScope&nbsp;scope,
+                                boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 <tr id="i18" class="altColor">
 <td class="colFirst"><code>void</code></td>
@@ -403,10 +409,19 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 </tr>
 <tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync-boolean-">sync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
+<tr id="i20" class="altColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync-long-">sync</a></span>(long&nbsp;txid)</code>
 <div class="block">Sync the WAL if the txId was not already sync'd.</div>
 </td>
 </tr>
+<tr id="i21" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync-long-boolean-">sync</a></span>(long&nbsp;txid,
+    boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL">
@@ -442,7 +457,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.103">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.104">LOG</a></pre>
 </li>
 </ul>
 <a name="disruptor">
@@ -451,7 +466,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>disruptor</h4>
-<pre>private final&nbsp;com.lmax.disruptor.dsl.Disruptor&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.112">disruptor</a></pre>
+<pre>private final&nbsp;com.lmax.disruptor.dsl.Disruptor&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.113">disruptor</a></pre>
 <div class="block">The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends
  and syncs are each put on the ring which means handlers need to smash up against the ring twice
  (can we make it once only? ... maybe not since time to append is so different from time to sync
@@ -465,7 +480,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>ringBufferEventHandler</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.RingBufferEventHandler</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.120">ringBufferEventHandler</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog.RingBufferEventHandler</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.121">ringBufferEventHandler</a></pre>
 <div class="block">This fellow is run by the above appendExecutor service but it is all about batching up appends
  and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against
  this, keep a reference to this handler and do explicit close on way out to make sure all
@@ -478,7 +493,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>hdfs_out</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.FSDataOutputStream <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.125">hdfs_out</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.FSDataOutputStream <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.126">hdfs_out</a></pre>
 <div class="block">FSDataOutputStream associated with the current SequenceFile.writer</div>
 </li>
 </ul>
@@ -488,7 +503,16 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>minTolerableReplication</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.130">minTolerableReplication</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.131">minTolerableReplication</a></pre>
+</li>
+</ul>
+<a name="useHsync">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>useHsync</h4>
+<pre>private final&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.133">useHsync</a></pre>
 </li>
 </ul>
 <a name="consecutiveLogRolls">
@@ -497,7 +521,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>consecutiveLogRolls</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.136">consecutiveLogRolls</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.139">consecutiveLogRolls</a></pre>
 </li>
 </ul>
 <a name="lowReplicationRollLimit">
@@ -506,7 +530,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>lowReplicationRollLimit</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.138">lowReplicationRollLimit</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.141">lowReplicationRollLimit</a></pre>
 </li>
 </ul>
 <a name="lowReplicationRollEnabled">
@@ -515,7 +539,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>lowReplicationRollEnabled</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.143">lowReplicationRollEnabled</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.146">lowReplicationRollEnabled</a></pre>
 </li>
 </ul>
 <a name="closeErrorsTolerated">
@@ -524,7 +548,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>closeErrorsTolerated</h4>
-<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.146">closeErrorsTolerated</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.149">closeErrorsTolerated</a></pre>
 <div class="block">Number of log close errors tolerated before we abort</div>
 </li>
 </ul>
@@ -534,7 +558,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>closeErrorCount</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.148">closeErrorCount</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.151">closeErrorCount</a></pre>
 </li>
 </ul>
 <a name="FIXED_OVERHEAD">
@@ -543,7 +567,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.755">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.770">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 </li>
@@ -560,7 +584,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>FSHLog</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.182">FSHLog</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.185">FSHLog</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
               org.apache.hadoop.fs.Path&nbsp;root,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;logDir,
               org.apache.hadoop.conf.Configuration&nbsp;conf)
@@ -583,7 +607,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FSHLog</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.205">FSHLog</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.208">FSHLog</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
               org.apache.hadoop.fs.Path&nbsp;rootDir,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;logDir,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;archiveDir,
@@ -630,7 +654,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputStream</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.247">getOutputStream</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.252">getOutputStream</a>()</pre>
 <div class="block">Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the
  default behavior (such as setting the maxRecoveryErrorCount value for example (see
  <code>org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()</code>). This is
@@ -648,7 +672,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>preemptiveSync</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.255">preemptiveSync</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">ProtobufLogWriter</a>&nbsp;nextWriter)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.260">preemptiveSync</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">ProtobufLogWriter</a>&nbsp;nextWriter)</pre>
 <div class="block">Run a sync after opening to set up the pipeline.</div>
 </li>
 </ul>
@@ -658,7 +682,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>createWriterInstance</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.272">createWriterInstance</a>(org.apache.hadoop.fs.Path&nbsp;path)
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.277">createWriterInstance</a>(org.apache.hadoop.fs.Path&nbsp;path)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">This method allows subclasses to inject different writers without having to extend other
  methods like rollWriter().</div>
@@ -678,7 +702,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>afterCreatingZigZagLatch</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.285">afterCreatingZigZagLatch</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.290">afterCreatingZigZagLatch</a>()</pre>
 <div class="block">Used to manufacture race condition reliably. For testing only.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -692,7 +716,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>beforeWaitOnSafePoint</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.292">beforeWaitOnSafePoint</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.297">beforeWaitOnSafePoint</a>()</pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#afterCreatingZigZagLatch--"><code>afterCreatingZigZagLatch()</code></a></dd>
@@ -705,7 +729,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>doAppend</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.296">doAppend</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;writer,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.301">doAppend</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;writer,
                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSWALEntry</a>&nbsp;entry)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -722,7 +746,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>doReplaceWriter</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.301">doReplaceWriter</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.306">doReplaceWriter</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
                                org.apache.hadoop.fs.Path&nbsp;newPath,
                                <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;nextWriter)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -740,7 +764,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>doShutdown</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.404">doShutdown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.409">doShutdown</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -756,7 +780,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.432">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.437">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                    <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
                    <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edits,
                    boolean&nbsp;inMemstore)
@@ -799,7 +823,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>checkLogRoll</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.617">checkLogRoll</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.622">checkLogRoll</a>()</pre>
 <div class="block">Schedule a log roll if needed.</div>
 </li>
 </ul>
@@ -809,7 +833,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>doCheckLogLowReplication</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.637">doCheckLogLowReplication</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.642">doCheckLogLowReplication</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#doCheckLogLowReplication--">doCheckLogLowReplication</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractFSWAL</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&gt;</code></dd>
@@ -824,34 +848,36 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getSequenceOnRingBuffer</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.683">getSequenceOnRingBuffer</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.688">getSequenceOnRingBuffer</a>()</pre>
 </li>
 </ul>
-<a name="publishSyncOnRingBuffer--">
+<a name="publishSyncOnRingBuffer-boolean-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishSyncOnRingBuffer</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.687">publishSyncOnRingBuffer</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.692">publishSyncOnRingBuffer</a>(boolean&nbsp;forceSync)</pre>
 </li>
 </ul>
-<a name="publishSyncOnRingBuffer-long-">
+<a name="publishSyncOnRingBuffer-long-boolean-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishSyncOnRingBuffer</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.693">publishSyncOnRingBuffer</a>(long&nbsp;sequence)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.698">publishSyncOnRingBuffer</a>(long&nbsp;sequence,
+                                             boolean&nbsp;forceSync)</pre>
 </li>
 </ul>
-<a name="publishSyncThenBlockOnCompletion-org.apache.htrace.core.TraceScope-">
+<a name="publishSyncThenBlockOnCompletion-org.apache.htrace.core.TraceScope-boolean-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>publishSyncThenBlockOnCompletion</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.706">publishSyncThenBlockOnCompletion</a>(org.apache.htrace.core.TraceScope&nbsp;scope)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.711">publishSyncThenBlockOnCompletion</a>(org.apache.htrace.core.TraceScope&nbsp;scope,
+                                              boolean&nbsp;forceSync)
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -865,7 +891,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogReplication</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.720">getLogReplication</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.725">getLogReplication</a>()</pre>
 <div class="block">This method gets the datanode replication count for the current WAL.
  <p>
  If the pipeline isn't started yet or is empty, you will get the default replication factor.
@@ -883,7 +909,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockList">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.733">sync</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.738">sync</a>()
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync--">WAL</a></code></span></div>
 <div class="block">Sync what we have in the WAL.</div>
@@ -893,13 +919,30 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 </dl>
 </li>
 </ul>
+<a name="sync-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>sync</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.743">sync</a>(boolean&nbsp;forceSync)
+          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>forceSync</code> - Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush
+          vs hsync.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="sync-long-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.740">sync</a>(long&nbsp;txid)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.750">sync</a>(long&nbsp;txid)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-">WAL</a></code></span></div>
 <div class="block">Sync the WAL if the txId was not already sync'd.</div>
@@ -911,13 +954,32 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 </dl>
 </li>
 </ul>
+<a name="sync-long-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>sync</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.755">sync</a>(long&nbsp;txid,
+                 boolean&nbsp;forceSync)
+          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>txid</code> - Transaction id to sync to.</dd>
+<dd><code>forceSync</code> - Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush
+          vs hsync.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="isLowReplicationRollEnabled--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>isLowReplicationRollEnabled</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.751">isLowReplicationRollEnabled</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.766">isLowReplicationRollEnabled</a>()</pre>
 </li>
 </ul>
 <a name="getPipeline--">
@@ -926,7 +988,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getPipeline</h4>
-<pre>org.apache.hadoop.hdfs.protocol.DatanodeInfo[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.1096">getPipeline</a>()</pre>
+<pre>org.apache.hadoop.hdfs.protocol.DatanodeInfo[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#line.1111">getPipeline</a>()</pre>
 <div class="block">This method gets the pipeline for the current WAL.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
index 9af1bfb..c033e4c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
@@ -219,7 +219,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#sync--">sync</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#sync-boolean-">sync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 <tr id="i6" class="altColor">
 <td class="colFirst"><code>protected long</code></td>
@@ -353,17 +353,17 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 </dl>
 </li>
 </ul>
-<a name="sync--">
+<a name="sync-boolean-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.75">sync</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.75">sync</a>(boolean&nbsp;forceSync)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync--">sync</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a></code></dd>
+<dd><code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync-boolean-">sync</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a></code></dd>
 <dt><span class="throwsLabel">Throws:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
 </dl>
@@ -375,7 +375,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 <ul class="blockList">
 <li class="blockList">
 <h4>getStream</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FSDataOutputStream&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.82">getStream</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FSDataOutputStream&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.86">getStream</a>()</pre>
 </li>
 </ul>
 <a name="initOutput-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-boolean-int-short-long-">
@@ -384,7 +384,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 <ul class="blockList">
 <li class="blockList">
 <h4>initOutput</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.88">initOutput</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.92">initOutput</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                           org.apache.hadoop.fs.Path&nbsp;path,
                           boolean&nbsp;overwritable,
                           int&nbsp;bufferSize,
@@ -407,7 +407,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMagicAndWALHeader</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.100">writeMagicAndWALHeader</a>(byte[]&nbsp;magic,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.107">writeMagicAndWALHeader</a>(byte[]&nbsp;magic,
                                       org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALHeader&nbsp;header)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractProtobufLogWriter.html#writeMagicAndWALHeader-byte:A-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALHeader-">AbstractProtobufLogWriter</a></code></span></div>
@@ -426,7 +426,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputStreamForCellEncoder</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.107">getOutputStreamForCellEncoder</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/OutputStream.html?is-external=true" title="class or interface in java.io">OutputStream</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.114">getOutputStreamForCellEncoder</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractProtobufLogWriter.html#getOutputStreamForCellEncoder--">getOutputStreamForCellEncoder</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractProtobufLogWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractProtobufLogWriter</a></code></dd>
@@ -439,7 +439,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/FSHLogProvider
 <ul class="blockListLast">
 <li class="blockList">
 <h4>writeWALTrailerAndMagic</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.112">writeWALTrailerAndMagic</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALTrailer&nbsp;trailer,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#line.119">writeWALTrailerAndMagic</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALTrailer&nbsp;trailer,
                                        byte[]&nbsp;magic)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.html
index ea1bf6e..5558f45 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.html
@@ -213,7 +213,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Prot
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">ProtobufLogWriter</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#append-org.apache.hadoop.hbase.wal.WAL.Entry-">append</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#close--">close</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#getOutputStreamForCellEncoder--">getOutputStreamForCellEncoder</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#getStream--">getStream</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#initOutput-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-boolean-int-short-long-">initOutput</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#sync--">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#writeMagicAndWALHeader-byte:A-org.apache.hadoop.hba
 se.shaded.protobuf.generated.WALProtos.WALHeader-">writeMagicAndWALHeader</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#writeWALTrailerAndMagic-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALTrailer-byte:A-">writeWALTrailerAndMagic</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#append-org.apache.hadoop.hbase.wal.WAL.Entry-">append</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#close--">close</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#getOutputStreamForCellEncoder--">getOutputStreamForCellEncoder</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#getStream--">getStream</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#initOutput-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-boolean-int-short-long-">initOutput</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#sync-boolean-">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#writeMagicAndWALHeader-byte:A-org.apache.had
 oop.hbase.shaded.protobuf.generated.WALProtos.WALHeader-">writeMagicAndWALHeader</a>, <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#writeWALTrailerAndMagic-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALTrailer-byte:A-">writeWALTrailerAndMagic</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractProtobufLogWriter">


[29/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a name="line.700"><

<TRUNCATED>

[20/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a name="line.700"></a>
-

<TRUNCATED>

[30/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">

<TRUNCATED>

[21/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RowLockImpl.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a name="line.700"><

<TRUNCATED>

[09/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
index 9971079..03c8b000 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SyncRunner.html
@@ -49,1067 +49,1082 @@
 <span class="sourceLineNo">041</span>import org.apache.hadoop.fs.Path;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.htrace.core.TraceScope;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.slf4j.Logger;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.slf4j.LoggerFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The default implementation of FSWAL.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>@InterfaceAudience.Private<a name="line.66"></a>
-<span class="sourceLineNo">067</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  // IMPLEMENTATION NOTES:<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  //<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  // high writes/syncs.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  //<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // the region edit/sequence id after the append returns.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  //<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // the futures when done.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  //<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  //<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  //<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * flushed out before we exit.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private FSDataOutputStream hdfs_out;<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  // All about log rolling if not enough replicas outstanding.<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final int minTolerableReplication;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // If live datanode count is lower than the default replicas value,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private final int lowReplicationRollLimit;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // then disable the rolling in checkLowReplication().<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  // Enable it if the replications recover.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /** Number of log close errors tolerated before we abort */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private final int closeErrorsTolerated;<a name="line.146"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.htrace.core.TraceScope;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * The default implementation of FSWAL.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>@InterfaceAudience.Private<a name="line.67"></a>
+<span class="sourceLineNo">068</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  // IMPLEMENTATION NOTES:<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  //<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  // high writes/syncs.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  //<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // the region edit/sequence id after the append returns.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  //<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  //<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // the futures when done.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  //<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  //<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  //<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   */<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * flushed out before we exit.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private FSDataOutputStream hdfs_out;<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  // All about log rolling if not enough replicas outstanding.<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private final int minTolerableReplication;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private final boolean useHsync;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // If live datanode count is lower than the default replicas value,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private final int lowReplicationRollLimit;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  // then disable the rolling in checkLowReplication().<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  // Enable it if the replications recover.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.146"></a>
 <span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * using our logger instead of java native logger.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throw new RuntimeException(ex);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void handleOnStartException(Throwable ex) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      LOG.error(ex.toString(), ex);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      throw new RuntimeException(ex);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      LOG.error(ex.toString(), ex);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new RuntimeException(ex);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * Constructor.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param fs filesystem handle<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param root path for stored and archived wals<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param logDir dir where wals are stored<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf configuration to use<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  /**<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * by the time the WAL object is started up.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param fs filesystem handle<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir path to where logs and oldlogs<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param logDir dir where wals are stored<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @param archiveDir dir where wals are archived<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * @param conf configuration to use<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   *          exist.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      5);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    rollWriter();<a name="line.216"></a>
+<span class="sourceLineNo">148</span>  /** Number of log close errors tolerated before we abort */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private final int closeErrorsTolerated;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * using our logger instead of java native logger.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throw new RuntimeException(ex);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    public void handleOnStartException(Throwable ex) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.error(ex.toString(), ex);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException(ex);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(ex.toString(), ex);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new RuntimeException(ex);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Constructor.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param fs filesystem handle<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param root path for stored and archived wals<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param logDir dir where wals are stored<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param conf configuration to use<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * by the time the WAL object is started up.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param fs filesystem handle<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param rootDir path to where logs and oldlogs<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @param logDir dir where wals are stored<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param archiveDir dir where wals are archived<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param conf configuration to use<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          exist.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      5);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // put on the ring buffer.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // spinning as other strategies do.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.disruptor.getRingBuffer().next();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    this.disruptor.start();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * removed.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @return null if underlying stream is not ready.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  OutputStream getOutputStream() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Run a sync after opening to set up the pipeline.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    long startTimeNanos = System.nanoTime();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    try {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      nextWriter.sync();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    } catch (IOException e) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // optimization failed, no need to abort here.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * methods like rollWriter().<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return Writer instance<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    return writer;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @see #beforeWaitOnSafePoint()<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected void afterCreatingZigZagLatch() {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @see #afterCreatingZigZagLatch()<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  protected void beforeWaitOnSafePoint() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    writer.append(entry);<a name="line.297"></a>
+<span class="sourceLineNo">218</span>    this.useHsync = conf.getBoolean(HRegion.WAL_HSYNC_CONF_KEY, HRegion.DEFAULT_WAL_HSYNC);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // put on the ring buffer.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // spinning as other strategies do.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    this.disruptor.getRingBuffer().next();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    this.disruptor.start();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * removed.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @return null if underlying stream is not ready.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  @VisibleForTesting<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  OutputStream getOutputStream() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Run a sync after opening to set up the pipeline.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long startTimeNanos = System.nanoTime();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      nextWriter.sync(useHsync);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } catch (IOException e) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      // optimization failed, no need to abort here.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * methods like rollWriter().<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return Writer instance<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return writer;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @see #beforeWaitOnSafePoint()<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  protected void afterCreatingZigZagLatch() {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @see #afterCreatingZigZagLatch()<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  protected void beforeWaitOnSafePoint() {<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  }<a name="line.298"></a>
 <span class="sourceLineNo">299</span><a name="line.299"></a>
 <span class="sourceLineNo">300</span>  @Override<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // here; allow for that.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SyncFuture syncFuture = null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    long sequence = -1L;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.ringBufferEventHandler != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Considering below sequence<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // on safePointReleasedLatch<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      sequence = getSequenceOnRingBuffer();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    afterCreatingZigZagLatch();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    try {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      try {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        if (zigzagLatch != null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          // use assert to make sure no change breaks the logic that<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          // sequence and zigzagLatch will be set together<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence));<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      } catch (FailedSyncBeforeLogCloseException e) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        // If unflushed/unsynced entries on close, it is reason to abort.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        if (isUnflushedEntries()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          throw e;<a name="line.340"></a>
+<span class="sourceLineNo">301</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    writer.append(entry);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  @Override<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // here; allow for that.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    SyncFuture syncFuture = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    long sequence = -1L;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    if (this.ringBufferEventHandler != null) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Considering below sequence<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // on safePointReleasedLatch<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      sequence = getSequenceOnRingBuffer();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    afterCreatingZigZagLatch();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        if (zigzagLatch != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          // use assert to make sure no change breaks the logic that<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          // sequence and zigzagLatch will be set together<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence, false));<a name="line.340"></a>
 <span class="sourceLineNo">341</span>        }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        LOG.warn(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          "Failed sync-before-close but no outstanding appends; closing WAL" + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      long oldFileLen = 0L;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      // It is at the safe point. Swap out writer from under the blocked writer thread.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // TODO: This is close is inline with critical section. Should happen in background?<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      if (this.writer != null) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        oldFileLen = this.writer.getLength();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        try {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          TraceUtil.addTimelineAnnotation("closing writer");<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          this.writer.close();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          TraceUtil.addTimelineAnnotation("writer closed");<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          this.closeErrorCount.set(0);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          int errors = closeErrorCount.incrementAndGet();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (!isUnflushedEntries() &amp;&amp; (errors &lt;= this.closeErrorsTolerated)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            LOG.warn("Riding over failed WAL close of " + oldPath + ", cause=\"" + ioe.getMessage()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                + "\", errors=" + errors<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                + "; THIS FILE WAS NOT CLOSED BUT ALL EDITS SYNCED SO SHOULD BE OK");<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          } else {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            throw ioe;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        }<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      logRollAndSetupWalProps(oldPath, newPath, oldFileLen);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      this.writer = nextWriter;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (nextWriter != null &amp;&amp; nextWriter instanceof ProtobufLogWriter) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        this.hdfs_out = ((ProtobufLogWriter) nextWriter).getStream();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        this.hdfs_out = null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    } catch (InterruptedException ie) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Perpetuate the interrupt<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      Thread.currentThread().interrupt();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    } catch (IOException e) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      long count = getUnflushedEntriesCount();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      LOG.error("Failed close of WAL writer " + oldPath + ", unflushedEntries=" + count, e);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new FailedLogCloseException(oldPath + ", unflushedEntries=" + count, e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } finally {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      // Let the writer thread go regardless, whether error or not.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (zigzagLatch != null) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        zigzagLatch.releaseSafePoint();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // syncFuture will be null if we failed our wait on safe point above. Otherwise, if<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // latch was obtained successfully, the sync we threw in either trigger the latch or it<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // got stamped with an exception because the WAL was damaged and we could not sync. Now<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        // the write pipeline has been opened up again by releasing the safe point, process the<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        // syncFuture we got above. This is probably a noop but it may be stale exception from<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // when old WAL was in place. Catch it if so.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if (syncFuture != null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            blockOnSync(syncFuture);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          } catch (IOException ioe) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>              LOG.trace("Stale sync exception", ioe);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  @Override<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected void doShutdown() throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // Shutdown the disruptor. Will stop after all entries have been processed. Make sure we<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    // have stopped incoming appends before calling this else it will not shutdown. We are<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // conservative below waiting a long time and if not elapsed, then halting.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    if (this.disruptor != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      long timeoutms = conf.getLong("hbase.wal.disruptor.shutdown.timeout.ms", 60000);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        this.disruptor.shutdown(timeoutms, TimeUnit.MILLISECONDS);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      } catch (TimeoutException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        LOG.warn("Timed out bringing down disruptor after " + timeoutms + "ms; forcing halt "<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            + "(It is a problem if this is NOT an ABORT! -- DATALOSS!!!!)");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        this.disruptor.halt();<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        this.disruptor.shutdown();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (LOG.isDebugEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      LOG.debug("Closing WAL writer in " + FSUtils.getPath(walDir));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    if (this.writer != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.writer.close();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      this.writer = null;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_NULL_ON_SOME_PATH_EXCEPTION",<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      justification = "Will never be null")<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public long append(final RegionInfo hri, final WALKeyImpl key, final WALEdit edits,<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      final boolean inMemstore) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return stampSequenceIdAndPublishToRingBuffer(hri, key, edits, inMemstore,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      disruptor.getRingBuffer());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /**<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * Thread to runs the hdfs sync call. This call takes a while to complete. This is the longest<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * pole adding edits to the WAL and this must complete to be sure all edits persisted. We run<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * multiple threads sync'ng rather than one that just syncs in series so we have better latencies;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * otherwise, an edit that arrived just after a sync started, might have to wait almost the length<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * of two sync invocations before it is marked done.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * &lt;p&gt;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * When the sync completes, it marks all the passed in futures done. On the other end of the sync<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * future is a blocked thread, usually a regionserver Handler. There may be more than one future<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   * passed in the case where a few threads arrive at about the same time and all invoke 'sync'. In<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   * this case we'll batch up the invocations and run one filesystem sync only for a batch of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Handler sync invocations. Do not confuse these Handler SyncFutures with the futures an<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * ExecutorService returns when you call submit. We have no use for these in this model. These<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * SyncFutures are 'artificial', something to hold the Handler until the filesystem sync<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * completes.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private class SyncRunner extends HasThread {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    private volatile long sequence;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // Keep around last exception thrown. Clear on successful sync.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final BlockingQueue&lt;SyncFuture&gt; syncFutures;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private volatile SyncFuture takeSyncFuture = null;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    SyncRunner(final String name, final int maxHandlersCount) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      super(name);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // LinkedBlockingQueue because of<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Could use other blockingqueues here or concurrent queues.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      //<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      // We could let the capacity be 'open' but bound it so we get alerted in pathological case<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      // where we cannot sync and we have a bunch of threads all backed up waiting on their syncs<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      // to come in. LinkedBlockingQueue actually shrinks when you remove elements so Q should<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      // stay neat and tidy in usual case. Let the max size be three times the maximum handlers.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      // The passed in maxHandlerCount is the user-level handlers which is what we put up most of<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      // but HBase has other handlers running too -- opening region handlers which want to write<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      // the meta table when succesful (i.e. sync), closing handlers -- etc. These are usually<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      // much fewer in number than the user-space handlers so Q-size should be user handlers plus<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      // some space for these other handlers. Lets multiply by 3 for good-measure.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this.syncFutures = new LinkedBlockingQueue&lt;&gt;(maxHandlersCount * 3);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    void offer(final long sequence, final SyncFuture[] syncFutures, final int syncFutureCount) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Set sequence first because the add to the queue will wake the thread if sleeping.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      this.sequence = sequence;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      for (int i = 0; i &lt; syncFutureCount; ++i) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        this.syncFutures.add(syncFutures[i]);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * Release the passed &lt;code&gt;syncFuture&lt;/code&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * @return Returns 1.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    private int releaseSyncFuture(final SyncFuture syncFuture, final long currentSequence,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        final Throwable t) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!syncFuture.done(currentSequence, t)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        throw new IllegalStateException();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // This function releases one sync future only.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      return 1;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    /**<a name="line.500"></a>
-<span class="sourceLineNo">501</span>     * Release all SyncFutures whose sequence is &lt;= &lt;code&gt;currentSequence&lt;/code&gt;.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>     * @param t May be non-null if we are processing SyncFutures because an exception was thrown.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>     * @return Count of SyncFutures we let go.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>     */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    private int releaseSyncFutures(final long currentSequence, final Throwable t) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      int syncCount = 0;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      for (SyncFuture syncFuture; (syncFuture = this.syncFutures.peek()) != null;) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (syncFuture.getTxid() &gt; currentSequence) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        releaseSyncFuture(syncFuture, currentSequence, t);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        if (!this.syncFutures.remove(syncFuture)) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          throw new IllegalStateException(syncFuture.toString());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        syncCount++;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      return syncCount;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    /**<a name="line.520"></a>
-<span class="sourceLineNo">521</span>     * @param sequence The sequence we ran the filesystem sync against.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>     * @return Current highest synced sequence.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>     */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    private long updateHighestSyncedSequence(long sequence) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      long currentHighestSyncedSequence;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // Set the highestSyncedSequence IFF our current sequence id is the 'highest'.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      do {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        if (currentHighestSyncedSequence &gt;= sequence) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          // Set the sync number to current highwater mark; might be able to let go more<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // queued sync futures<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          sequence = currentHighestSyncedSequence;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          break;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } while (!highestSyncedTxid.compareAndSet(currentHighestSyncedSequence, sequence));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      return sequence;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    boolean areSyncFuturesReleased() {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // check whether there is no sync futures offered, and no in-flight sync futures that is being<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // processed.<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      return syncFutures.size() &lt;= 0<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          &amp;&amp; takeSyncFuture == null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>    @Override<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    public void run() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      long currentSequence;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      while (!isInterrupted()) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        int syncCount = 0;<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>        try {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          while (true) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>            takeSyncFuture = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>            // We have to process what we 'take' from the queue<a name="line.555"></a>
-<span class="sourceLineNo">556</span>            takeSyncFuture = this.syncFutures.take();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            currentSequence = this.sequence;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>            long syncFutureSequence = takeSyncFuture.getTxid();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>            if (syncFutureSequence &gt; currentSequence) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              throw new IllegalStateException("currentSequence=" + currentSequence<a name="line.560"></a>
-<span class="sourceLineNo">561</span>                  + ", syncFutureSequence=" + syncFutureSequence);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            // See if we can process any syncfutures BEFORE we go sync.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            long currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            if (currentSequence &lt; currentHighestSyncedSequence) {<a name="line.565"></a>
-<

<TRUNCATED>

[23/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sour

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */

<TRUNCATED>

[17/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
index 9ee12ef..4c42811 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
@@ -51,889 +51,893 @@
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.44"></a>
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.HRegion.FlushResult;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.htrace.core.TraceScope;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * Thread that flushes cache on request<a name="line.61"></a>
-<span class="sourceLineNo">062</span> *<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * sleep time which is invariant.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * @see FlushRequester<a name="line.67"></a>
-<span class="sourceLineNo">068</span> */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>@InterfaceAudience.Private<a name="line.69"></a>
-<span class="sourceLineNo">070</span>class MemStoreFlusher implements FlushRequester {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private Configuration conf;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // These two data members go together.  Any entry in the one must have<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // a corresponding entry in the other.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private final long threadWakeFrequency;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private final HRegionServer server;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private final Object blockSignal = new Object();<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private long blockingWaitTime;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private final FlushHandler[] flushHandlers;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private FlushType flushType;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  /**<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public long getDelay(TimeUnit unit) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      return 0;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public int compareTo(Delayed o) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      return -1;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public boolean equals(Object obj) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return obj == this;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public int hashCode() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return 42;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  };<a name="line.116"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.htrace.core.TraceScope;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * Thread that flushes cache on request<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * sleep time which is invariant.<a name="line.64"></a>
+<span class="sourceLineNo">065</span> *<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * @see FlushRequester<a name="line.66"></a>
+<span class="sourceLineNo">067</span> */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>@InterfaceAudience.Private<a name="line.68"></a>
+<span class="sourceLineNo">069</span>class MemStoreFlusher implements FlushRequester {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private Configuration conf;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // These two data members go together.  Any entry in the one must have<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // a corresponding entry in the other.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final long threadWakeFrequency;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final HRegionServer server;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private final Object blockSignal = new Object();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private long blockingWaitTime;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      return 0;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
 <span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param conf<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param server<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public MemStoreFlusher(final Configuration conf,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      final HRegionServer server) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    super();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.conf = conf;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.server = server;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    this.threadWakeFrequency =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      90000);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    LOG.info("globalMemStoreLimit="<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        + TraditionalBinaryPrefix<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        + ", globalMemStoreLimitLowMark="<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        + TraditionalBinaryPrefix.long2String(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        + ", Offheap="<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    return this.updatesBlockedMsHighWater;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public void setFlushType(FlushType flushType) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.flushType = flushType;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * flush thread)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @return true if successful<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private boolean flushOneForGlobalPressure() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    switch(flushType) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        break;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      default:<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>    double secondaryMultiplier<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    boolean flushedOne = false;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    while (!flushedOne) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      HRegion bestFlushableRegion =<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // Find the biggest region that is a secondary region<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      if (bestAnyRegion == null) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        bestAnyRegion = bestRegionReplica;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return false;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>      HRegion regionToFlush;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      long bestAnyRegionSize;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      long bestFlushableRegionSize;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      switch(flushType) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          break;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          break;<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        default:<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        // life worse!<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (LOG.isDebugEnabled()) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.219"></a>
-<span class="sourceLineNo">220</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              + " has too many " + "store files, but is "<a name="line.221"></a>
-<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.222"></a>
-<span class="sourceLineNo">223</span>              + " vs best flushable region's "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + TraditionalBinaryPrefix.long2String(<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              bestFlushableRegionSize, "", 1)<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + ". Choosing the bigger.");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        regionToFlush = bestAnyRegion;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (bestFlushableRegion == null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          regionToFlush = bestAnyRegion;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          regionToFlush = bestFlushableRegion;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>      long regionToFlushSize;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      long bestRegionReplicaSize;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      switch(flushType) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          break;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          break;<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>        default:<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>      Preconditions.checkState(<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        (regionToFlush != null &amp;&amp; regionToFlushSize &gt; 0) || bestRegionReplicaSize &gt; 0);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (regionToFlush == null ||<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          (bestRegionReplica != null &amp;&amp;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.264"></a>
-<span class="sourceLineNo">265</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            TraditionalBinaryPrefix.long2String(<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (!flushedOne) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.272"></a>
-<span class="sourceLineNo">273</span>              " - trying to find a different region to refresh files.");<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          excludedRegions.add(bestRegionReplica);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      } else {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            "Flush type=" + flushType.toString() +<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            "Total Memstore Heap size=" +<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            TraditionalBinaryPrefix.long2String(<a name="line.280"></a>
-<span class="sourceLineNo">281</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            "Total Memstore Off-Heap size=" +<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
-<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            ", Region memstore size=" +<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (!flushedOne) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>              " - trying to find a different region to flush.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          excludedRegions.add(regionToFlush);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return true;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  private class FlushHandler extends HasThread {<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    private FlushHandler(String name) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      super(name);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    LOG.info("globalMemStoreLimit="<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        + TraditionalBinaryPrefix<a name="line.134"></a>
+<span class="sourceLineNo">135</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        + ", globalMemStoreLimitLowMark="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix.long2String(<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", Offheap="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    return this.updatesBlockedMsHighWater;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void setFlushType(FlushType flushType) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.flushType = flushType;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * flush thread)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @return true if successful<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private boolean flushOneForGlobalPressure() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    switch(flushType) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        break;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      default:<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    double secondaryMultiplier<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    boolean flushedOne = false;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    while (!flushedOne) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      HRegion bestFlushableRegion =<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Find the biggest region that is a secondary region<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      if (bestAnyRegion == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        bestAnyRegion = bestRegionReplica;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      if (bestAnyRegion == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return false;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>      HRegion regionToFlush;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestAnyRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      long bestFlushableRegionSize;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      switch(flushType) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          break;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          break;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>        default:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        // life worse!<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        if (LOG.isDebugEnabled()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + " has too many " + "store files, but is "<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " vs best flushable region's "<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              + TraditionalBinaryPrefix.long2String(<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              bestFlushableRegionSize, "", 1)<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              + ". Choosing the bigger.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        regionToFlush = bestAnyRegion;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      } else {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        if (bestFlushableRegion == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          regionToFlush = bestAnyRegion;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          regionToFlush = bestFlushableRegion;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long regionToFlushSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      long bestRegionReplicaSize;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      switch(flushType) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          break;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          break;<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>        default:<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return false;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (regionToFlush == null ||<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          (bestRegionReplica != null &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            TraditionalBinaryPrefix.long2String(<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        if (!flushedOne) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.276"></a>
+<span class="sourceLineNo">277</span>              " - trying to find a different region to refresh files.");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          excludedRegions.add(bestRegionReplica);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      } else {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            "Flush type=" + flushType.toString() +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            "Total Memstore Heap size=" +<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            TraditionalBinaryPrefix.long2String(<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            "Total Memstore Off-Heap size=" +<a name="line.286"></a>
+<span class="sourceLineNo">287</span>            TraditionalBinaryPrefix.long2String(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            ", Region memstore size=" +<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (!flushedOne) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.294"></a>
+<span class="sourceLineNo">295</span>              " - trying to find a different region to flush.");<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          excludedRegions.add(regionToFlush);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return true;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private class FlushHandler extends HasThread {<a name="line.324"></a>
 <span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public void run() {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      while (!server.isStopped()) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        FlushQueueEntry fqe = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>            FlushType type = isAboveLowWaterMark();<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            if (type != FlushType.NORMAL) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.337"></a>
-<span class="sourceLineNo">338</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              // we still select the regions based on the region's memstore data size.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              // it per region.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>              if (!flushOneForGlobalPressure()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                // This is unlikely to happen, but might happen when closing the<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                // entire server - another thread is flushing regions. We'll just<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                // we flushed one, so anyone blocked will check again<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                Thread.sleep(1000);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>                wakeUpIfBlocking();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.352"></a>
-<span class="sourceLineNo">353</span>              wakeupFlushThread();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          if (!flushRegion(fre)) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            break;<a name="line.359"></a>
+<span class="sourceLineNo">326</span>    private FlushHandler(String name) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      super(name);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    public void run() {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      while (!server.isStopped()) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        FlushQueueEntry fqe = null;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            FlushType type = isAboveLowWaterMark();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            if (type != FlushType.NORMAL) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // we still select the regions based on the region's memstore data size.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              // it per region.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              if (!flushOneForGlobalPressure()) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // This is unlikely to happen, but might happen when closing the<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // entire server - another thread is flushing regions. We'll just<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                // we flushed one, so anyone blocked will check again<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                Thread.sleep(1000);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                wakeUpIfBlocking();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              wakeupFlushThread();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            continue;<a name="line.359"></a>
 <span class="sourceLineNo">360</span>          }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        } catch (InterruptedException ex) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          continue;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        } catch (ConcurrentModificationException ex) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        } catch (Exception ex) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!server.checkFileSystem()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      synchronized (regionsInQueue) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>        regionsInQueue.clear();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        flushQueue.clear();<a name="line.374"></a>
+<span class="sourceLineNo">361</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          if (!flushRegion(fre)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>            break;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        } catch (InterruptedException ex) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          continue;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        } catch (ConcurrentModificationException ex) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          continue;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        } catch (Exception ex) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>          if (!server.checkFileSystem()) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>            break;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
 <span class="sourceLineNo">375</span>      }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>      // Signal anyone waiting, so they see the close flag<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      wakeUpIfBlocking();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      LOG.info(getName() + " exiting");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private void wakeupFlushThread() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private HRegion getBiggestMemStoreRegion(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      boolean checkStoreFileCount) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    synchronized (regionsInQueue) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        for (HRegion region : entry.getValue()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          if (excludedRegions.contains(region)) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            continue;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.401"></a>
+<span class="sourceLineNo">376</span>      synchronized (regionsInQueue) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        regionsInQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        flushQueue.clear();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>      // Signal anyone waiting, so they see the close flag<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      wakeUpIfBlocking();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      LOG.info(getName() + " exiting");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private void wakeupFlushThread() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private HRegion getBiggestMemStoreRegion(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      boolean checkStoreFileCount) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    synchronized (regionsInQueue) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        for (HRegion region : entry.getValue()) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          if (excludedRegions.contains(region)) {<a name="line.401"></a>
 <span class="sourceLineNo">402</span>            continue;<a name="line.402"></a>
 <span class="sourceLineNo">403</span>          }<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.405"></a>
+<span class="sourceLineNo">405</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.405"></a>
 <span class="sourceLineNo">406</span>            continue;<a name="line.406"></a>
 <span class="sourceLineNo">407</span>          }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          return region;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return null;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    synchronized (regionsInQueue) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        for (HRegion region : entry.getValue()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (excludedRegions.contains(region)) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.425"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            continue;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          return region;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return null;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    synchronized (regionsInQueue) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        for (HRegion region : entry.getValue()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          if (excludedRegions.contains(region)) {<a name="line.425"></a>
 <span class="sourceLineNo">426</span>            continue;<a name="line.426"></a>
 <span class="sourceLineNo">427</span>          }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return region;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    return null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    try {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      return region.refreshStoreFiles();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    } catch (IOException e) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return false;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  /**<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * Return true if global memory usage is above the high watermark<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private FlushType isAboveHighWaterMark() {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Return true if we're above the low watermark<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private FlushType isAboveLowWaterMark() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    r.incrementFlushesQueuedCount();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    synchronized (regionsInQueue) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        // queue. It'll come out near immediately.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        this.regionsInQueue.put(r, fqe);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        this.flushQueue.add(fqe);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    r.incrementFlushesQueuedCount();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    synchronized (regionsInQueue) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        // This entry has some delay<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        FlushRegionEntry fqe =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        fqe.requeue(delay);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        this.regionsInQueue.put(r, fqe);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        this.flushQueue.add(fqe);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public int getFlushQueueSize() {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return flushQueue.size();<a name="line.490"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            continue;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return region;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    try {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      return region.refreshStoreFiles();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    } catch (IOException e) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return false;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * Return true if global memory usage is above the high watermark<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private FlushType isAboveHighWaterMark() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * Return true if we're above the low watermark<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private FlushType isAboveLowWaterMark() {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    r.incrementFlushesQueuedCount();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (regionsInQueue) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        // queue. It'll come out near immediately.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.regionsInQueue.put(r, fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        this.flushQueue.add(fqe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      } else {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  @Override<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    r.incrementFlushesQueuedCount();<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    synchronized (regionsInQueue) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        // This entry has some delay<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushRegionEntry fqe =<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        fqe.requeue(delay);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        this.regionsInQueue.put(r, fqe);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.flushQueue.add(fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
 <span class="sourceLineNo">491</span>  }<a name="line.491"></a>
 <span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /**<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  void interruptIfNecessary() {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    lock.writeLock().lock();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    try {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        if (flushHander != null) flushHander.interrupt();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    } finally {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      lock.writeLock().unlock();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.510"></a>
-<span class="sourceLineNo">511</sp

<TRUNCATED>

[40/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
index 44eae49..c6b0dd4 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -154,20 +154,24 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#forceSync">forceSync</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#NOT_DONE">NOT_DONE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#t">t</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#throwable">throwable</a></span></code>
 <div class="block">If error, the associated throwable.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#txid">txid</a></span></code>
 <div class="block">The transaction id of this operation, monotonically increases.</div>
@@ -232,15 +236,23 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i6" class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#isThrowable--">isThrowable</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#isForceSync--">isForceSync</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i7" class="rowColor">
+<td class="colFirst"><code>(package private) boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#isThrowable--">isThrowable</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#reset-long-">reset</a></span>(long&nbsp;txid)</code>
 <div class="block">Call this method to clear old usage and get it ready for new deploy.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#setForceSync-boolean-">setForceSync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
@@ -313,12 +325,21 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="t">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>t</h4>
 <pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.68">t</a></pre>
 </li>
 </ul>
+<a name="forceSync">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>forceSync</h4>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.70">forceSync</a></pre>
+</li>
+</ul>
 </li>
 </ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
@@ -350,7 +371,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reset</h4>
-<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.77">reset</a>(long&nbsp;txid)</pre>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.79">reset</a>(long&nbsp;txid)</pre>
 <div class="block">Call this method to clear old usage and get it ready for new deploy.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -368,7 +389,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.92">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.94">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -381,7 +402,25 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTxid</h4>
-<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.96">getTxid</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.98">getTxid</a>()</pre>
+</li>
+</ul>
+<a name="isForceSync--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>isForceSync</h4>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.102">isForceSync</a>()</pre>
+</li>
+</ul>
+<a name="setForceSync-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setForceSync</h4>
+<pre><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.106">setForceSync</a>(boolean&nbsp;forceSync)</pre>
 </li>
 </ul>
 <a name="done-long-java.lang.Throwable-">
@@ -390,7 +429,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.106">done</a>(long&nbsp;txid,
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.117">done</a>(long&nbsp;txid,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -408,7 +447,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cancel</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.125">cancel</a>(boolean&nbsp;mayInterruptIfRunning)</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.136">cancel</a>(boolean&nbsp;mayInterruptIfRunning)</pre>
 </li>
 </ul>
 <a name="get-long-">
@@ -417,7 +456,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.129">get</a>(long&nbsp;timeoutNs)
+<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.140">get</a>(long&nbsp;timeoutNs)
   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a>,
          <a href="../../../../../../org/apache/hadoop/hbase/exceptions/TimeoutIOException.html" title="class in org.apache.hadoop.hbase.exceptions">TimeoutIOException</a></pre>
@@ -435,7 +474,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isDone</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.146">isDone</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.157">isDone</a>()</pre>
 </li>
 </ul>
 <a name="isThrowable--">
@@ -444,7 +483,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isThrowable</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.150">isThrowable</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.161">isThrowable</a>()</pre>
 </li>
 </ul>
 <a name="getThrowable--">
@@ -453,7 +492,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getThrowable</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.154">getThrowable</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#line.165">getThrowable</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/SyncFuture.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/SyncFuture.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/SyncFuture.html
index 5b92f1c..570fe0c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/SyncFuture.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/SyncFuture.html
@@ -158,11 +158,12 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
-<td class="colLast"><span class="typeNameLabel">FSHLog.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer--">publishSyncOnRingBuffer</a></span>()</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">FSHLog.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-boolean-">publishSyncOnRingBuffer</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
-<td class="colLast"><span class="typeNameLabel">FSHLog.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-long-">publishSyncOnRingBuffer</a></span>(long&nbsp;sequence)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">FSHLog.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-long-boolean-">publishSyncOnRingBuffer</a></span>(long&nbsp;sequence,
+                       boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
@@ -172,11 +173,15 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
+<td class="colLast"><span class="typeNameLabel">SyncFuture.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#setForceSync-boolean-">setForceSync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>(package private) <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RingBufferTruck.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html#unloadSync--">unloadSync</a></span>()</code>
 <div class="block">Unload the truck of its <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><code>SyncFuture</code></a> payload.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></code></td>
 <td class="colLast"><span class="typeNameLabel">FSHLog.SafePointZigZagLatch.</span><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html#waitSafePoint-org.apache.hadoop.hbase.regionserver.wal.SyncFuture-">waitSafePoint</a></span>(<a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)</code>
 <div class="block">For Thread A to call when it is ready to wait on the 'safe point' to be attained.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index a4ab1b7..f6fc79b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -238,8 +238,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html b/devapidocs/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
index 99ff362..0a949f1 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.82">ZKReplicationQueueStorage</a>
+class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.83">ZKReplicationQueueStorage</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/replication/ZKReplicationStorageBase.html" title="class in org.apache.hadoop.hbase.replication">ZKReplicationStorageBase</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html" title="interface in org.apache.hadoop.hbase.replication">ReplicationQueueStorage</a></pre>
 <div class="block">ZK based replication queue storage.
@@ -365,7 +365,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#getRsNode-org.apache.hadoop.hbase.ServerName-">getRsNode</a></span>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</code>&nbsp;</td>
 </tr>
 <tr id="i23" class="rowColor">
-<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#getSerialReplicationRegionPeerNode-java.lang.String-java.lang.String-">getSerialReplicationRegionPeerNode</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName,
                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</code>
 <div class="block">Put all regions under /hbase/replication/regions znode will lead to too many children because
@@ -471,7 +471,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.85">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.86">LOG</a></pre>
 </li>
 </ul>
 <a name="ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY">
@@ -480,7 +480,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.87">ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.88">ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage.ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY">Constant Field Values</a></dd>
@@ -493,7 +493,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.89">ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.90">ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage.ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT">Constant Field Values</a></dd>
@@ -506,7 +506,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.91">ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.92">ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage.ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY">Constant Field Values</a></dd>
@@ -519,7 +519,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.93">ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.94">ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage.ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT">Constant Field Values</a></dd>
@@ -532,7 +532,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>queuesZNode</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.98">queuesZNode</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.99">queuesZNode</a></pre>
 <div class="block">The name of the znode that contains all replication queues</div>
 </li>
 </ul>
@@ -542,7 +542,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>hfileRefsZNode</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.103">hfileRefsZNode</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.104">hfileRefsZNode</a></pre>
 <div class="block">The name of the znode that contains queues of hfile references to be replicated</div>
 </li>
 </ul>
@@ -552,7 +552,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionsZNode</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.105">regionsZNode</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.106">regionsZNode</a></pre>
 </li>
 </ul>
 </li>
@@ -569,7 +569,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ZKReplicationQueueStorage</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.107">ZKReplicationQueueStorage</a>(<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKWatcher</a>&nbsp;zookeeper,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.108">ZKReplicationQueueStorage</a>(<a href="../../../../../org/apache/hadoop/hbase/zookeeper/ZKWatcher.html" title="class in org.apache.hadoop.hbase.zookeeper">ZKWatcher</a>&nbsp;zookeeper,
                                  org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
@@ -587,7 +587,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getRsNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.119">getRsNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.120">getRsNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)</pre>
 </li>
 </ul>
 <a name="getQueueNode-org.apache.hadoop.hbase.ServerName-java.lang.String-">
@@ -596,7 +596,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getQueueNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.123">getQueueNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.124">getQueueNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId)</pre>
 </li>
 </ul>
@@ -606,7 +606,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.127">getFileNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueNode,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.128">getFileNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueNode,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName)</pre>
 </li>
 </ul>
@@ -616,7 +616,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.131">getFileNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.132">getFileNode</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName)</pre>
 </li>
@@ -627,18 +627,21 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getSerialReplicationRegionPeerNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.151">getSerialReplicationRegionPeerNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName,
-                                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.156">getSerialReplicationRegionPeerNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName,
+                                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 <div class="block">Put all regions under /hbase/replication/regions znode will lead to too many children because
  of the huge number of regions in real production environment. So here we use hash of encoded
  region name to distribute the znode into multiple znodes. <br>
  So the final znode path will be format like this:
 
  <pre>
- /hbase/replication/regions/254/dd04e76a6966d4ffa908ed0586764767-100
+ /hbase/replication/regions/e1/ff/dd04e76a6966d4ffa908ed0586764767-100
  </pre>
 
- The 254 indicate the hash of encoded region name, the 100 indicate the peer id.</div>
+ The e1 indicate the first level hash of encoded region name, and the ff indicate the second
+ level hash of encoded region name, the 100 indicate the peer id. <br>
+ Note that here we use two-level hash because if only one-level hash (such as mod 65535), it
+ will still lead to too many children under the /hbase/replication/regions znode.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>encodedRegionName</code> - the encoded region name.</dd>
@@ -655,7 +658,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>removeQueue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.158">removeQueue</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.168">removeQueue</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId)
                  throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#removeQueue-org.apache.hadoop.hbase.ServerName-java.lang.String-">ReplicationQueueStorage</a></code></span></div>
@@ -677,7 +680,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>addWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.168">addWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.178">addWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName)
             throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
@@ -702,7 +705,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>removeWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.179">removeWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.189">removeWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName)
                throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
@@ -726,7 +729,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>setWALPosition</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.193">setWALPosition</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.203">setWALPosition</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName,
                            long&nbsp;position,
@@ -754,7 +757,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastSequenceId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.226">getLastSequenceId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.236">getLastSequenceId</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;encodedRegionName,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                        throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getLastSequenceId-java.lang.String-java.lang.String-">ReplicationQueueStorage</a></code></span></div>
@@ -779,7 +782,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALPosition</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.246">getWALPosition</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.256">getWALPosition</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName)
                     throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
@@ -805,7 +808,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>claimQueue</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.266">claimQueue</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sourceServerName,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.276">claimQueue</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;sourceServerName,
                                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId,
                                                  <a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;destServerName)
                                           throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
@@ -831,7 +834,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>removeReplicatorIfQueueIsEmpty</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.323">removeReplicatorIfQueueIsEmpty</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.333">removeReplicatorIfQueueIsEmpty</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
                                     throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#removeReplicatorIfQueueIsEmpty-org.apache.hadoop.hbase.ServerName-">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Remove the record of region server if the queue is empty.</div>
@@ -849,7 +852,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getListOfReplicators0</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.333">getListOfReplicators0</a>()
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.343">getListOfReplicators0</a>()
                                         throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -863,7 +866,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getListOfReplicators</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.339">getListOfReplicators</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.349">getListOfReplicators</a>()
                                       throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getListOfReplicators--">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Get a list of all region servers that have outstanding replication queues. These servers could
@@ -884,7 +887,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALsInQueue0</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.347">getWALsInQueue0</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.357">getWALsInQueue0</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId)
                               throws org.apache.zookeeper.KeeperException</pre>
 <dl>
@@ -899,7 +902,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALsInQueue</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.353">getWALsInQueue</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.363">getWALsInQueue</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName,
                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;queueId)
                             throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getWALsInQueue-org.apache.hadoop.hbase.ServerName-java.lang.String-">ReplicationQueueStorage</a></code></span></div>
@@ -923,7 +926,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllQueues0</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.364">getAllQueues0</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.374">getAllQueues0</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
                             throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -937,7 +940,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllQueues</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.369">getAllQueues</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.379">getAllQueues</a>(<a href="../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;serverName)
                           throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getAllQueues-org.apache.hadoop.hbase.ServerName-">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Get a list of all queues for the specified region server.</div>
@@ -959,7 +962,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getQueuesZNodeCversion</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.379">getQueuesZNodeCversion</a>()
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.389">getQueuesZNodeCversion</a>()
                               throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -973,7 +976,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.386">getAllWALs</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.396">getAllWALs</a>()
                        throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getAllWALs--">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Load all wals in all replication queues. This method guarantees to return a snapshot which
@@ -993,7 +996,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileRefsPeerNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.413">getHFileRefsPeerNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.423">getHFileRefsPeerNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)</pre>
 </li>
 </ul>
 <a name="getHFileNode-java.lang.String-java.lang.String-">
@@ -1002,7 +1005,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileNode</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.417">getHFileNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerNode,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.427">getHFileNode</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerNode,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;fileName)</pre>
 </li>
 </ul>
@@ -1012,7 +1015,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>addPeerToHFileRefs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.422">addPeerToHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.432">addPeerToHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                         throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#addPeerToHFileRefs-java.lang.String-">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Add a peer to hfile reference queue if peer does not exist.</div>
@@ -1032,7 +1035,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>removePeerFromHFileRefs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.436">removePeerFromHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.446">removePeerFromHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                              throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#removePeerFromHFileRefs-java.lang.String-">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Remove a peer from hfile reference queue.</div>
@@ -1052,7 +1055,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>addHFileRefs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.452">addHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.462">addHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;&gt;&nbsp;pairs)
                   throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#addHFileRefs-java.lang.String-java.util.List-">ReplicationQueueStorage</a></code></span></div>
@@ -1075,7 +1078,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>removeHFileRefs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.469">removeHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.479">removeHFileRefs</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;files)
                      throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#removeHFileRefs-java.lang.String-java.util.List-">ReplicationQueueStorage</a></code></span></div>
@@ -1097,7 +1100,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllPeersFromHFileRefsQueue0</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.484">getAllPeersFromHFileRefsQueue0</a>()
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.494">getAllPeersFromHFileRefsQueue0</a>()
                                              throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1111,7 +1114,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getAllPeersFromHFileRefsQueue</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.489">getAllPeersFromHFileRefsQueue</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.499">getAllPeersFromHFileRefsQueue</a>()
                                            throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getAllPeersFromHFileRefsQueue--">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Get list of all peers from hfile reference queue.</div>
@@ -1131,7 +1134,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicableHFiles0</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.498">getReplicableHFiles0</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.508">getReplicableHFiles0</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                                    throws org.apache.zookeeper.KeeperException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1145,7 +1148,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicableHFiles</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.503">getReplicableHFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.513">getReplicableHFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                                  throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getReplicableHFiles-java.lang.String-">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Get a list of all hfile references in the given peer.</div>
@@ -1167,7 +1170,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockList">
 <li class="blockList">
 <h4>getHFileRefsZNodeCversion</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.514">getHFileRefsZNodeCversion</a>()
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.524">getHFileRefsZNodeCversion</a>()
                                  throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1181,7 +1184,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/replication/Replicati
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getAllHFileRefs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.525">getAllHFileRefs</a>()
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html#line.535">getAllHFileRefs</a>()
                             throws <a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationException.html" title="class in org.apache.hadoop.hbase.replication">ReplicationException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationQueueStorage.html#getAllHFileRefs--">ReplicationQueueStorage</a></code></span></div>
 <div class="block">Load all hfile references in all replication queues. This method guarantees to return a

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index 732825f..5efcbb8 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -199,8 +199,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index e0eb9a0..d02c856 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -137,9 +137,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index dfa02b5..7ba3a64 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,8 +191,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 0ebeeb0..2b64b99 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -198,9 +198,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
 </ul>
 </li>
 </ul>


[12/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
index 9971079..03c8b000 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferEventHandler.html
@@ -49,1067 +49,1082 @@
 <span class="sourceLineNo">041</span>import org.apache.hadoop.fs.Path;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.htrace.core.TraceScope;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.slf4j.Logger;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.slf4j.LoggerFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The default implementation of FSWAL.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>@InterfaceAudience.Private<a name="line.66"></a>
-<span class="sourceLineNo">067</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  // IMPLEMENTATION NOTES:<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  //<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  // high writes/syncs.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  //<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // the region edit/sequence id after the append returns.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  //<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // the futures when done.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  //<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  //<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  //<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * flushed out before we exit.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private FSDataOutputStream hdfs_out;<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  // All about log rolling if not enough replicas outstanding.<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final int minTolerableReplication;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // If live datanode count is lower than the default replicas value,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private final int lowReplicationRollLimit;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // then disable the rolling in checkLowReplication().<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  // Enable it if the replications recover.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /** Number of log close errors tolerated before we abort */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private final int closeErrorsTolerated;<a name="line.146"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.htrace.core.TraceScope;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * The default implementation of FSWAL.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>@InterfaceAudience.Private<a name="line.67"></a>
+<span class="sourceLineNo">068</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  // IMPLEMENTATION NOTES:<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  //<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  // high writes/syncs.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  //<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // the region edit/sequence id after the append returns.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  //<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  //<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // the futures when done.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  //<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  //<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  //<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   */<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * flushed out before we exit.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private FSDataOutputStream hdfs_out;<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  // All about log rolling if not enough replicas outstanding.<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private final int minTolerableReplication;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private final boolean useHsync;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // If live datanode count is lower than the default replicas value,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private final int lowReplicationRollLimit;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  // then disable the rolling in checkLowReplication().<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  // Enable it if the replications recover.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.146"></a>
 <span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * using our logger instead of java native logger.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throw new RuntimeException(ex);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void handleOnStartException(Throwable ex) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      LOG.error(ex.toString(), ex);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      throw new RuntimeException(ex);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      LOG.error(ex.toString(), ex);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new RuntimeException(ex);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * Constructor.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param fs filesystem handle<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param root path for stored and archived wals<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param logDir dir where wals are stored<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf configuration to use<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  /**<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * by the time the WAL object is started up.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param fs filesystem handle<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir path to where logs and oldlogs<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param logDir dir where wals are stored<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @param archiveDir dir where wals are archived<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * @param conf configuration to use<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   *          exist.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      5);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    rollWriter();<a name="line.216"></a>
+<span class="sourceLineNo">148</span>  /** Number of log close errors tolerated before we abort */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private final int closeErrorsTolerated;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * using our logger instead of java native logger.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throw new RuntimeException(ex);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    public void handleOnStartException(Throwable ex) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.error(ex.toString(), ex);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException(ex);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(ex.toString(), ex);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new RuntimeException(ex);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Constructor.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param fs filesystem handle<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param root path for stored and archived wals<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param logDir dir where wals are stored<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param conf configuration to use<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * by the time the WAL object is started up.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param fs filesystem handle<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param rootDir path to where logs and oldlogs<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @param logDir dir where wals are stored<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param archiveDir dir where wals are archived<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param conf configuration to use<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          exist.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      5);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // put on the ring buffer.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // spinning as other strategies do.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.disruptor.getRingBuffer().next();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    this.disruptor.start();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * removed.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @return null if underlying stream is not ready.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  OutputStream getOutputStream() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Run a sync after opening to set up the pipeline.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    long startTimeNanos = System.nanoTime();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    try {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      nextWriter.sync();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    } catch (IOException e) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // optimization failed, no need to abort here.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * methods like rollWriter().<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return Writer instance<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    return writer;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @see #beforeWaitOnSafePoint()<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected void afterCreatingZigZagLatch() {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @see #afterCreatingZigZagLatch()<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  protected void beforeWaitOnSafePoint() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    writer.append(entry);<a name="line.297"></a>
+<span class="sourceLineNo">218</span>    this.useHsync = conf.getBoolean(HRegion.WAL_HSYNC_CONF_KEY, HRegion.DEFAULT_WAL_HSYNC);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // put on the ring buffer.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // spinning as other strategies do.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    this.disruptor.getRingBuffer().next();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    this.disruptor.start();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * removed.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @return null if underlying stream is not ready.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  @VisibleForTesting<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  OutputStream getOutputStream() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Run a sync after opening to set up the pipeline.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long startTimeNanos = System.nanoTime();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      nextWriter.sync(useHsync);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } catch (IOException e) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      // optimization failed, no need to abort here.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * methods like rollWriter().<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return Writer instance<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return writer;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @see #beforeWaitOnSafePoint()<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  protected void afterCreatingZigZagLatch() {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @see #afterCreatingZigZagLatch()<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  protected void beforeWaitOnSafePoint() {<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  }<a name="line.298"></a>
 <span class="sourceLineNo">299</span><a name="line.299"></a>
 <span class="sourceLineNo">300</span>  @Override<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // here; allow for that.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SyncFuture syncFuture = null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    long sequence = -1L;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.ringBufferEventHandler != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Considering below sequence<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // on safePointReleasedLatch<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      sequence = getSequenceOnRingBuffer();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    afterCreatingZigZagLatch();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    try {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      try {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        if (zigzagLatch != null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          // use assert to make sure no change breaks the logic that<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          // sequence and zigzagLatch will be set together<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence));<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      } catch (FailedSyncBeforeLogCloseException e) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        // If unflushed/unsynced entries on close, it is reason to abort.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        if (isUnflushedEntries()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          throw e;<a name="line.340"></a>
+<span class="sourceLineNo">301</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    writer.append(entry);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  @Override<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // here; allow for that.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    SyncFuture syncFuture = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    long sequence = -1L;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    if (this.ringBufferEventHandler != null) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Considering below sequence<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // on safePointReleasedLatch<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      sequence = getSequenceOnRingBuffer();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    afterCreatingZigZagLatch();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        if (zigzagLatch != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          // use assert to make sure no change breaks the logic that<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          // sequence and zigzagLatch will be set together<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence, false));<a name="line.340"></a>
 <span class="sourceLineNo">341</span>        }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        LOG.warn(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          "Failed sync-before-close but no outstanding appends; closing WAL" + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      long oldFileLen = 0L;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      // It is at the safe point. Swap out writer from under the blocked writer thread.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // TODO: This is close is inline with critical section. Should happen in background?<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      if (this.writer != null) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        oldFileLen = this.writer.getLength();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        try {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          TraceUtil.addTimelineAnnotation("closing writer");<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          this.writer.close();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          TraceUtil.addTimelineAnnotation("writer closed");<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          this.closeErrorCount.set(0);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          int errors = closeErrorCount.incrementAndGet();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (!isUnflushedEntries() &amp;&amp; (errors &lt;= this.closeErrorsTolerated)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            LOG.warn("Riding over failed WAL close of " + oldPath + ", cause=\"" + ioe.getMessage()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                + "\", errors=" + errors<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                + "; THIS FILE WAS NOT CLOSED BUT ALL EDITS SYNCED SO SHOULD BE OK");<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          } else {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            throw ioe;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        }<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      logRollAndSetupWalProps(oldPath, newPath, oldFileLen);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      this.writer = nextWriter;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (nextWriter != null &amp;&amp; nextWriter instanceof ProtobufLogWriter) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        this.hdfs_out = ((ProtobufLogWriter) nextWriter).getStream();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        this.hdfs_out = null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    } catch (InterruptedException ie) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Perpetuate the interrupt<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      Thread.currentThread().interrupt();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    } catch (IOException e) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      long count = getUnflushedEntriesCount();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      LOG.error("Failed close of WAL writer " + oldPath + ", unflushedEntries=" + count, e);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new FailedLogCloseException(oldPath + ", unflushedEntries=" + count, e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } finally {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      // Let the writer thread go regardless, whether error or not.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (zigzagLatch != null) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        zigzagLatch.releaseSafePoint();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // syncFuture will be null if we failed our wait on safe point above. Otherwise, if<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // latch was obtained successfully, the sync we threw in either trigger the latch or it<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // got stamped with an exception because the WAL was damaged and we could not sync. Now<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        // the write pipeline has been opened up again by releasing the safe point, process the<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        // syncFuture we got above. This is probably a noop but it may be stale exception from<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // when old WAL was in place. Catch it if so.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if (syncFuture != null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            blockOnSync(syncFuture);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          } catch (IOException ioe) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>              LOG.trace("Stale sync exception", ioe);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  @Override<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected void doShutdown() throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // Shutdown the disruptor. Will stop after all entries have been processed. Make sure we<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    // have stopped incoming appends before calling this else it will not shutdown. We are<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // conservative below waiting a long time and if not elapsed, then halting.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    if (this.disruptor != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      long timeoutms = conf.getLong("hbase.wal.disruptor.shutdown.timeout.ms", 60000);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        this.disruptor.shutdown(timeoutms, TimeUnit.MILLISECONDS);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      } catch (TimeoutException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        LOG.warn("Timed out bringing down disruptor after " + timeoutms + "ms; forcing halt "<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            + "(It is a problem if this is NOT an ABORT! -- DATALOSS!!!!)");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        this.disruptor.halt();<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        this.disruptor.shutdown();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (LOG.isDebugEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      LOG.debug("Closing WAL writer in " + FSUtils.getPath(walDir));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    if (this.writer != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.writer.close();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      this.writer = null;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_NULL_ON_SOME_PATH_EXCEPTION",<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      justification = "Will never be null")<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public long append(final RegionInfo hri, final WALKeyImpl key, final WALEdit edits,<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      final boolean inMemstore) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return stampSequenceIdAndPublishToRingBuffer(hri, key, edits, inMemstore,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      disruptor.getRingBuffer());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /**<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * Thread to runs the hdfs sync call. This call takes a while to complete. This is the longest<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * pole adding edits to the WAL and this must complete to be sure all edits persisted. We run<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * multiple threads sync'ng rather than one that just syncs in series so we have better latencies;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * otherwise, an edit that arrived just after a sync started, might have to wait almost the length<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * of two sync invocations before it is marked done.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * &lt;p&gt;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * When the sync completes, it marks all the passed in futures done. On the other end of the sync<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * future is a blocked thread, usually a regionserver Handler. There may be more than one future<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   * passed in the case where a few threads arrive at about the same time and all invoke 'sync'. In<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   * this case we'll batch up the invocations and run one filesystem sync only for a batch of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Handler sync invocations. Do not confuse these Handler SyncFutures with the futures an<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * ExecutorService returns when you call submit. We have no use for these in this model. These<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * SyncFutures are 'artificial', something to hold the Handler until the filesystem sync<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * completes.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private class SyncRunner extends HasThread {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    private volatile long sequence;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // Keep around last exception thrown. Clear on successful sync.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final BlockingQueue&lt;SyncFuture&gt; syncFutures;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private volatile SyncFuture takeSyncFuture = null;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    SyncRunner(final String name, final int maxHandlersCount) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      super(name);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // LinkedBlockingQueue because of<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Could use other blockingqueues here or concurrent queues.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      //<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      // We could let the capacity be 'open' but bound it so we get alerted in pathological case<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      // where we cannot sync and we have a bunch of threads all backed up waiting on their syncs<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      // to come in. LinkedBlockingQueue actually shrinks when you remove elements so Q should<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      // stay neat and tidy in usual case. Let the max size be three times the maximum handlers.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      // The passed in maxHandlerCount is the user-level handlers which is what we put up most of<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      // but HBase has other handlers running too -- opening region handlers which want to write<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      // the meta table when succesful (i.e. sync), closing handlers -- etc. These are usually<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      // much fewer in number than the user-space handlers so Q-size should be user handlers plus<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      // some space for these other handlers. Lets multiply by 3 for good-measure.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this.syncFutures = new LinkedBlockingQueue&lt;&gt;(maxHandlersCount * 3);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    void offer(final long sequence, final SyncFuture[] syncFutures, final int syncFutureCount) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Set sequence first because the add to the queue will wake the thread if sleeping.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      this.sequence = sequence;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      for (int i = 0; i &lt; syncFutureCount; ++i) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        this.syncFutures.add(syncFutures[i]);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * Release the passed &lt;code&gt;syncFuture&lt;/code&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * @return Returns 1.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    private int releaseSyncFuture(final SyncFuture syncFuture, final long currentSequence,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        final Throwable t) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!syncFuture.done(currentSequence, t)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        throw new IllegalStateException();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // This function releases one sync future only.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      return 1;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    /**<a name="line.500"></a>
-<span class="sourceLineNo">501</span>     * Release all SyncFutures whose sequence is &lt;= &lt;code&gt;currentSequence&lt;/code&gt;.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>     * @param t May be non-null if we are processing SyncFutures because an exception was thrown.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>     * @return Count of SyncFutures we let go.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>     */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    private int releaseSyncFutures(final long currentSequence, final Throwable t) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      int syncCount = 0;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      for (SyncFuture syncFuture; (syncFuture = this.syncFutures.peek()) != null;) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (syncFuture.getTxid() &gt; currentSequence) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        releaseSyncFuture(syncFuture, currentSequence, t);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        if (!this.syncFutures.remove(syncFuture)) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          throw new IllegalStateException(syncFuture.toString());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        syncCount++;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      return syncCount;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    /**<a name="line.520"></a>
-<span class="sourceLineNo">521</span>     * @param sequence The sequence we ran the filesystem sync against.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>     * @return Current highest synced sequence.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>     */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    private long updateHighestSyncedSequence(long sequence) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      long currentHighestSyncedSequence;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // Set the highestSyncedSequence IFF our current sequence id is the 'highest'.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      do {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        if (currentHighestSyncedSequence &gt;= sequence) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          // Set the sync number to current highwater mark; might be able to let go more<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // queued sync futures<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          sequence = currentHighestSyncedSequence;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          break;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } while (!highestSyncedTxid.compareAndSet(currentHighestSyncedSequence, sequence));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      return sequence;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    boolean areSyncFuturesReleased() {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // check whether there is no sync futures offered, and no in-flight sync futures that is being<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // processed.<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      return syncFutures.size() &lt;= 0<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          &amp;&amp; takeSyncFuture == null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>    @Override<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    public void run() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      long currentSequence;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      while (!isInterrupted()) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        int syncCount = 0;<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>        try {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          while (true) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>            takeSyncFuture = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>            // We have to process what we 'take' from the queue<a name="line.555"></a>
-<span class="sourceLineNo">556</span>            takeSyncFuture = this.syncFutures.take();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            currentSequence = this.sequence;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>            long syncFutureSequence = takeSyncFuture.getTxid();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>            if (syncFutureSequence &gt; currentSequence) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              throw new IllegalStateException("currentSequence=" + currentSequence<a name="line.560"></a>
-<span class="sourceLineNo">561</span>                  + ", syncFutureSequence=" + syncFutureSequence);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            // See if we can process any syncfutures BEFORE we go sync.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            long currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            if (currentSequence &l

<TRUNCATED>

[07/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
index ce22ca5..64099d9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html
@@ -80,50 +80,57 @@
 <span class="sourceLineNo">072</span>  }<a name="line.72"></a>
 <span class="sourceLineNo">073</span><a name="line.73"></a>
 <span class="sourceLineNo">074</span>  @Override<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  public void sync() throws IOException {<a name="line.75"></a>
+<span class="sourceLineNo">075</span>  public void sync(boolean forceSync) throws IOException {<a name="line.75"></a>
 <span class="sourceLineNo">076</span>    FSDataOutputStream fsdos = this.output;<a name="line.76"></a>
 <span class="sourceLineNo">077</span>    if (fsdos == null) return; // Presume closed<a name="line.77"></a>
 <span class="sourceLineNo">078</span>    fsdos.flush();<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    fsdos.hflush();<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public FSDataOutputStream getStream() {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    return this.output;<a name="line.83"></a>
+<span class="sourceLineNo">079</span>    if (forceSync) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>      fsdos.hsync();<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    } else {<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      fsdos.hflush();<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    }<a name="line.83"></a>
 <span class="sourceLineNo">084</span>  }<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  @SuppressWarnings("deprecation")<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  @Override<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  protected void initOutput(FileSystem fs, Path path, boolean overwritable, int bufferSize,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      short replication, long blockSize) throws IOException, StreamLacksCapabilityException {<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.output = fs.createNonRecursive(path, overwritable, bufferSize, replication, blockSize,<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      null);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    // TODO Be sure to add a check for hsync if this branch includes HBASE-19024<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    if (fs.getConf().getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true) &amp;&amp;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>        !(CommonFSUtils.hasCapability(output, "hflush"))) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      throw new StreamLacksCapabilityException("hflush");<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  @Override<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  protected long writeMagicAndWALHeader(byte[] magic, WALHeader header) throws IOException {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    output.write(magic);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    header.writeDelimitedTo(output);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    return output.getPos();<a name="line.103"></a>
+<span class="sourceLineNo">086</span>  public FSDataOutputStream getStream() {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    return this.output;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  }<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  @SuppressWarnings("deprecation")<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  @Override<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  protected void initOutput(FileSystem fs, Path path, boolean overwritable, int bufferSize,<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      short replication, long blockSize) throws IOException, StreamLacksCapabilityException {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    this.output = fs.createNonRecursive(path, overwritable, bufferSize, replication, blockSize,<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      null);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    if (fs.getConf().getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true)) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      if (!CommonFSUtils.hasCapability(output, "hflush")) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>        throw new StreamLacksCapabilityException("hflush");<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      }<a name="line.99"></a>
+<span class="sourceLineNo">100</span>      if (!CommonFSUtils.hasCapability(output, "hsync")) {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>        throw new StreamLacksCapabilityException("hsync");<a name="line.101"></a>
+<span class="sourceLineNo">102</span>      }<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    }<a name="line.103"></a>
 <span class="sourceLineNo">104</span>  }<a name="line.104"></a>
 <span class="sourceLineNo">105</span><a name="line.105"></a>
 <span class="sourceLineNo">106</span>  @Override<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  protected OutputStream getOutputStreamForCellEncoder() {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    return this.output;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
-<span class="sourceLineNo">110</span><a name="line.110"></a>
-<span class="sourceLineNo">111</span>  @Override<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  protected long writeWALTrailerAndMagic(WALTrailer trailer, byte[] magic) throws IOException {<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    trailer.writeTo(output);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    output.writeInt(trailer.getSerializedSize());<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    output.write(magic);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return output.getPos();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>}<a name="line.118"></a>
+<span class="sourceLineNo">107</span>  protected long writeMagicAndWALHeader(byte[] magic, WALHeader header) throws IOException {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    output.write(magic);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    header.writeDelimitedTo(output);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    return output.getPos();<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  }<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>  @Override<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  protected OutputStream getOutputStreamForCellEncoder() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    return this.output;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  }<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @Override<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  protected long writeWALTrailerAndMagic(WALTrailer trailer, byte[] magic) throws IOException {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    trailer.writeTo(output);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    output.writeInt(trailer.getSerializedSize());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    output.write(magic);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return output.getPos();<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>}<a name="line.125"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
index 9457b4b..6a84f26 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html
@@ -75,94 +75,105 @@
 <span class="sourceLineNo">067</span><a name="line.67"></a>
 <span class="sourceLineNo">068</span>  private Thread t;<a name="line.68"></a>
 <span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * Call this method to clear old usage and get it ready for new deploy.<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * @param txid the new transaction id<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * @param span current span, detached from caller. Don't forget to attach it when resuming after a<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   *          call to {@link #get(long)}.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * @return this<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   */<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  synchronized SyncFuture reset(long txid) {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    if (t != null &amp;&amp; t != Thread.currentThread()) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>      throw new IllegalStateException();<a name="line.79"></a>
-<span class="sourceLineNo">080</span>    }<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    t = Thread.currentThread();<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    if (!isDone()) {<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      throw new IllegalStateException("" + txid + " " + Thread.currentThread());<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    }<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    this.doneTxid = NOT_DONE;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    this.txid = txid;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    this.throwable = null;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    return this;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  }<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  @Override<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  public synchronized String toString() {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    return "done=" + isDone() + ", txid=" + this.txid;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  }<a name="line.94"></a>
-<span class="sourceLineNo">095</span><a name="line.95"></a>
-<span class="sourceLineNo">096</span>  synchronized long getTxid() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return this.txid;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  }<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  /**<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * @param txid the transaction id at which this future 'completed'.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * @param t Can be null. Set if we are 'completing' on error (and this 't' is the error).<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   * @return True if we successfully marked this outstanding future as completed/done. Returns false<a name="line.103"></a>
-<span class="sourceLineNo">104</span>   *         if this future is already 'done' when this method called.<a name="line.104"></a>
-<span class="sourceLineNo">105</span>   */<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  synchronized boolean done(final long txid, final Throwable t) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    if (isDone()) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      return false;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    this.throwable = t;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    if (txid &lt; this.txid) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      // Something badly wrong.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>      if (throwable == null) {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        this.throwable =<a name="line.114"></a>
-<span class="sourceLineNo">115</span>            new IllegalStateException("done txid=" + txid + ", my txid=" + this.txid);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      }<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    // Mark done.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    this.doneTxid = txid;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // Wake up waiting threads.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    notify();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    return true;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  }<a name="line.123"></a>
-<span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  boolean cancel(boolean mayInterruptIfRunning) {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    throw new UnsupportedOperationException();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  synchronized long get(long timeoutNs) throws InterruptedException,<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      ExecutionException, TimeoutIOException {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    final long done = System.nanoTime() + timeoutNs;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    while (!isDone()) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      wait(1000);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      if (System.nanoTime() &gt;= done) {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        throw new TimeoutIOException(<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            "Failed to get sync result after " + TimeUnit.NANOSECONDS.toMillis(timeoutNs)<a name="line.136"></a>
-<span class="sourceLineNo">137</span>                + " ms for txid=" + this.txid + ", WAL system stuck?");<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      }<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (this.throwable != null) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      throw new ExecutionException(this.throwable);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    return this.doneTxid;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  }<a name="line.144"></a>
-<span class="sourceLineNo">145</span><a name="line.145"></a>
-<span class="sourceLineNo">146</span>  synchronized boolean isDone() {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    return this.doneTxid != NOT_DONE;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  synchronized boolean isThrowable() {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    return isDone() &amp;&amp; getThrowable() != null;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  synchronized Throwable getThrowable() {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    return this.throwable;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span>}<a name="line.157"></a>
+<span class="sourceLineNo">070</span>  private boolean forceSync;<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Call this method to clear old usage and get it ready for new deploy.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * @param txid the new transaction id<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param span current span, detached from caller. Don't forget to attach it when resuming after a<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   *          call to {@link #get(long)}.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * @return this<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  synchronized SyncFuture reset(long txid) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    if (t != null &amp;&amp; t != Thread.currentThread()) {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>      throw new IllegalStateException();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>    }<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    t = Thread.currentThread();<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    if (!isDone()) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      throw new IllegalStateException("" + txid + " " + Thread.currentThread());<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    }<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    this.doneTxid = NOT_DONE;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    this.txid = txid;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    this.throwable = null;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    return this;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  }<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Override<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public synchronized String toString() {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return "done=" + isDone() + ", txid=" + this.txid;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  }<a name="line.96"></a>
+<span class="sourceLineNo">097</span><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  synchronized long getTxid() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return this.txid;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  }<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>  synchronized boolean isForceSync() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return forceSync;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  synchronized SyncFuture setForceSync(boolean forceSync) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    this.forceSync = forceSync;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    return this;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  /**<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * @param txid the transaction id at which this future 'completed'.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param t Can be null. Set if we are 'completing' on error (and this 't' is the error).<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @return True if we successfully marked this outstanding future as completed/done. Returns false<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   *         if this future is already 'done' when this method called.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  synchronized boolean done(final long txid, final Throwable t) {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    if (isDone()) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      return false;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    }<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    this.throwable = t;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    if (txid &lt; this.txid) {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      // Something badly wrong.<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      if (throwable == null) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        this.throwable =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>            new IllegalStateException("done txid=" + txid + ", my txid=" + this.txid);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    // Mark done.<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    this.doneTxid = txid;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    // Wake up waiting threads.<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    notify();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return true;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  boolean cancel(boolean mayInterruptIfRunning) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    throw new UnsupportedOperationException();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>  synchronized long get(long timeoutNs) throws InterruptedException,<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      ExecutionException, TimeoutIOException {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    final long done = System.nanoTime() + timeoutNs;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    while (!isDone()) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      wait(1000);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      if (System.nanoTime() &gt;= done) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        throw new TimeoutIOException(<a name="line.146"></a>
+<span class="sourceLineNo">147</span>            "Failed to get sync result after " + TimeUnit.NANOSECONDS.toMillis(timeoutNs)<a name="line.147"></a>
+<span class="sourceLineNo">148</span>                + " ms for txid=" + this.txid + ", WAL system stuck?");<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    if (this.throwable != null) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      throw new ExecutionException(this.throwable);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return this.doneTxid;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  synchronized boolean isDone() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    return this.doneTxid != NOT_DONE;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  }<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  synchronized boolean isThrowable() {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    return isDone() &amp;&amp; getThrowable() != null;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>  synchronized Throwable getThrowable() {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return this.throwable;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  }<a name="line.167"></a>
+<span class="sourceLineNo">168</span>}<a name="line.168"></a>
 
 
 


[26/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699

<TRUNCATED>

[04/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 9189760..b6baff7 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -324,7 +324,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 53b0f07..97d9a58 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -426,7 +426,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index f0ababb..8795959 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 35e08e5..b8dd965 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -281,7 +281,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 368210a..71fce42 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -484,7 +484,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 0954698..b5d366e 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -334,7 +334,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 8f29865..7ed0623 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -452,7 +452,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 7ed47a5..62f144c 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -407,7 +407,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 119b1c2..7aa6a27 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -429,7 +429,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index e546d6c..9e7f4ca 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -368,7 +368,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 772124f..02547e9 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -762,7 +762,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index dc156e6..e45f95b 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -328,7 +328,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index cca3be2..d27a7b8 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -298,7 +298,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index fd42634..4fb5a9c 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -324,7 +324,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 6c3f707..5bb5694 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -301,7 +301,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 86a5c0a..4b2474c 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -296,7 +296,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 5235467..69b0008 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -324,7 +324,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index f71763b..e1c9e54 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -292,7 +292,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 69c1d43..d4273cd 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -326,7 +326,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 2d03a19..44ce3bc 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -513,7 +513,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 3d4e3b7..45db046 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -723,7 +723,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 5e89755..a5ab05c 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1668,6 +1668,7 @@
 <li><a href="org/apache/hadoop/hbase/wal/TestReadWriteSeqIdFiles.html" title="class in org.apache.hadoop.hbase.wal" target="classFrame">TestReadWriteSeqIdFiles</a></li>
 <li><a href="org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.html" title="class in org.apache.hadoop.hbase.zookeeper" target="classFrame">TestRecoverableZooKeeper</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestRecoveredEdits.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestRecoveredEdits</a></li>
+<li><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestRecoverMetaProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/metrics/impl/TestRefCountingMap.html" title="class in org.apache.hadoop.hbase.metrics.impl" target="classFrame">TestRefCountingMap</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor.example" target="classFrame">TestRefreshHFilesEndpoint</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html" title="class in org.apache.hadoop.hbase.coprocessor.example" target="classFrame">TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP</a></li>
@@ -2221,6 +2222,7 @@
 <li><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.DummyWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALActionsListener.DummyWALActionsListener</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.html" title="class in org.apache.hadoop.hbase.regionserver" target="classFrame">TestWalAndCompactingMemStoreFlush</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALCellCodecWithCompression</a></li>
+<li><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALDurability</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.html" title="class in org.apache.hadoop.hbase.replication.regionserver" target="classFrame">TestWALEntrySinkFilter</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.DevNullConnection.html" title="class in org.apache.hadoop.hbase.replication.regionserver" target="classFrame">TestWALEntrySinkFilter.DevNullConnection</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.IfTimeIsGreaterThanBOUNDARYWALEntrySinkFilterImpl.html" title="class in org.apache.hadoop.hbase.replication.regionserver" target="classFrame">TestWALEntrySinkFilter.IfTimeIsGreaterThanBOUNDARYWALEntrySinkFilterImpl</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index da273f0..c0c5878 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1668,6 +1668,7 @@
 <li><a href="org/apache/hadoop/hbase/wal/TestReadWriteSeqIdFiles.html" title="class in org.apache.hadoop.hbase.wal">TestReadWriteSeqIdFiles</a></li>
 <li><a href="org/apache/hadoop/hbase/zookeeper/TestRecoverableZooKeeper.html" title="class in org.apache.hadoop.hbase.zookeeper">TestRecoverableZooKeeper</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestRecoveredEdits.html" title="class in org.apache.hadoop.hbase.regionserver">TestRecoveredEdits</a></li>
+<li><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/metrics/impl/TestRefCountingMap.html" title="class in org.apache.hadoop.hbase.metrics.impl">TestRefCountingMap</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor.example">TestRefreshHFilesEndpoint</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html" title="class in org.apache.hadoop.hbase.coprocessor.example">TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP</a></li>
@@ -2221,6 +2222,7 @@
 <li><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.DummyWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALActionsListener.DummyWALActionsListener</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.html" title="class in org.apache.hadoop.hbase.regionserver">TestWalAndCompactingMemStoreFlush</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALCellCodecWithCompression</a></li>
+<li><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntrySinkFilter</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.DevNullConnection.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntrySinkFilter.DevNullConnection</a></li>
 <li><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.IfTimeIsGreaterThanBOUNDARYWALEntrySinkFilterImpl.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntrySinkFilter.IfTimeIsGreaterThanBOUNDARYWALEntrySinkFilterImpl</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index fbd8cbd..ef76877 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -10551,6 +10551,25 @@
 </tbody>
 </table>
 </li>
+<li class="blockList">
+<table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.wal.TestWALDurability.COLUMN_FAMILY">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#COLUMN_FAMILY">COLUMN_FAMILY</a></code></td>
+<td class="colLast"><code>"MyCF"</code></td>
+</tr>
+</tbody>
+</table>
+</li>
 </ul>
 <ul class="blockList">
 <li class="blockList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 105bc46..ca1e4b3 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -4977,6 +4977,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
@@ -5645,6 +5647,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALCellCodecWithCompression</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALReplay</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALReplayBoundedLogWriterCreation</a></dt>
@@ -7207,6 +7211,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableResource.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableResource.html" title="class in org.apache.hadoop.hbase.rest">TestTableResource</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
@@ -7219,6 +7225,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html#COLUMN_FAMILY_BYTES">COLUMN_FAMILY_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALLockup.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALLockup</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#COLUMN_FAMILY_BYTES">COLUMN_FAMILY_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html#COLUMN_FAMILY_DEFAULT">COLUMN_FAMILY_DEFAULT</a></span> - Static variable in class org.apache.hadoop.hbase.trace.<a href="org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.html" title="class in org.apache.hadoop.hbase.trace">IntegrationTestSendTraceRequests</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/RandomKeyValueUtil.html#COLUMN_FAMILY_NAME">COLUMN_FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/RandomKeyValueUtil.html" title="class in org.apache.hadoop.hbase.io.hfile">RandomKeyValueUtil</a></dt>
@@ -7940,6 +7948,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html#conf">conf</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALActionsListener</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#conf">conf</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.html#conf">conf</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicationSourceManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.html#CONF">CONF</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntryStream</a></dt>
@@ -11581,6 +11591,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestDurability.html#DIR">DIR</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestDurability</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#dir">dir</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALFactory.html#dir">dir</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALFactory.html" title="class in org.apache.hadoop.hbase.wal">TestWALFactory</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.LocalDaemonLogTailer.html#dirList">dirList</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.LocalDaemonLogTailer.html" title="class in org.apache.hadoop.hbase.util">ProcessBasedLocalHBaseCluster.LocalDaemonLogTailer</a></dt>
@@ -16778,6 +16790,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestLogRolling</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ResourceChecker.ResourceAnalyzer.html#getName--">getName()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/ResourceChecker.ResourceAnalyzer.html" title="class in org.apache.hadoop.hbase">ResourceChecker.ResourceAnalyzer</a></dt>
 <dd>
 <div class="block">Name of the resource analyzed.</div>
@@ -20044,6 +20058,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html#initHRegion-org.apache.hadoop.hbase.client.TableDescriptor-byte:A-byte:A-int-">initHRegion(TableDescriptor, byte[], byte[], int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.html" title="class in org.apache.hadoop.hbase.regionserver">TestWALMonotonicallyIncreasingSeqId</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#initHRegion-org.apache.hadoop.hbase.TableName-byte:A-byte:A-org.apache.hadoop.hbase.wal.WAL-">initHRegion(TableName, byte[], byte[], WAL)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.html#INITIAL_REGION_NUM">INITIAL_REGION_NUM</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionMergeTransactionOnCluster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html#INITIAL_STRIPE_COUNT_KEY">INITIAL_STRIPE_COUNT_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StripeCompactionsPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">StripeCompactionsPerformanceEvaluation</a></dt>
@@ -22971,6 +22987,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedureAdmin</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#LOG">LOG</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
@@ -26099,6 +26117,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestFSHLog</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/master/TestTableCFsUpdater.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.replication.master.<a href="org/apache/hadoop/hbase/replication/master/TestTableCFsUpdater.html" title="class in org.apache.hadoop.hbase.replication.master">TestTableCFsUpdater</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestGlobalThrottler.html#name">name</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestGlobalThrottler.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestGlobalThrottler</a></dt>
@@ -35972,6 +35992,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALActionsListener</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicationSink</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSinkManager.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSinkManager.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicationSinkManager</a></dt>
@@ -39308,13 +39330,15 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestAsyncProtobufLog.html#sync-org.apache.hadoop.hbase.wal.WALProvider.AsyncWriter-">sync(WALProvider.AsyncWriter)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestAsyncProtobufLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestAsyncProtobufLog</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html#sync--">sync()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestLogRollingNoCluster.HighLatencySyncWriter</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html#sync-boolean-">sync(boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestLogRollingNoCluster.HighLatencySyncWriter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestProtobufLog.html#sync-org.apache.hadoop.hbase.wal.WALProvider.Writer-">sync(WALProvider.Writer)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestProtobufLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestProtobufLog</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/FaultyFSLog.html#sync-long-">sync(long)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/FaultyFSLog.html" title="class in org.apache.hadoop.hbase.wal">FaultyFSLog</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#sync--">sync()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html" title="class in org.apache.hadoop.hbase.wal">IOTestProvider.IOTestWriter</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/FaultyFSLog.html#sync-long-boolean-">sync(long, boolean)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/FaultyFSLog.html" title="class in org.apache.hadoop.hbase.wal">FaultyFSLog</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#sync-boolean-">sync(boolean)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html" title="class in org.apache.hadoop.hbase.wal">IOTestProvider.IOTestWriter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html#SYNC_OPTION">SYNC_OPTION</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
@@ -40190,6 +40214,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html" title="class in org.apache.hadoop.hbase.regionserver.wal">AbstractTestLogRolling</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpointNoMaster.html#tableName">tableName</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestRegionReplicaReplicationEndpointNoMaster.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestRegionReplicaReplicationEndpointNoMaster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html#tableName">tableName</a></span> - Variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestSerialReplicationChecker</a></dt>
@@ -42442,6 +42468,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALActionsListener</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/master/TestTableCFsUpdater.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.replication.master.<a href="org/apache/hadoop/hbase/replication/master/TestTableCFsUpdater.html" title="class in org.apache.hadoop.hbase.replication.master">TestTableCFsUpdater</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.html#TEST_UTIL">TEST_UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestReplicationSink</a></dt>
@@ -55008,6 +55036,10 @@
 <dd>
 <div class="block">Ensure we get expected exception when we try to return null from a preFlush call.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#testPrepare--">testPrepare()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>
+<div class="block">Test the new prepare step.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/access/TestAccessController.html#testPrepareAndCleanBulkLoad--">testPrepareAndCleanBulkLoad()</a></span> - Method in class org.apache.hadoop.hbase.security.access.<a href="org/apache/hadoop/hbase/security/access/TestAccessController.html" title="class in org.apache.hadoop.hbase.security.access">TestAccessController</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestReversedScannerCallable.html#testPrepareDoesNotUseCache--">testPrepareDoesNotUseCache()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestReversedScannerCallable.html" title="class in org.apache.hadoop.hbase.client">TestReversedScannerCallable</a></dt>
@@ -55016,6 +55048,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestReversedScannerCallable.html#testPrepareUsesCache--">testPrepareUsesCache()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestReversedScannerCallable.html" title="class in org.apache.hadoop.hbase.client">TestReversedScannerCallable</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#testPrepareWithMasterStopping--">testPrepareWithMasterStopping()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>
+<div class="block">Test the new prepare step.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#testPrepareWithNoCluster--">testPrepareWithNoCluster()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>
+<div class="block">Test the new prepare step.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/TestBoundedPriorityBlockingQueue.html#testPrepend--">testPrepend()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TestBoundedPriorityBlockingQueue.html" title="class in org.apache.hadoop.hbase.util">TestBoundedPriorityBlockingQueue</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestMetaCache.html#testPreserveMetaCacheOnException--">testPreserveMetaCacheOnException()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestMetaCache.html" title="class in org.apache.hadoop.hbase.client">TestMetaCache</a></dt>
@@ -55853,6 +55893,10 @@
 <dd>
 <div class="block">Test recover lease eventually succeeding.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestRecoverMetaProcedure</span></a> - Class in <a href="org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#TestRecoverMetaProcedure--">TestRecoverMetaProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testRecovery--">testRecovery()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestMergeTableRegionsProcedure.html#testRecoveryAndDoubleExecution--">testRecoveryAndDoubleExecution()</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestMergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">TestMergeTableRegionsProcedure</a></dt>
@@ -56625,6 +56669,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestRegionStates.html#TestRegionStates--">TestRegionStates()</a></span> - Constructor for class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestRegionStates.html" title="class in org.apache.hadoop.hbase.master.assignment">TestRegionStates</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#testRegionsZNodeLayout--">testRegionsZNodeLayout()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html" title="class in org.apache.hadoop.hbase.replication">TestZKReplicationQueueStorage</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHRegion.html#testRegionTooBusy--">testRegionTooBusy()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegion.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion</a></dt>
 <dd>
 <div class="block">Test RegionTooBusyException thrown when region is busy</div>
@@ -62144,6 +62190,14 @@
 <dd>
 <div class="block">Test WAL replay behavior with WALObserver.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestWALDurability</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/wal/package-summary.html">org.apache.hadoop.hbase.regionserver.wal</a></dt>
+<dd>
+<div class="block">Tests for WAL write durability - hflush vs hsync</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#TestWALDurability--">TestWALDurability()</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#testWALDurability--">testWALDurability()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.html#testWALEntryFilter--">testWALEntryFilter()</a></span> - Method in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestWALEntrySinkFilter</a></dt>
 <dd>
 <div class="block">Test filter.</div>
@@ -64304,6 +64358,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure">TestProcedurePriority</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html#util">util</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestServerCrashProcedure</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionRegion.html b/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionRegion.html
index dda1196..5166c9c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInCompletionRegion.html
@@ -178,7 +178,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/TestIOFencing.CompactionBlo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL</code></li>
+<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_WAL_HSYNC, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL, WAL_HSYNC_CONF_KEY</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInPrepRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInPrepRegion.html b/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInPrepRegion.html
index 29fcb35..758ed6f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInPrepRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.BlockCompactionsInPrepRegion.html
@@ -177,7 +177,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/TestIOFencing.CompactionBlo
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL</code></li>
+<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_WAL_HSYNC, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL, WAL_HSYNC_CONF_KEY</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.CompactionBlockerRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.CompactionBlockerRegion.html b/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.CompactionBlockerRegion.html
index 93ffcd8..85db380 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.CompactionBlockerRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestIOFencing.CompactionBlockerRegion.html
@@ -186,7 +186,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL</code></li>
+<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_WAL_HSYNC, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL, WAL_HSYNC_CONF_KEY</code></li>
 </ul>
 </li>
 </ul>


[10/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
index 9971079..03c8b000 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.SafePointZigZagLatch.html
@@ -49,1067 +49,1082 @@
 <span class="sourceLineNo">041</span>import org.apache.hadoop.fs.Path;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.htrace.core.TraceScope;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.slf4j.Logger;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.slf4j.LoggerFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The default implementation of FSWAL.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>@InterfaceAudience.Private<a name="line.66"></a>
-<span class="sourceLineNo">067</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  // IMPLEMENTATION NOTES:<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  //<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  // high writes/syncs.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  //<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // the region edit/sequence id after the append returns.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  //<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // the futures when done.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  //<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  //<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  //<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * flushed out before we exit.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private FSDataOutputStream hdfs_out;<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  // All about log rolling if not enough replicas outstanding.<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final int minTolerableReplication;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // If live datanode count is lower than the default replicas value,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private final int lowReplicationRollLimit;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // then disable the rolling in checkLowReplication().<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  // Enable it if the replications recover.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /** Number of log close errors tolerated before we abort */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private final int closeErrorsTolerated;<a name="line.146"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.htrace.core.TraceScope;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * The default implementation of FSWAL.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>@InterfaceAudience.Private<a name="line.67"></a>
+<span class="sourceLineNo">068</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  // IMPLEMENTATION NOTES:<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  //<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  // high writes/syncs.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  //<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // the region edit/sequence id after the append returns.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  //<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  //<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // the futures when done.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  //<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  //<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  //<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   */<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * flushed out before we exit.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private FSDataOutputStream hdfs_out;<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  // All about log rolling if not enough replicas outstanding.<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private final int minTolerableReplication;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private final boolean useHsync;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // If live datanode count is lower than the default replicas value,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private final int lowReplicationRollLimit;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  // then disable the rolling in checkLowReplication().<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  // Enable it if the replications recover.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.146"></a>
 <span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * using our logger instead of java native logger.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throw new RuntimeException(ex);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void handleOnStartException(Throwable ex) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      LOG.error(ex.toString(), ex);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      throw new RuntimeException(ex);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      LOG.error(ex.toString(), ex);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new RuntimeException(ex);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * Constructor.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param fs filesystem handle<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param root path for stored and archived wals<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param logDir dir where wals are stored<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf configuration to use<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  /**<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * by the time the WAL object is started up.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param fs filesystem handle<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir path to where logs and oldlogs<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param logDir dir where wals are stored<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @param archiveDir dir where wals are archived<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * @param conf configuration to use<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   *          exist.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      5);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    rollWriter();<a name="line.216"></a>
+<span class="sourceLineNo">148</span>  /** Number of log close errors tolerated before we abort */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private final int closeErrorsTolerated;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * using our logger instead of java native logger.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throw new RuntimeException(ex);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    public void handleOnStartException(Throwable ex) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.error(ex.toString(), ex);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException(ex);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(ex.toString(), ex);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new RuntimeException(ex);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Constructor.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param fs filesystem handle<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param root path for stored and archived wals<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param logDir dir where wals are stored<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param conf configuration to use<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * by the time the WAL object is started up.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param fs filesystem handle<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param rootDir path to where logs and oldlogs<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @param logDir dir where wals are stored<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param archiveDir dir where wals are archived<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param conf configuration to use<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          exist.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      5);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // put on the ring buffer.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // spinning as other strategies do.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.disruptor.getRingBuffer().next();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    this.disruptor.start();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * removed.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @return null if underlying stream is not ready.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  OutputStream getOutputStream() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Run a sync after opening to set up the pipeline.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    long startTimeNanos = System.nanoTime();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    try {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      nextWriter.sync();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    } catch (IOException e) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // optimization failed, no need to abort here.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * methods like rollWriter().<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return Writer instance<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    return writer;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @see #beforeWaitOnSafePoint()<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected void afterCreatingZigZagLatch() {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @see #afterCreatingZigZagLatch()<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  protected void beforeWaitOnSafePoint() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    writer.append(entry);<a name="line.297"></a>
+<span class="sourceLineNo">218</span>    this.useHsync = conf.getBoolean(HRegion.WAL_HSYNC_CONF_KEY, HRegion.DEFAULT_WAL_HSYNC);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // put on the ring buffer.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // spinning as other strategies do.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    this.disruptor.getRingBuffer().next();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    this.disruptor.start();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * removed.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @return null if underlying stream is not ready.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  @VisibleForTesting<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  OutputStream getOutputStream() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Run a sync after opening to set up the pipeline.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long startTimeNanos = System.nanoTime();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      nextWriter.sync(useHsync);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } catch (IOException e) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      // optimization failed, no need to abort here.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * methods like rollWriter().<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return Writer instance<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return writer;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @see #beforeWaitOnSafePoint()<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  protected void afterCreatingZigZagLatch() {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @see #afterCreatingZigZagLatch()<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  protected void beforeWaitOnSafePoint() {<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  }<a name="line.298"></a>
 <span class="sourceLineNo">299</span><a name="line.299"></a>
 <span class="sourceLineNo">300</span>  @Override<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // here; allow for that.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SyncFuture syncFuture = null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    long sequence = -1L;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.ringBufferEventHandler != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Considering below sequence<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // on safePointReleasedLatch<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      sequence = getSequenceOnRingBuffer();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    afterCreatingZigZagLatch();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    try {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      try {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        if (zigzagLatch != null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          // use assert to make sure no change breaks the logic that<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          // sequence and zigzagLatch will be set together<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence));<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      } catch (FailedSyncBeforeLogCloseException e) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        // If unflushed/unsynced entries on close, it is reason to abort.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        if (isUnflushedEntries()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          throw e;<a name="line.340"></a>
+<span class="sourceLineNo">301</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    writer.append(entry);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  @Override<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // here; allow for that.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    SyncFuture syncFuture = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    long sequence = -1L;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    if (this.ringBufferEventHandler != null) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Considering below sequence<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // on safePointReleasedLatch<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      sequence = getSequenceOnRingBuffer();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    afterCreatingZigZagLatch();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        if (zigzagLatch != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          // use assert to make sure no change breaks the logic that<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          // sequence and zigzagLatch will be set together<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence, false));<a name="line.340"></a>
 <span class="sourceLineNo">341</span>        }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        LOG.warn(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          "Failed sync-before-close but no outstanding appends; closing WAL" + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      long oldFileLen = 0L;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      // It is at the safe point. Swap out writer from under the blocked writer thread.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // TODO: This is close is inline with critical section. Should happen in background?<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      if (this.writer != null) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        oldFileLen = this.writer.getLength();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        try {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          TraceUtil.addTimelineAnnotation("closing writer");<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          this.writer.close();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          TraceUtil.addTimelineAnnotation("writer closed");<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          this.closeErrorCount.set(0);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          int errors = closeErrorCount.incrementAndGet();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (!isUnflushedEntries() &amp;&amp; (errors &lt;= this.closeErrorsTolerated)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            LOG.warn("Riding over failed WAL close of " + oldPath + ", cause=\"" + ioe.getMessage()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                + "\", errors=" + errors<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                + "; THIS FILE WAS NOT CLOSED BUT ALL EDITS SYNCED SO SHOULD BE OK");<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          } else {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            throw ioe;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        }<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      logRollAndSetupWalProps(oldPath, newPath, oldFileLen);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      this.writer = nextWriter;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (nextWriter != null &amp;&amp; nextWriter instanceof ProtobufLogWriter) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        this.hdfs_out = ((ProtobufLogWriter) nextWriter).getStream();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        this.hdfs_out = null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    } catch (InterruptedException ie) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Perpetuate the interrupt<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      Thread.currentThread().interrupt();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    } catch (IOException e) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      long count = getUnflushedEntriesCount();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      LOG.error("Failed close of WAL writer " + oldPath + ", unflushedEntries=" + count, e);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new FailedLogCloseException(oldPath + ", unflushedEntries=" + count, e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } finally {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      // Let the writer thread go regardless, whether error or not.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (zigzagLatch != null) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        zigzagLatch.releaseSafePoint();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // syncFuture will be null if we failed our wait on safe point above. Otherwise, if<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // latch was obtained successfully, the sync we threw in either trigger the latch or it<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // got stamped with an exception because the WAL was damaged and we could not sync. Now<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        // the write pipeline has been opened up again by releasing the safe point, process the<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        // syncFuture we got above. This is probably a noop but it may be stale exception from<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // when old WAL was in place. Catch it if so.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if (syncFuture != null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            blockOnSync(syncFuture);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          } catch (IOException ioe) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>              LOG.trace("Stale sync exception", ioe);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  @Override<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected void doShutdown() throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // Shutdown the disruptor. Will stop after all entries have been processed. Make sure we<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    // have stopped incoming appends before calling this else it will not shutdown. We are<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // conservative below waiting a long time and if not elapsed, then halting.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    if (this.disruptor != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      long timeoutms = conf.getLong("hbase.wal.disruptor.shutdown.timeout.ms", 60000);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        this.disruptor.shutdown(timeoutms, TimeUnit.MILLISECONDS);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      } catch (TimeoutException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        LOG.warn("Timed out bringing down disruptor after " + timeoutms + "ms; forcing halt "<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            + "(It is a problem if this is NOT an ABORT! -- DATALOSS!!!!)");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        this.disruptor.halt();<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        this.disruptor.shutdown();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (LOG.isDebugEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      LOG.debug("Closing WAL writer in " + FSUtils.getPath(walDir));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    if (this.writer != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.writer.close();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      this.writer = null;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_NULL_ON_SOME_PATH_EXCEPTION",<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      justification = "Will never be null")<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public long append(final RegionInfo hri, final WALKeyImpl key, final WALEdit edits,<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      final boolean inMemstore) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return stampSequenceIdAndPublishToRingBuffer(hri, key, edits, inMemstore,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      disruptor.getRingBuffer());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /**<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * Thread to runs the hdfs sync call. This call takes a while to complete. This is the longest<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * pole adding edits to the WAL and this must complete to be sure all edits persisted. We run<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * multiple threads sync'ng rather than one that just syncs in series so we have better latencies;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * otherwise, an edit that arrived just after a sync started, might have to wait almost the length<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * of two sync invocations before it is marked done.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * &lt;p&gt;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * When the sync completes, it marks all the passed in futures done. On the other end of the sync<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * future is a blocked thread, usually a regionserver Handler. There may be more than one future<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   * passed in the case where a few threads arrive at about the same time and all invoke 'sync'. In<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   * this case we'll batch up the invocations and run one filesystem sync only for a batch of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Handler sync invocations. Do not confuse these Handler SyncFutures with the futures an<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * ExecutorService returns when you call submit. We have no use for these in this model. These<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * SyncFutures are 'artificial', something to hold the Handler until the filesystem sync<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * completes.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private class SyncRunner extends HasThread {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    private volatile long sequence;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // Keep around last exception thrown. Clear on successful sync.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final BlockingQueue&lt;SyncFuture&gt; syncFutures;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private volatile SyncFuture takeSyncFuture = null;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    SyncRunner(final String name, final int maxHandlersCount) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      super(name);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // LinkedBlockingQueue because of<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Could use other blockingqueues here or concurrent queues.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      //<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      // We could let the capacity be 'open' but bound it so we get alerted in pathological case<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      // where we cannot sync and we have a bunch of threads all backed up waiting on their syncs<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      // to come in. LinkedBlockingQueue actually shrinks when you remove elements so Q should<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      // stay neat and tidy in usual case. Let the max size be three times the maximum handlers.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      // The passed in maxHandlerCount is the user-level handlers which is what we put up most of<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      // but HBase has other handlers running too -- opening region handlers which want to write<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      // the meta table when succesful (i.e. sync), closing handlers -- etc. These are usually<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      // much fewer in number than the user-space handlers so Q-size should be user handlers plus<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      // some space for these other handlers. Lets multiply by 3 for good-measure.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this.syncFutures = new LinkedBlockingQueue&lt;&gt;(maxHandlersCount * 3);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    void offer(final long sequence, final SyncFuture[] syncFutures, final int syncFutureCount) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Set sequence first because the add to the queue will wake the thread if sleeping.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      this.sequence = sequence;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      for (int i = 0; i &lt; syncFutureCount; ++i) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        this.syncFutures.add(syncFutures[i]);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * Release the passed &lt;code&gt;syncFuture&lt;/code&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * @return Returns 1.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    private int releaseSyncFuture(final SyncFuture syncFuture, final long currentSequence,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        final Throwable t) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!syncFuture.done(currentSequence, t)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        throw new IllegalStateException();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // This function releases one sync future only.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      return 1;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    /**<a name="line.500"></a>
-<span class="sourceLineNo">501</span>     * Release all SyncFutures whose sequence is &lt;= &lt;code&gt;currentSequence&lt;/code&gt;.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>     * @param t May be non-null if we are processing SyncFutures because an exception was thrown.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>     * @return Count of SyncFutures we let go.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>     */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    private int releaseSyncFutures(final long currentSequence, final Throwable t) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      int syncCount = 0;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      for (SyncFuture syncFuture; (syncFuture = this.syncFutures.peek()) != null;) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (syncFuture.getTxid() &gt; currentSequence) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        releaseSyncFuture(syncFuture, currentSequence, t);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        if (!this.syncFutures.remove(syncFuture)) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          throw new IllegalStateException(syncFuture.toString());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        syncCount++;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      return syncCount;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    /**<a name="line.520"></a>
-<span class="sourceLineNo">521</span>     * @param sequence The sequence we ran the filesystem sync against.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>     * @return Current highest synced sequence.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>     */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    private long updateHighestSyncedSequence(long sequence) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      long currentHighestSyncedSequence;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // Set the highestSyncedSequence IFF our current sequence id is the 'highest'.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      do {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        if (currentHighestSyncedSequence &gt;= sequence) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          // Set the sync number to current highwater mark; might be able to let go more<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // queued sync futures<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          sequence = currentHighestSyncedSequence;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          break;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } while (!highestSyncedTxid.compareAndSet(currentHighestSyncedSequence, sequence));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      return sequence;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    boolean areSyncFuturesReleased() {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // check whether there is no sync futures offered, and no in-flight sync futures that is being<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // processed.<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      return syncFutures.size() &lt;= 0<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          &amp;&amp; takeSyncFuture == null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>    @Override<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    public void run() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      long currentSequence;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      while (!isInterrupted()) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        int syncCount = 0;<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>        try {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          while (true) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>            takeSyncFuture = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>            // We have to process what we 'take' from the queue<a name="line.555"></a>
-<span class="sourceLineNo">556</span>            takeSyncFuture = this.syncFutures.take();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            currentSequence = this.sequence;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>            long syncFutureSequence = takeSyncFuture.getTxid();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>            if (syncFutureSequence &gt; currentSequence) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              throw new IllegalStateException("currentSequence=" + currentSequence<a name="line.560"></a>
-<span class="sourceLineNo">561</span>                  + ", syncFutureSequence=" + syncFutureSequence);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            // See if we can process any syncfutures BEFORE we go sync.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            long currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            if (currentSequence &lt; current

<TRUNCATED>

[33/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span c

<TRUNCATED>

[18/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html
index d9048c2..455c3d2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html
@@ -469,7 +469,7 @@
 <span class="sourceLineNo">461</span>      throw new FileNotFoundException(buildPath.toString());<a name="line.461"></a>
 <span class="sourceLineNo">462</span>    }<a name="line.462"></a>
 <span class="sourceLineNo">463</span>    if (LOG.isDebugEnabled()) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      LOG.debug("Committing store file " + buildPath + " as " + dstPath);<a name="line.464"></a>
+<span class="sourceLineNo">464</span>      LOG.debug("Committing " + buildPath + " as " + dstPath);<a name="line.464"></a>
 <span class="sourceLineNo">465</span>    }<a name="line.465"></a>
 <span class="sourceLineNo">466</span>    return dstPath;<a name="line.466"></a>
 <span class="sourceLineNo">467</span>  }<a name="line.467"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
index 7f2e325..32a8ed1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.CompactionChecker.html
@@ -3429,8 +3429,8 @@
 <span class="sourceLineNo">3421</span>      LOG.warn("Not adding moved region record: " + encodedName + " to self.");<a name="line.3421"></a>
 <span class="sourceLineNo">3422</span>      return;<a name="line.3422"></a>
 <span class="sourceLineNo">3423</span>    }<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>    LOG.info("Adding moved region record: "<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span>      + encodedName + " to " + destination + " as of " + closeSeqNum);<a name="line.3425"></a>
+<span class="sourceLineNo">3424</span>    LOG.info("Adding " + encodedName + " move to " + destination + " record at close sequenceid=" +<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>        closeSeqNum);<a name="line.3425"></a>
 <span class="sourceLineNo">3426</span>    movedRegions.put(encodedName, new MovedRegionInfo(destination, closeSeqNum));<a name="line.3426"></a>
 <span class="sourceLineNo">3427</span>  }<a name="line.3427"></a>
 <span class="sourceLineNo">3428</span><a name="line.3428"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
index 7f2e325..32a8ed1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionInfo.html
@@ -3429,8 +3429,8 @@
 <span class="sourceLineNo">3421</span>      LOG.warn("Not adding moved region record: " + encodedName + " to self.");<a name="line.3421"></a>
 <span class="sourceLineNo">3422</span>      return;<a name="line.3422"></a>
 <span class="sourceLineNo">3423</span>    }<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>    LOG.info("Adding moved region record: "<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span>      + encodedName + " to " + destination + " as of " + closeSeqNum);<a name="line.3425"></a>
+<span class="sourceLineNo">3424</span>    LOG.info("Adding " + encodedName + " move to " + destination + " record at close sequenceid=" +<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>        closeSeqNum);<a name="line.3425"></a>
 <span class="sourceLineNo">3426</span>    movedRegions.put(encodedName, new MovedRegionInfo(destination, closeSeqNum));<a name="line.3426"></a>
 <span class="sourceLineNo">3427</span>  }<a name="line.3427"></a>
 <span class="sourceLineNo">3428</span><a name="line.3428"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
index 7f2e325..32a8ed1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.MovedRegionsCleaner.html
@@ -3429,8 +3429,8 @@
 <span class="sourceLineNo">3421</span>      LOG.warn("Not adding moved region record: " + encodedName + " to self.");<a name="line.3421"></a>
 <span class="sourceLineNo">3422</span>      return;<a name="line.3422"></a>
 <span class="sourceLineNo">3423</span>    }<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>    LOG.info("Adding moved region record: "<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span>      + encodedName + " to " + destination + " as of " + closeSeqNum);<a name="line.3425"></a>
+<span class="sourceLineNo">3424</span>    LOG.info("Adding " + encodedName + " move to " + destination + " record at close sequenceid=" +<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>        closeSeqNum);<a name="line.3425"></a>
 <span class="sourceLineNo">3426</span>    movedRegions.put(encodedName, new MovedRegionInfo(destination, closeSeqNum));<a name="line.3426"></a>
 <span class="sourceLineNo">3427</span>  }<a name="line.3427"></a>
 <span class="sourceLineNo">3428</span><a name="line.3428"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
index 7f2e325..32a8ed1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.PeriodicMemStoreFlusher.html
@@ -3429,8 +3429,8 @@
 <span class="sourceLineNo">3421</span>      LOG.warn("Not adding moved region record: " + encodedName + " to self.");<a name="line.3421"></a>
 <span class="sourceLineNo">3422</span>      return;<a name="line.3422"></a>
 <span class="sourceLineNo">3423</span>    }<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>    LOG.info("Adding moved region record: "<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span>      + encodedName + " to " + destination + " as of " + closeSeqNum);<a name="line.3425"></a>
+<span class="sourceLineNo">3424</span>    LOG.info("Adding " + encodedName + " move to " + destination + " record at close sequenceid=" +<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>        closeSeqNum);<a name="line.3425"></a>
 <span class="sourceLineNo">3426</span>    movedRegions.put(encodedName, new MovedRegionInfo(destination, closeSeqNum));<a name="line.3426"></a>
 <span class="sourceLineNo">3427</span>  }<a name="line.3427"></a>
 <span class="sourceLineNo">3428</span><a name="line.3428"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
index 7f2e325..32a8ed1 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegionServer.html
@@ -3429,8 +3429,8 @@
 <span class="sourceLineNo">3421</span>      LOG.warn("Not adding moved region record: " + encodedName + " to self.");<a name="line.3421"></a>
 <span class="sourceLineNo">3422</span>      return;<a name="line.3422"></a>
 <span class="sourceLineNo">3423</span>    }<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>    LOG.info("Adding moved region record: "<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span>      + encodedName + " to " + destination + " as of " + closeSeqNum);<a name="line.3425"></a>
+<span class="sourceLineNo">3424</span>    LOG.info("Adding " + encodedName + " move to " + destination + " record at close sequenceid=" +<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>        closeSeqNum);<a name="line.3425"></a>
 <span class="sourceLineNo">3426</span>    movedRegions.put(encodedName, new MovedRegionInfo(destination, closeSeqNum));<a name="line.3426"></a>
 <span class="sourceLineNo">3427</span>  }<a name="line.3427"></a>
 <span class="sourceLineNo">3428</span><a name="line.3428"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index d5fb871..52aa148 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -966,7 +966,7 @@
 <span class="sourceLineNo">958</span>        }<a name="line.958"></a>
 <span class="sourceLineNo">959</span>        if (ioe != null) throw ioe;<a name="line.959"></a>
 <span class="sourceLineNo">960</span>      }<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      LOG.info("Closed {}", this);<a name="line.961"></a>
+<span class="sourceLineNo">961</span>      LOG.trace("Closed {}", this);<a name="line.961"></a>
 <span class="sourceLineNo">962</span>      return result;<a name="line.962"></a>
 <span class="sourceLineNo">963</span>    } finally {<a name="line.963"></a>
 <span class="sourceLineNo">964</span>      this.lock.writeLock().unlock();<a name="line.964"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
index d5fb871..52aa148 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -966,7 +966,7 @@
 <span class="sourceLineNo">958</span>        }<a name="line.958"></a>
 <span class="sourceLineNo">959</span>        if (ioe != null) throw ioe;<a name="line.959"></a>
 <span class="sourceLineNo">960</span>      }<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      LOG.info("Closed {}", this);<a name="line.961"></a>
+<span class="sourceLineNo">961</span>      LOG.trace("Closed {}", this);<a name="line.961"></a>
 <span class="sourceLineNo">962</span>      return result;<a name="line.962"></a>
 <span class="sourceLineNo">963</span>    } finally {<a name="line.963"></a>
 <span class="sourceLineNo">964</span>      this.lock.writeLock().unlock();<a name="line.964"></a>


[46/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
index 82da4d7..97e1398 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3402">HRegion.MutationBatchOperation</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.3414">HRegion.MutationBatchOperation</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</pre>
 <div class="block">Batch of mutation operations. Base class is shared with <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.ReplayBatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver"><code>HRegion.ReplayBatchOperation</code></a> as most
  of the logic is same.</div>
@@ -342,7 +342,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>nonceGroup</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3403">nonceGroup</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3415">nonceGroup</a></pre>
 </li>
 </ul>
 <a name="nonce">
@@ -351,7 +351,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>nonce</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3404">nonce</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3416">nonce</a></pre>
 </li>
 </ul>
 </li>
@@ -368,7 +368,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MutationBatchOperation</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3405">MutationBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3417">MutationBatchOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                               <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;operations,
                               boolean&nbsp;atomic,
                               long&nbsp;nonceGroup,
@@ -389,7 +389,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutation</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3414">getMutation</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3426">getMutation</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutation-int-">getMutation</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -402,7 +402,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3419">getNonceGroup</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3431">getNonceGroup</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonceGroup-int-">getNonceGroup</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -415,7 +415,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3424">getNonce</a>(int&nbsp;index)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3436">getNonce</a>(int&nbsp;index)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getNonce-int-">getNonce</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -428,7 +428,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getMutationsForCoprocs</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3429">getMutationsForCoprocs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3441">getMutationsForCoprocs</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getMutationsForCoprocs--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">This method is potentially expensive and useful mostly for non-replay CP path.</div>
 <dl>
@@ -443,7 +443,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>isInReplay</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3434">isInReplay</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3446">isInReplay</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#isInReplay--">isInReplay</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -456,7 +456,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3439">getOrigLogSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3451">getOrigLogSeqNum</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#getOrigLogSeqNum--">getOrigLogSeqNum</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.BatchOperation</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;</code></dd>
@@ -469,7 +469,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3444">startRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3456">startRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -485,7 +485,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3449">closeRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3461">closeRegionOperation</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -501,7 +501,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPreparePut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3454">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3466">checkAndPreparePut</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Put.html" title="class in org.apache.hadoop.hbase.client">Put</a>&nbsp;p)
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPreparePut-org.apache.hadoop.hbase.client.Put-">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Implement any Put request specific check and prepare logic here. Please refer to
@@ -520,7 +520,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndPrepare</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3459">checkAndPrepare</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3471">checkAndPrepare</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#checkAndPrepare--">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Validates each mutation and prepares a batch for write. If necessary (non-replay case), runs
@@ -542,7 +542,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3504">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3516">prepareMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                        long&nbsp;timestamp,
                                        <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks)
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -563,7 +563,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>buildWALEdits</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3540">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt
 ;&nbsp;miniBatchOp)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&gt;&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3552">buildWALEdits</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt
 ;&nbsp;miniBatchOp)
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#buildWALEdits-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">HRegion.BatchOperation</a></code></span></div>
 <div class="block">Builds separate WALEdit per nonce by applying input mutations. If WALEdits from CP are
@@ -582,7 +582,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>writeMiniBatchOperationsToMemStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3551">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3563">writeMiniBatchOperationsToMemStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                                                                     @Nullable
                                                                                     <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                                                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -602,7 +602,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>completeMiniBatchOperations</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3562">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3574">completeMiniBatchOperations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#completeMiniBatchOperations-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">HRegion.BatchOperation</a></code></span></div>
@@ -622,7 +622,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>doPostOpCleanupForMiniBatch</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3574">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3586">doPostOpCleanupForMiniBatch</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                         <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit,
                                         boolean&nbsp;success)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -640,7 +640,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>callPreMutateCPHook</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3623">callPreMutateCPHook</a>(int&nbsp;index,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3635">callPreMutateCPHook</a>(int&nbsp;index,
                                  <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit,
                                  int[]&nbsp;metrics)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -659,7 +659,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndMergeCPMutations</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3660">checkAndMergeCPMutations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3672">checkAndMergeCPMutations</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html" title="class in org.apache.hadoop.hbase.regionserver">MiniBatchOperationInProgress</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&gt;&nbsp;miniBatchOp,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.RowLock.html" title="interface in org.apache.hadoop.hbase.regionserver">Region.RowLock</a>&gt;&nbsp;acquiredRowLocks,
                                       long&nbsp;timestamp)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -675,7 +675,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.Bat
 <ul class="blockListLast">
 <li class="blockList">
 <h4>mergeFamilyMaps</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3695">mergeFamilyMaps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html#line.3707">mergeFamilyMaps</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;familyMap,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&gt;&nbsp;toBeMerged)</pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
index 1055245..f3fb7b0 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.589">HRegion.ObservedExceptionsInBatch</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.592">HRegion.ObservedExceptionsInBatch</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">A class that tracks exceptions that have been observed in one batch. Not thread safe.</div>
 </li>
@@ -236,7 +236,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>wrongRegion</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.590">wrongRegion</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.593">wrongRegion</a></pre>
 </li>
 </ul>
 <a name="failedSanityCheck">
@@ -245,7 +245,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>failedSanityCheck</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.591">failedSanityCheck</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.594">failedSanityCheck</a></pre>
 </li>
 </ul>
 <a name="wrongFamily">
@@ -254,7 +254,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>wrongFamily</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.592">wrongFamily</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.595">wrongFamily</a></pre>
 </li>
 </ul>
 </li>
@@ -271,7 +271,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ObservedExceptionsInBatch</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.589">ObservedExceptionsInBatch</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.592">ObservedExceptionsInBatch</a>()</pre>
 </li>
 </ul>
 </li>
@@ -288,7 +288,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasSeenWrongRegion</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.597">hasSeenWrongRegion</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.600">hasSeenWrongRegion</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>If a <a href="../../../../../org/apache/hadoop/hbase/regionserver/WrongRegionException.html" title="class in org.apache.hadoop.hbase.regionserver"><code>WrongRegionException</code></a> has been observed.</dd>
@@ -301,7 +301,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sawWrongRegion</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.604">sawWrongRegion</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.607">sawWrongRegion</a>()</pre>
 <div class="block">Records that a <a href="../../../../../org/apache/hadoop/hbase/regionserver/WrongRegionException.html" title="class in org.apache.hadoop.hbase.regionserver"><code>WrongRegionException</code></a> has been observed.</div>
 </li>
 </ul>
@@ -311,7 +311,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasSeenFailedSanityCheck</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.611">hasSeenFailedSanityCheck</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.614">hasSeenFailedSanityCheck</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>If a <a href="../../../../../org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.html" title="class in org.apache.hadoop.hbase.exceptions"><code>FailedSanityCheckException</code></a> has been observed.</dd>
@@ -324,7 +324,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sawFailedSanityCheck</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.618">sawFailedSanityCheck</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.621">sawFailedSanityCheck</a>()</pre>
 <div class="block">Records that a <a href="../../../../../org/apache/hadoop/hbase/exceptions/FailedSanityCheckException.html" title="class in org.apache.hadoop.hbase.exceptions"><code>FailedSanityCheckException</code></a> has been observed.</div>
 </li>
 </ul>
@@ -334,7 +334,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasSeenNoSuchFamily</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.625">hasSeenNoSuchFamily</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.628">hasSeenNoSuchFamily</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>If a <a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver"><code>NoSuchColumnFamilyException</code></a> has been observed.</dd>
@@ -347,7 +347,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sawNoSuchFamily</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.632">sawNoSuchFamily</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.ObservedExceptionsInBatch.html#line.635">sawNoSuchFamily</a>()</pre>
 <div class="block">Records that a <a href="../../../../../org/apache/hadoop/hbase/regionserver/NoSuchColumnFamilyException.html" title="class in org.apache.hadoop.hbase.regionserver"><code>NoSuchColumnFamilyException</code></a> has been observed.</div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
index 4dedb2e..8eb6446 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.540">HRegion.PrepareFlushResult</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.543">HRegion.PrepareFlushResult</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">A result object from prepare flush cache stage</div>
 </li>
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>result</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.541">result</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.544">result</a></pre>
 </li>
 </ul>
 <a name="storeFlushCtxs">
@@ -267,7 +267,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>storeFlushCtxs</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.542">storeFlushCtxs</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.545">storeFlushCtxs</a></pre>
 </li>
 </ul>
 <a name="committedFiles">
@@ -276,7 +276,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>committedFiles</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.543">committedFiles</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.546">committedFiles</a></pre>
 </li>
 </ul>
 <a name="storeFlushableSize">
@@ -285,7 +285,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>storeFlushableSize</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.544">storeFlushableSize</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.547">storeFlushableSize</a></pre>
 </li>
 </ul>
 <a name="startTime">
@@ -294,7 +294,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startTime</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.545">startTime</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.548">startTime</a></pre>
 </li>
 </ul>
 <a name="flushOpSeqId">
@@ -303,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushOpSeqId</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.546">flushOpSeqId</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.549">flushOpSeqId</a></pre>
 </li>
 </ul>
 <a name="flushedSeqId">
@@ -312,7 +312,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushedSeqId</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.547">flushedSeqId</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.550">flushedSeqId</a></pre>
 </li>
 </ul>
 <a name="totalFlushableSize">
@@ -321,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>totalFlushableSize</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.548">totalFlushableSize</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.551">totalFlushableSize</a></pre>
 </li>
 </ul>
 </li>
@@ -338,7 +338,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>PrepareFlushResult</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.551">PrepareFlushResult</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;result,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.554">PrepareFlushResult</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;result,
                    long&nbsp;flushSeqId)</pre>
 <div class="block">Constructs an early exit case</div>
 </li>
@@ -349,7 +349,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>PrepareFlushResult</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.556">PrepareFlushResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&gt;&nbsp;storeFlushCtxs,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.559">PrepareFlushResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&gt;&nbsp;storeFlushCtxs,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&gt;&nbsp;committedFiles,
                    <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&gt;&nbsp;storeFlushableSize,
                    long&nbsp;startTime,
@@ -365,7 +365,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PrepareFlushResult</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.565">PrepareFlushResult</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;result,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.568">PrepareFlushResult</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResultImpl.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.FlushResultImpl</a>&nbsp;result,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a>&gt;&nbsp;storeFlushCtxs,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.fs.Path&gt;&gt;&nbsp;committedFiles,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&gt;&nbsp;storeFlushableSize,
@@ -389,7 +389,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getResult</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.581">getResult</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.html" title="interface in org.apache.hadoop.hbase.regionserver">HRegion.FlushResult</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html#line.584">getResult</a>()</pre>
 </li>
 </ul>
 </li>


[43/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
index b022e4a..02823a8 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -357,275 +357,283 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#DEFAULT_ROWLOCK_WAIT_DURATION">DEFAULT_ROWLOCK_WAIT_DURATION</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>static boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#DEFAULT_WAL_HSYNC">DEFAULT_WAL_HSYNC</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#explicitSplitPoint">explicitSplitPoint</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#filteredReadRequestsCount">filteredReadRequestsCount</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#FIXED_OVERHEAD">FIXED_OVERHEAD</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#flushCheckInterval">flushCheckInterval</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#flushesQueued">flushesQueued</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#flushPerChanges">flushPerChanges</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">FlushPolicy</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#flushPolicy">flushPolicy</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#FOR_UNIT_TESTS_ONLY">FOR_UNIT_TESTS_ONLY</a></span></code>
 <div class="block">Row needed by below method.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#fs">fs</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#HBASE_MAX_CELL_SIZE_KEY">HBASE_MAX_CELL_SIZE_KEY</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#HBASE_REGIONSERVER_MINIBATCH_SIZE">HBASE_REGIONSERVER_MINIBATCH_SIZE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#htableDescriptor">htableDescriptor</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#isLoadingCfsOnDemandDefault">isLoadingCfsOnDemandDefault</a></span></code>
 <div class="block">The default setting for whether to enable on-demand CF loading for
  scan requests to this region.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#lastFlushOpSeqId">lastFlushOpSeqId</a></span></code>
 <div class="block">Record the sequence id of last flush operation.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#lastReplayedCompactionSeqId">lastReplayedCompactionSeqId</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#lastReplayedOpenRegionSeqId">lastReplayedOpenRegionSeqId</a></span></code>
 <div class="block">The sequence id of the last replayed open region event from the primary region.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#lastStoreFlushTimeMap">lastStoreFlushTimeMap</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#LOAD_CFS_ON_DEMAND_CONFIG_KEY">LOAD_CFS_ON_DEMAND_CONFIG_KEY</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#lock">lock</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#lockedRows">lockedRows</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#majorInProgress">majorInProgress</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#MAX_FLUSH_PER_CHANGES">MAX_FLUSH_PER_CHANGES</a></span></code>
 <div class="block">The following MAX_FLUSH_PER_CHANGES is large enough because each KeyValue has 20+ bytes
  overhead.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxBusyWaitDuration">maxBusyWaitDuration</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxBusyWaitMultiplier">maxBusyWaitMultiplier</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxCellSize">maxCellSize</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxFlushedSeqId">maxFlushedSeqId</a></span></code>
 <div class="block">The max sequence id of flushed data on this region.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxSeqIdInStores">maxSeqIdInStores</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#MEMSTORE_FLUSH_PER_CHANGES">MEMSTORE_FLUSH_PER_CHANGES</a></span></code>
 <div class="block">Conf key to force a flush if there are already enough changes for one region in memstore</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#MEMSTORE_PERIODIC_FLUSH_INTERVAL">MEMSTORE_PERIODIC_FLUSH_INTERVAL</a></span></code>
 <div class="block">Conf key for the periodic flush interval</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#memstoreFlushSize">memstoreFlushSize</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#memStoreSize">memStoreSize</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegion.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegion</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#metricsRegion">metricsRegion</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionWrapperImpl</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#metricsRegionWrapper">metricsRegionWrapper</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#miniBatchSize">miniBatchSize</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#minorInProgress">minorInProgress</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#MOCKED_LIST">MOCKED_LIST</a></span></code>
 <div class="block">A mocked list implementation - discards all updates.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#mvcc">mvcc</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#numMutationsWithoutWAL">numMutationsWithoutWAL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#openSeqNum">openSeqNum</a></span></code>
 <div class="block">The sequence ID that was enLongAddered when this region was opened.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#prepareFlushResult">prepareFlushResult</a></span></code>
 <div class="block">Saved state from replaying prepare flush cache</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#readRequestsCount">readRequestsCount</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#regionDurability">regionDurability</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#regionServicesForStores">regionServicesForStores</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#regionStatsEnabled">regionStatsEnabled</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#replicationScope">replicationScope</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#rowLockWaitDuration">rowLockWaitDuration</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#rowProcessorExecutor">rowProcessorExecutor</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#rowProcessorTimeout">rowProcessorTimeout</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerAccounting</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#rsAccounting">rsAccounting</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#rsServices">rsServices</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#scannerReadPoints">scannerReadPoints</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">RegionSplitPolicy</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#splitPolicy">splitPolicy</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#splitRequest">splitRequest</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/regionserver/throttle/StoreHotnessProtector.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">StoreHotnessProtector</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#storeHotnessProtector">storeHotnessProtector</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#stores">stores</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#SYSTEM_CACHE_FLUSH_INTERVAL">SYSTEM_CACHE_FLUSH_INTERVAL</a></span></code>
 <div class="block">Default interval for System tables memstore flush</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#timeoutForWriteLock">timeoutForWriteLock</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#timestampSlop">timestampSlop</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#updatesLock">updatesLock</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#wal">wal</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#WAL_HSYNC_CONF_KEY">WAL_HSYNC_CONF_KEY</a></span></code>&nbsp;</td>
+</tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#writeRequestsCount">writeRequestsCount</a></span></code>&nbsp;</td>
@@ -2340,13 +2348,24 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 </dl>
 </li>
 </ul>
+<a name="DEFAULT_DURABILITY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>DEFAULT_DURABILITY</h4>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.237">DEFAULT_DURABILITY</a></pre>
+<div class="block">This is the global default value for durability. All tables/mutations not
+ defining a durability or using USE_DEFAULT will default to this value.</div>
+</li>
+</ul>
 <a name="HBASE_REGIONSERVER_MINIBATCH_SIZE">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_REGIONSERVER_MINIBATCH_SIZE</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.233">HBASE_REGIONSERVER_MINIBATCH_SIZE</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.239">HBASE_REGIONSERVER_MINIBATCH_SIZE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.HBASE_REGIONSERVER_MINIBATCH_SIZE">Constant Field Values</a></dd>
@@ -2359,22 +2378,37 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE</h4>
-<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.235">DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.241">DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
-<a name="DEFAULT_DURABILITY">
+<a name="WAL_HSYNC_CONF_KEY">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>DEFAULT_DURABILITY</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.241">DEFAULT_DURABILITY</a></pre>
-<div class="block">This is the global default value for durability. All tables/mutations not
- defining a durability or using USE_DEFAULT will default to this value.</div>
+<h4>WAL_HSYNC_CONF_KEY</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.243">WAL_HSYNC_CONF_KEY</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.WAL_HSYNC_CONF_KEY">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="DEFAULT_WAL_HSYNC">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>DEFAULT_WAL_HSYNC</h4>
+<pre>public static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.244">DEFAULT_WAL_HSYNC</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.DEFAULT_WAL_HSYNC">Constant Field Values</a></dd>
+</dl>
 </li>
 </ul>
 <a name="closed">
@@ -2383,7 +2417,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>closed</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.243">closed</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.246">closed</a></pre>
 </li>
 </ul>
 <a name="closing">
@@ -2392,7 +2426,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>closing</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.250">closing</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.253">closing</a></pre>
 </li>
 </ul>
 <a name="maxFlushedSeqId">
@@ -2401,7 +2435,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>maxFlushedSeqId</h4>
-<pre>private volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.256">maxFlushedSeqId</a></pre>
+<pre>private volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.259">maxFlushedSeqId</a></pre>
 <div class="block">The max sequence id of flushed data on this region. There is no edit in memory that is
  less that this sequence id.</div>
 </li>
@@ -2412,7 +2446,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>lastFlushOpSeqId</h4>
-<pre>private volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.263">lastFlushOpSeqId</a></pre>
+<pre>private volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.266">lastFlushOpSeqId</a></pre>
 <div class="block">Record the sequence id of last flush operation. Can be in advance of
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxFlushedSeqId"><code>maxFlushedSeqId</code></a> when flushing a single column family. In this case,
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html#maxFlushedSeqId"><code>maxFlushedSeqId</code></a> will be older than the oldest edit in memory.</div>
@@ -2424,7 +2458,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>lastReplayedOpenRegionSeqId</h4>
-<pre>protected volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.270">lastReplayedOpenRegionSeqId</a></pre>
+<pre>protected volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.273">lastReplayedOpenRegionSeqId</a></pre>
 <div class="block">The sequence id of the last replayed open region event from the primary region. This is used
  to skip entries before this due to the possibility of replay edits coming out of order from
  replication.</div>
@@ -2436,7 +2470,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>lastReplayedCompactionSeqId</h4>
-<pre>protected volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.271">lastReplayedCompactionSeqId</a></pre>
+<pre>protected volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.274">lastReplayedCompactionSeqId</a></pre>
 </li>
 </ul>
 <a name="lockedRows">
@@ -2445,7 +2479,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>lockedRows</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.282">lockedRows</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/HashedBytes.html" title="class in org.apache.hadoop.hbase.util">HashedBytes</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.RowLockContext.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.RowLockContext</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.285">lockedRows</a></pre>
 </li>
 </ul>
 <a name="stores">
@@ -2454,7 +2488,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>stores</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.285">stores</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.288">stores</a></pre>
 </li>
 </ul>
 <a name="coprocessorServiceHandlers">
@@ -2463,7 +2497,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>coprocessorServiceHandlers</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,com.google.protobuf.Service&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.289">coprocessorServiceHandlers</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,com.google.protobuf.Service&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.292">coprocessorServiceHandlers</a></pre>
 </li>
 </ul>
 <a name="memStoreSize">
@@ -2472,7 +2506,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>memStoreSize</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.292">memStoreSize</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.295">memStoreSize</a></pre>
 </li>
 </ul>
 <a name="regionServicesForStores">
@@ -2481,7 +2515,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServicesForStores</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.293">regionServicesForStores</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.296">regionServicesForStores</a></pre>
 </li>
 </ul>
 <a name="numMutationsWithoutWAL">
@@ -2490,7 +2524,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>numMutationsWithoutWAL</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.296">numMutationsWithoutWAL</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.299">numMutationsWithoutWAL</a></pre>
 </li>
 </ul>
 <a name="dataInMemoryWithoutWAL">
@@ -2499,7 +2533,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>dataInMemoryWithoutWAL</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.297">dataInMemoryWithoutWAL</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.300">dataInMemoryWithoutWAL</a></pre>
 </li>
 </ul>
 <a name="checkAndMutateChecksPassed">
@@ -2508,7 +2542,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndMutateChecksPassed</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.300">checkAndMutateChecksPassed</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.303">checkAndMutateChecksPassed</a></pre>
 </li>
 </ul>
 <a name="checkAndMutateChecksFailed">
@@ -2517,7 +2551,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>checkAndMutateChecksFailed</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.301">checkAndMutateChecksFailed</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.304">checkAndMutateChecksFailed</a></pre>
 </li>
 </ul>
 <a name="readRequestsCount">
@@ -2526,7 +2560,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>readRequestsCount</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.305">readRequestsCount</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.308">readRequestsCount</a></pre>
 </li>
 </ul>
 <a name="filteredReadRequestsCount">
@@ -2535,7 +2569,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>filteredReadRequestsCount</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.306">filteredReadRequestsCount</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.309">filteredReadRequestsCount</a></pre>
 </li>
 </ul>
 <a name="writeRequestsCount">
@@ -2544,7 +2578,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>writeRequestsCount</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.308">writeRequestsCount</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.311">writeRequestsCount</a></pre>
 </li>
 </ul>
 <a name="blockedRequestsCount">
@@ -2553,7 +2587,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>blockedRequestsCount</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.311">blockedRequestsCount</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.314">blockedRequestsCount</a></pre>
 </li>
 </ul>
 <a name="compactionsFinished">
@@ -2562,7 +2596,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionsFinished</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.314">compactionsFinished</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.317">compactionsFinished</a></pre>
 </li>
 </ul>
 <a name="compactionsFailed">
@@ -2571,7 +2605,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionsFailed</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.315">compactionsFailed</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.318">compactionsFailed</a></pre>
 </li>
 </ul>
 <a name="compactionNumFilesCompacted">
@@ -2580,7 +2614,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionNumFilesCompacted</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.316">compactionNumFilesCompacted</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.319">compactionNumFilesCompacted</a></pre>
 </li>
 </ul>
 <a name="compactionNumBytesCompacted">
@@ -2589,7 +2623,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionNumBytesCompacted</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.317">compactionNumBytesCompacted</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.320">compactionNumBytesCompacted</a></pre>
 </li>
 </ul>
 <a name="compactionsQueued">
@@ -2598,7 +2632,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>compactionsQueued</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.318">compactionsQueued</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.321">compactionsQueued</a></pre>
 </li>
 </ul>
 <a name="flushesQueued">
@@ -2607,7 +2641,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>flushesQueued</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.319">flushesQueued</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.322">flushesQueued</a></pre>
 </li>
 </ul>
 <a name="wal">
@@ -2616,7 +2650,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>wal</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.321">wal</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.324">wal</a></pre>
 </li>
 </ul>
 <a name="fs">
@@ -2625,7 +2659,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>fs</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.322">fs</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.325">fs</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -2634,7 +2668,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.323">conf</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.326">conf</a></pre>
 </li>
 </ul>
 <a name="baseConf">
@@ -2643,7 +2677,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>baseConf</h4>
-<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.324">baseConf</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.327">baseConf</a></pre>
 </li>
 </ul>
 <a name="rowLockWaitDuration">
@@ -2652,7 +2686,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>rowLockWaitDuration</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.325">rowLockWaitDuration</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.328">rowLockWaitDuration</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_ROWLOCK_WAIT_DURATION">
@@ -2661,7 +2695,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ROWLOCK_WAIT_DURATION</h4>
-<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.326">DEFAULT_ROWLOCK_WAIT_DURATION</a></pre>
+<pre>static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.329">DEFAULT_ROWLOCK_WAIT_DURATION</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.DEFAULT_ROWLOCK_WAIT_DURATION">Constant Field Values</a></dd>
@@ -2674,7 +2708,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>busyWaitDuration</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.334">busyWaitDuration</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.337">busyWaitDuration</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_BUSY_WAIT_DURATION">
@@ -2683,7 +2717,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_BUSY_WAIT_DURATION</h4>
-<pre>static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.335">DEFAULT_BUSY_WAIT_DURATION</a></pre>
+<pre>static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.338">DEFAULT_BUSY_WAIT_DURATION</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.DEFAULT_BUSY_WAIT_DURATION">Constant Field Values</a></dd>
@@ -2696,7 +2730,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>maxBusyWaitMultiplier</h4>
-<pre>final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.340">maxBusyWaitMultiplier</a></pre>
+<pre>final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.343">maxBusyWaitMultiplier</a></pre>
 </li>
 </ul>
 <a name="maxBusyWaitDuration">
@@ -2705,7 +2739,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>maxBusyWaitDuration</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.344">maxBusyWaitDuration</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.347">maxBusyWaitDuration</a></pre>
 </li>
 </ul>
 <a name="maxCellSize">
@@ -2714,7 +2748,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>maxCellSize</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.348">maxCellSize</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.351">maxCellSize</a></pre>
 </li>
 </ul>
 <a name="miniBatchSize">
@@ -2723,7 +2757,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>miniBatchSize</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.351">miniBatchSize</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.354">miniBatchSize</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_ROW_PROCESSOR_TIMEOUT">
@@ -2732,7 +2766,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ROW_PROCESSOR_TIMEOUT</h4>
-<pre>static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.354">DEFAULT_ROW_PROCESSOR_TIMEOUT</a></pre>
+<pre>static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.357">DEFAULT_ROW_PROCESSOR_TIMEOUT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.HRegion.DEFAULT_ROW_PROCESSOR_TIMEOUT">Constant Field Values</a></dd>
@@ -2745,7 +2779,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>rowProcessorExecutor</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.355">rowProcessorExecutor</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html?is-external=true" title="class or interface in java.util.concurrent">ExecutorService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.358">rowProcessorExecutor</a></pre>
 </li>
 </ul>
 <a name="scannerReadPoints">
@@ -2754,7 +2788,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>scannerReadPoints</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.357">scannerReadPoints</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionScanner</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.360">scannerReadPoints</a></pre>
 </li>
 </ul>
 <a name="openSeqNum">
@@ -2763,7 +2797,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>openSeqNum</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.362">openSeqNum</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.365">openSeqNum</a></pre>
 <div class="block">The sequence ID that was enLongAddered when this region was opened.</div>
 </li>
 </ul>
@@ -2773,7 +2807,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>isLoadingCfsOnDemandDefault</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.368">isLoadingCfsOnDemandDefault</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.371">isLoadingCfsOnDemandDefault</a></pre>
 <div class="block">The default setting for whether to enable on-demand CF loading for
  scan requests to this region. Requests can override it.</div>
 </li>
@@ -2784,7 +2818,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>majorInProgress</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.370">majorInProgress</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.373">majorInProgress</a></pre>
 </li>
 </ul>
 <a name="minorInProgress">
@@ -2793,7 +2827,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>minorInProgress</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.371">minorInProgress</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.374">minorInProgress</a></pre>
 </li>
 </ul>
 <a name="maxSeqIdInStores">
@@ -2802,7 +2836,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>maxSeqIdInStores</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.379">maxSeqIdInStores</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.382">maxSeqIdInStores</a></pre>
 </li>
 </ul>
 <a name="prepareFlushResult">
@@ -2811,7 +2845,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareFlushResult</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.382">prepareFlushResult</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.PrepareFlushResult</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.385">prepareFlushResult</a></pre>
 <div class="block">Saved state from replaying prepare flush cache</div>
 </li>
 </ul>
@@ -2821,7 +2855,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>configurationManager</h4>
-<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.384">configurationManager</a></pre>
+<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.387">configurationManager</a></pre>
 </li>
 </ul>
 <a name="timeoutForWriteLock">
@@ -2830,7 +2864,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>timeoutForWriteLock</h4>
-<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.387">timeoutForWriteLock</a></pre>
+<pre>private volatile&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.390">timeoutForWriteLock</a></pre>
 </li>
 </ul>
 <a name="writestate">
@@ -2839,7 +2873,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>writestate</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.WriteState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.637">writestate</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion.WriteState</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.640">writestate</a></pre>
 </li>
 </ul>
 <a name="memstoreFlushSize">
@@ -2848,7 +2882,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>memstoreFlushSize</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.639">memstoreFlushSize</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.642">memstoreFlushSize</a></pre>
 </li>
 </ul>
 <a name="timestampSlop">
@@ -2857,7 +2891,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>timestampSlop</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.640">timestampSlop</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.643">timestampSlop</a></pre>
 </li>
 </ul>
 <a name="rowProcessorTimeout">
@@ -2866,7 +2900,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>rowProcessorTimeout</h4>
-<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.641">rowProcessorTimeout</a></pre>
+<pre>final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.644">rowProcessorTimeout</a></pre>
 </li>
 </ul>
 <a name="lastStoreFlushTimeMap">
@@ -2875,7 +2909,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>lastStoreFlushTimeMap</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.644">lastStoreFlushTimeMap</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.647">lastStoreFlushTimeMap</a></pre>
 </li>
 </ul>
 <a name="rsServices">
@@ -2884,7 +2918,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>rsServices</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.646">rsServices</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerServices.html" title="interface in org.apache.hadoop.hbase.regionserver">RegionServerServices</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.649">rsServices</a></pre>
 </li>
 </ul>
 <a name="rsAccounting">
@@ -2893,7 +2927,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>rsAccounting</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerAccounting</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.647">rsAccounting</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServerAccounting</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.650">rsAccounting</a></pre>
 </li>
 </ul>
 <a name="flushCheckInterval">
@@ -2902,7 +2936,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCheckInterval</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.648">flushCheckInterval</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.651">flushCheckInterval</a></pre>
 </li>
 </ul>
 <a name="flushPerChanges">
@@ -2911,7 +2945,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>flushPerChanges</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.650">flushPerChanges</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.653">flushPerChanges</a></pre>
 </li>
 </ul>
 <a name="blockingMemStoreSize">
@@ -2920,7 +2954,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>blockingMemStoreSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.651">blockingMemStoreSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.654">blockingMemStoreSize</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -2929,7 +2963,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.653">lock</a></pre>
+<pre>final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.656">lock</a></pre>
 </li>
 </ul>
 <a name="updatesLock">
@@ -2938,7 +2972,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>updatesLock</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.656">updatesLock</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.659">updatesLock</a></pre>
 </li>
 </ul>
 <a name="splitRequest">
@@ -2947,7 +2981,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>splitRequest</h4>
-<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.657">splitRequest</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.660">splitRequest</a></pre>
 </li>
 </ul>
 <a name="explicitSplitPoint">
@@ -2956,7 +2990,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>explicitSplitPoint</h4>
-<pre>private&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.658">explicitSplitPoint</a></pre>
+<pre>private&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.661">explicitSplitPoint</a></pre>
 </li>
 </ul>
 <a name="mvcc">
@@ -2965,7 +2999,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>mvcc</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.660">mvcc</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.663">mvcc</a></pre>
 </li>
 </ul>
 <a name="coprocessorHost">
@@ -2974,7 +3008,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>coprocessorHost</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.663">coprocessorHost</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.666">coprocessorHost</a></pre>
 </li>
 </ul>
 <a name="htableDescriptor">
@@ -2983,7 +3017,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>htableDescriptor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.665">htableDescriptor</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.668">htableDescriptor</a></pre>
 </li>
 </ul>
 <a name="splitPolicy">
@@ -2992,7 +3026,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>splitPolicy</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">RegionSplitPolicy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.666">splitPolicy</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionSplitPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">RegionSplitPolicy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.669">splitPolicy</a></pre>
 </li>
 </ul>
 <a name="flushPolicy">
@@ -3001,7 +3035,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>flushPolicy</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">FlushPolicy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.667">flushPolicy</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">FlushPolicy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.670">flushPolicy</a></pre>
 </li>
 </ul>
 <a name="metricsRegion">
@@ -3010,7 +3044,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsRegion</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegion.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.669">metricsRegion</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegion.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.672">metricsRegion</a></pre>
 </li>
 </ul>
 <a name="metricsRegionWrapper">
@@ -3019,7 +3053,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsRegionWrapper</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionWrapperImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.670">metricsRegionWrapper</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionWrapperImpl.html" title="class in org.apache.hadoop.hbase.regionserver">MetricsRegionWrapperImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.673">metricsRegionWrapper</a></pre>
 </li>
 </ul>
 <a name="regionDurability">
@@ -3028,7 +3062,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>regionDurability</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.671">regionDurability</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.674">regionDurability</a></pre>
 </li>
 </ul>
 <a name="regionStatsEnabled">
@@ -3037,7 +3071,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>regionStatsEnabled</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.672">regionStatsEnabled</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.675">regionStatsEnabled</a></pre>
 </li>
 </ul>
 <a name="replicationScope">
@@ -3046,7 +3080,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" tit
 <ul class="blockList">
 <li

<TRUNCATED>

[44/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
index 36ebb94..8e5146d 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.414">HRegion.WriteState</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.417">HRegion.WriteState</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -239,7 +239,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushing</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.416">flushing</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.419">flushing</a></pre>
 </li>
 </ul>
 <a name="flushRequested">
@@ -248,7 +248,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRequested</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.418">flushRequested</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.421">flushRequested</a></pre>
 </li>
 </ul>
 <a name="compacting">
@@ -257,7 +257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compacting</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.420">compacting</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.423">compacting</a></pre>
 </li>
 </ul>
 <a name="writesEnabled">
@@ -266,7 +266,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writesEnabled</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.422">writesEnabled</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.425">writesEnabled</a></pre>
 </li>
 </ul>
 <a name="readOnly">
@@ -275,7 +275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readOnly</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.424">readOnly</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.427">readOnly</a></pre>
 </li>
 </ul>
 <a name="readsEnabled">
@@ -284,7 +284,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>readsEnabled</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.427">readsEnabled</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.430">readsEnabled</a></pre>
 </li>
 </ul>
 <a name="HEAP_SIZE">
@@ -293,7 +293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HEAP_SIZE</h4>
-<pre>static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.451">HEAP_SIZE</a></pre>
+<pre>static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.454">HEAP_SIZE</a></pre>
 </li>
 </ul>
 </li>
@@ -310,7 +310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WriteState</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.414">WriteState</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.417">WriteState</a>()</pre>
 </li>
 </ul>
 </li>
@@ -327,7 +327,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setReadOnly</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.434">setReadOnly</a>(boolean&nbsp;onOff)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.437">setReadOnly</a>(boolean&nbsp;onOff)</pre>
 <div class="block">Set flags that make this region read-only.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -341,7 +341,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isReadOnly</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.439">isReadOnly</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.442">isReadOnly</a>()</pre>
 </li>
 </ul>
 <a name="isFlushRequested--">
@@ -350,7 +350,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isFlushRequested</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.443">isFlushRequested</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.446">isFlushRequested</a>()</pre>
 </li>
 </ul>
 <a name="setReadsEnabled-boolean-">
@@ -359,7 +359,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setReadsEnabled</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.447">setReadsEnabled</a>(boolean&nbsp;readsEnabled)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.WriteState.html#line.450">setReadsEnabled</a>(boolean&nbsp;readsEnabled)</pre>
 </li>
 </ul>
 </li>


[35/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
index 807ed6b..3dbdec3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html
@@ -206,392 +206,389 @@
 <span class="sourceLineNo">198</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.198"></a>
 <span class="sourceLineNo">199</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.199"></a>
 <span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      if (LOG.isDebugEnabled()) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        LOG.debug("FLUSHING TO DISK: region "<a name="line.202"></a>
-<span class="sourceLineNo">203</span>            + getRegionServices().getRegionInfo().getRegionNameAsString() + "store: "<a name="line.203"></a>
-<span class="sourceLineNo">204</span>            + getFamilyName());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      stopCompaction();<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      pushActiveToPipeline(this.active);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      if (compositeSnapshot) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        pushPipelineToSnapshot();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      } else {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        pushTailToSnapshot();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      compactor.resetStats();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * On flush, how much memory we will clear.<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return size of data that is going to be flushed<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  @Override<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public MemStoreSize getFlushableSize() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (compositeSnapshot) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  protected long keySize() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    long k = this.active.keySize();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      k += segment.keySize();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    return k;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  protected long heapSize() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    long h = this.active.heapSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      h += segment.heapSize();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return h;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      WAL WAL = getRegionServices().getWAL();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (WAL != null) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  /**<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * This message intends to inform the MemStore that next coming updates<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * are going to be part of the replaying edits from WAL<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  public void startReplayingFromWAL() {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    inWalReplay = true;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * are done<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  public void stopReplayingFromWAL() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    inWalReplay = false;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // the getSegments() method is used for tests only<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  @VisibleForTesting<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Override<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    list.add(this.active);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    list.addAll(pipelineList);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.299"></a>
+<span class="sourceLineNo">201</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      stopCompaction();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      pushActiveToPipeline(this.active);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      if (compositeSnapshot) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        pushPipelineToSnapshot();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      } else {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        pushTailToSnapshot();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      compactor.resetStats();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * On flush, how much memory we will clear.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return size of data that is going to be flushed<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public MemStoreSize getFlushableSize() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      if (compositeSnapshot) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  protected long keySize() {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    long k = this.active.keySize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      k += segment.keySize();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return k;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  protected long heapSize() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    long h = this.active.heapSize();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      h += segment.heapSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return h;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  @Override<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      WAL WAL = getRegionServices().getWAL();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (WAL != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * This message intends to inform the MemStore that next coming updates<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * are going to be part of the replaying edits from WAL<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void startReplayingFromWAL() {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    inWalReplay = true;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  /**<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * are done<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  public void stopReplayingFromWAL() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    inWalReplay = false;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  // the getSegments() method is used for tests only<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  @Override<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    list.add(this.active);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    list.addAll(pipelineList);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return list;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
 <span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return list;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      boolean merge) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // last true stands for updating the region size<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   *           The flattening happens only if versions match.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  // setter is used only for testability<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @VisibleForTesting<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  void setIndexType(IndexType type) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    indexType = type;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // If it is needed, please change in-memory flush size explicitly<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public IndexType getIndexType() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return indexType;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public boolean hasImmutableSegments() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    return !pipeline.isEmpty();<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return pipeline.getVersionedList();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public long getSmallestReadPoint() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return store.getSmallestReadPoint();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  public HStore getStore() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    return store;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  public String getFamilyName() {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  @Override<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  /*<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    MutableSegment activeTmp = active;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // The order is the Segment ordinal<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return list;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>   @VisibleForTesting<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Check whether anything need to be done based on the current active set size.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * The method is invoked upon every addition to the active set.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * size is above threshold<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Override<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  protected void checkActiveSize() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (shouldFlushInMemory()) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      * in the shared mode. */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        LOG.trace(<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      getPool().execute(runnable);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  // internally used method, externally visible only for tests<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // otherwise there is a deadlock<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @VisibleForTesting<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  void flushInMemory() throws IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    inMemoryFlushInProgress.set(true);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Phase I: Update the pipeline<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      getRegionServices().blockUpdates();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        pushActiveToPipeline(this.active);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      } finally {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getRegionServices().unblockUpdates();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>      // Used by tests<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (!allowCompaction.get()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        return;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      // Phase II: Compact the pipeline<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      try {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        // compaction is in progress<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        compactor.start();<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } finally {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      inMemoryFlushInProgress.set(false);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private Segment getLastSegment() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Segment localActive = getActive();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Segment tail = pipeline.getTail();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return tail == null ? localActive : tail;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  private byte[] getFamilyNameInBytes() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  private ThreadPoolExecutor getPool() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return getRegionServices().getInMemoryCompactionPool();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  @VisibleForTesting<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  protected boolean shouldFlushInMemory() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return false;     // regardless the size<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // the insert of the active into the compaction pipeline<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    return false;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  /**<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * The compaction may still happen if the request was sent too late<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * Non-blocking request<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  private void stopCompaction() {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    if (inMemoryFlushInProgress.get()) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      compactor.stop();<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    if (!active.isEmpty()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      pipeline.pushHead(active);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      resetActive();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  private void pushTailToSnapshot() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    pipeline.swap(segments,null,false, false);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  private void pushPipelineToSnapshot() {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    int iterationsCnt = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    boolean done = false;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    while (!done) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      iterationsCnt++;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // and the version increase, the chance of it happenning is very low<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      done = pipeline.swap(segments, null, false, false);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      if (iterationsCnt&gt;2) {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        // practically it is impossible that this loop iterates more than two times<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            " while flushing to disk.");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if(segments.isEmpty()) return;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.snapshot = segments.get(0);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      return;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    } else { // create composite snapshot<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.snapshot =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  private RegionServicesForStores getRegionServices() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    return regionServices;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  }<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>  /**<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  * There is at most one thread per memstore instance.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  * and compacts the pipeline.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  */<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    @Override<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    public void run() {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      try {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        flushInMemory();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      } catch (IOException e) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.543"></a>
-<span class="sourceLineNo">544</span>            + "store: "+ getFamilyName(), e);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @VisibleForTesting<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  boolean isMemStoreFlushingInMemory() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return inMemoryFlushInProgress.get();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>  /**<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   *             first.<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * @return Next row or null if none found.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  Cell getNextRow(final Cell cell) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Cell lowest = null;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    for (Segment segment : segments) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      if (lowest == null) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      } else {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return lowest;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @VisibleForTesting<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  long getInmemoryFlushSize() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    return inmemoryFlushSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>  // debug method<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  public void debug() {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    String msg = "active size=" + this.active.keySize();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    LOG.debug(msg);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>}<a name="line.586"></a>
+<span class="sourceLineNo">301</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      boolean merge) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // last true stands for updating the region size<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  /**<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   *           The flattening happens only if versions match.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  // setter is used only for testability<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  @VisibleForTesting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  void setIndexType(IndexType type) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    indexType = type;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    // If it is needed, please change in-memory flush size explicitly<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public IndexType getIndexType() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    return indexType;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  public boolean hasImmutableSegments() {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    return !pipeline.isEmpty();<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return pipeline.getVersionedList();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  public long getSmallestReadPoint() {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return store.getSmallestReadPoint();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public HStore getStore() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    return store;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>  public String getFamilyName() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  @Override<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  /*<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    MutableSegment activeTmp = active;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    // The order is the Segment ordinal<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return list;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>   @VisibleForTesting<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Check whether anything need to be done based on the current active set size.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * The method is invoked upon every addition to the active set.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * size is above threshold<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  @Override<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  protected void checkActiveSize() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (shouldFlushInMemory()) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      * in the shared mode. */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      if (LOG.isTraceEnabled()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        LOG.trace(<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      getPool().execute(runnable);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // internally used method, externally visible only for tests<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  // otherwise there is a deadlock<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  @VisibleForTesting<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  void flushInMemory() throws IOException {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    inMemoryFlushInProgress.set(true);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    try {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      // Phase I: Update the pipeline<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      getRegionServices().blockUpdates();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        pushActiveToPipeline(this.active);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        getRegionServices().unblockUpdates();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>      // Used by tests<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      if (!allowCompaction.get()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      // Phase II: Compact the pipeline<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        // compaction is in progress<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        compactor.start();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      } catch (IOException e) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } finally {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      inMemoryFlushInProgress.set(false);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private Segment getLastSegment() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    Segment localActive = getActive();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    Segment tail = pipeline.getTail();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return tail == null ? localActive : tail;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private byte[] getFamilyNameInBytes() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private ThreadPoolExecutor getPool() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getRegionServices().getInMemoryCompactionPool();<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>  @VisibleForTesting<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  protected boolean shouldFlushInMemory() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        return false;     // regardless the size<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // the insert of the active into the compaction pipeline<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return false;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * The compaction may still happen if the request was sent too late<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Non-blocking request<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  private void stopCompaction() {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    if (inMemoryFlushInProgress.get()) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      compactor.stop();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    if (!active.isEmpty()) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      pipeline.pushHead(active);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      resetActive();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>  private void pushTailToSnapshot() {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    pipeline.swap(segments,null,false, false);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  private void pushPipelineToSnapshot() {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    int iterationsCnt = 0;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    boolean done = false;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    while (!done) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      iterationsCnt++;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      // and the version increase, the chance of it happenning is very low<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      done = pipeline.swap(segments, null, false, false);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (iterationsCnt&gt;2) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        // practically it is impossible that this loop iterates more than two times<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.503"></a>
+<span class="sourceLineNo">504</span>            " while flushing to disk.");<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        break;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      }<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    if(segments.isEmpty()) return;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.snapshot = segments.get(0);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      return;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    } else { // create composite snapshot<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      this.snapshot =<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
+<span class="sourceLineNo">521</span><a name="line.521"></a>
+<span class="sourceLineNo">522</span>  private RegionServicesForStores getRegionServices() {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    return regionServices;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  * There is at most one thread per memstore instance.<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  * and compacts the pipeline.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  */<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    @Override<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    public void run() {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      try {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        flushInMemory();<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (IOException e) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.539"></a>
+<span class="sourceLineNo">540</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            + "store: "+ getFamilyName(), e);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  @VisibleForTesting<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  boolean isMemStoreFlushingInMemory() {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    return inMemoryFlushInProgress.get();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">550</span><a name="line.550"></a>
+<span class="sourceLineNo">551</span>  /**<a name="line.551"></a>
+<span class="sourceLineNo">552</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   *             first.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @return Next row or null if none found.<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  Cell getNextRow(final Cell cell) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    Cell lowest = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    for (Segment segment : segments) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      if (lowest == null) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      } else {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    return lowest;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>  @VisibleForTesting<a name="line.569"></a>
+<span class="sourceLineNo">570</span>  long getInmemoryFlushSize() {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    return inmemoryFlushSize;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  }<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>  // debug method<a name="line.574"></a>
+<span class="sourceLineNo">575</span>  public void debug() {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    String msg = "active size=" + this.active.keySize();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    LOG.debug(msg);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>}<a name="line.583"></a>
 
 
 


[14/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
index 9ee12ef..4c42811 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
@@ -51,889 +51,893 @@
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.44"></a>
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.HRegion.FlushResult;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.htrace.core.TraceScope;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * Thread that flushes cache on request<a name="line.61"></a>
-<span class="sourceLineNo">062</span> *<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * sleep time which is invariant.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * @see FlushRequester<a name="line.67"></a>
-<span class="sourceLineNo">068</span> */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>@InterfaceAudience.Private<a name="line.69"></a>
-<span class="sourceLineNo">070</span>class MemStoreFlusher implements FlushRequester {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private Configuration conf;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // These two data members go together.  Any entry in the one must have<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // a corresponding entry in the other.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private final long threadWakeFrequency;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private final HRegionServer server;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private final Object blockSignal = new Object();<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private long blockingWaitTime;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private final FlushHandler[] flushHandlers;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private FlushType flushType;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  /**<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public long getDelay(TimeUnit unit) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      return 0;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public int compareTo(Delayed o) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      return -1;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public boolean equals(Object obj) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return obj == this;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public int hashCode() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return 42;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  };<a name="line.116"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.htrace.core.TraceScope;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * Thread that flushes cache on request<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * sleep time which is invariant.<a name="line.64"></a>
+<span class="sourceLineNo">065</span> *<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * @see FlushRequester<a name="line.66"></a>
+<span class="sourceLineNo">067</span> */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>@InterfaceAudience.Private<a name="line.68"></a>
+<span class="sourceLineNo">069</span>class MemStoreFlusher implements FlushRequester {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private Configuration conf;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // These two data members go together.  Any entry in the one must have<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // a corresponding entry in the other.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final long threadWakeFrequency;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final HRegionServer server;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private final Object blockSignal = new Object();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private long blockingWaitTime;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      return 0;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
 <span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param conf<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param server<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public MemStoreFlusher(final Configuration conf,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      final HRegionServer server) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    super();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.conf = conf;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.server = server;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    this.threadWakeFrequency =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      90000);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    LOG.info("globalMemStoreLimit="<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        + TraditionalBinaryPrefix<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        + ", globalMemStoreLimitLowMark="<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        + TraditionalBinaryPrefix.long2String(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        + ", Offheap="<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    return this.updatesBlockedMsHighWater;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public void setFlushType(FlushType flushType) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.flushType = flushType;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * flush thread)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @return true if successful<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private boolean flushOneForGlobalPressure() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    switch(flushType) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        break;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      default:<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>    double secondaryMultiplier<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    boolean flushedOne = false;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    while (!flushedOne) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      HRegion bestFlushableRegion =<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // Find the biggest region that is a secondary region<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      if (bestAnyRegion == null) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        bestAnyRegion = bestRegionReplica;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return false;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>      HRegion regionToFlush;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      long bestAnyRegionSize;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      long bestFlushableRegionSize;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      switch(flushType) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          break;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          break;<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        default:<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        // life worse!<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (LOG.isDebugEnabled()) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.219"></a>
-<span class="sourceLineNo">220</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              + " has too many " + "store files, but is "<a name="line.221"></a>
-<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.222"></a>
-<span class="sourceLineNo">223</span>              + " vs best flushable region's "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + TraditionalBinaryPrefix.long2String(<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              bestFlushableRegionSize, "", 1)<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + ". Choosing the bigger.");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        regionToFlush = bestAnyRegion;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (bestFlushableRegion == null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          regionToFlush = bestAnyRegion;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          regionToFlush = bestFlushableRegion;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>      long regionToFlushSize;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      long bestRegionReplicaSize;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      switch(flushType) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          break;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          break;<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>        default:<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>      Preconditions.checkState(<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        (regionToFlush != null &amp;&amp; regionToFlushSize &gt; 0) || bestRegionReplicaSize &gt; 0);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (regionToFlush == null ||<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          (bestRegionReplica != null &amp;&amp;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.264"></a>
-<span class="sourceLineNo">265</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            TraditionalBinaryPrefix.long2String(<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (!flushedOne) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.272"></a>
-<span class="sourceLineNo">273</span>              " - trying to find a different region to refresh files.");<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          excludedRegions.add(bestRegionReplica);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      } else {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            "Flush type=" + flushType.toString() +<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            "Total Memstore Heap size=" +<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            TraditionalBinaryPrefix.long2String(<a name="line.280"></a>
-<span class="sourceLineNo">281</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            "Total Memstore Off-Heap size=" +<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
-<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            ", Region memstore size=" +<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (!flushedOne) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>              " - trying to find a different region to flush.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          excludedRegions.add(regionToFlush);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return true;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  private class FlushHandler extends HasThread {<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    private FlushHandler(String name) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      super(name);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    LOG.info("globalMemStoreLimit="<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        + TraditionalBinaryPrefix<a name="line.134"></a>
+<span class="sourceLineNo">135</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        + ", globalMemStoreLimitLowMark="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix.long2String(<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", Offheap="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    return this.updatesBlockedMsHighWater;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void setFlushType(FlushType flushType) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.flushType = flushType;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * flush thread)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @return true if successful<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private boolean flushOneForGlobalPressure() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    switch(flushType) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        break;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      default:<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    double secondaryMultiplier<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    boolean flushedOne = false;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    while (!flushedOne) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      HRegion bestFlushableRegion =<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Find the biggest region that is a secondary region<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      if (bestAnyRegion == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        bestAnyRegion = bestRegionReplica;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      if (bestAnyRegion == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return false;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>      HRegion regionToFlush;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestAnyRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      long bestFlushableRegionSize;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      switch(flushType) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          break;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          break;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>        default:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        // life worse!<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        if (LOG.isDebugEnabled()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + " has too many " + "store files, but is "<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " vs best flushable region's "<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              + TraditionalBinaryPrefix.long2String(<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              bestFlushableRegionSize, "", 1)<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              + ". Choosing the bigger.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        regionToFlush = bestAnyRegion;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      } else {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        if (bestFlushableRegion == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          regionToFlush = bestAnyRegion;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          regionToFlush = bestFlushableRegion;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long regionToFlushSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      long bestRegionReplicaSize;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      switch(flushType) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          break;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          break;<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>        default:<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return false;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (regionToFlush == null ||<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          (bestRegionReplica != null &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            TraditionalBinaryPrefix.long2String(<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        if (!flushedOne) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.276"></a>
+<span class="sourceLineNo">277</span>              " - trying to find a different region to refresh files.");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          excludedRegions.add(bestRegionReplica);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      } else {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            "Flush type=" + flushType.toString() +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            "Total Memstore Heap size=" +<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            TraditionalBinaryPrefix.long2String(<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            "Total Memstore Off-Heap size=" +<a name="line.286"></a>
+<span class="sourceLineNo">287</span>            TraditionalBinaryPrefix.long2String(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            ", Region memstore size=" +<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (!flushedOne) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.294"></a>
+<span class="sourceLineNo">295</span>              " - trying to find a different region to flush.");<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          excludedRegions.add(regionToFlush);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return true;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private class FlushHandler extends HasThread {<a name="line.324"></a>
 <span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public void run() {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      while (!server.isStopped()) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        FlushQueueEntry fqe = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>            FlushType type = isAboveLowWaterMark();<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            if (type != FlushType.NORMAL) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.337"></a>
-<span class="sourceLineNo">338</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              // we still select the regions based on the region's memstore data size.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              // it per region.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>              if (!flushOneForGlobalPressure()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                // This is unlikely to happen, but might happen when closing the<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                // entire server - another thread is flushing regions. We'll just<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                // we flushed one, so anyone blocked will check again<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                Thread.sleep(1000);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>                wakeUpIfBlocking();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.352"></a>
-<span class="sourceLineNo">353</span>              wakeupFlushThread();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          if (!flushRegion(fre)) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            break;<a name="line.359"></a>
+<span class="sourceLineNo">326</span>    private FlushHandler(String name) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      super(name);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    public void run() {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      while (!server.isStopped()) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        FlushQueueEntry fqe = null;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            FlushType type = isAboveLowWaterMark();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            if (type != FlushType.NORMAL) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // we still select the regions based on the region's memstore data size.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              // it per region.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              if (!flushOneForGlobalPressure()) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // This is unlikely to happen, but might happen when closing the<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // entire server - another thread is flushing regions. We'll just<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                // we flushed one, so anyone blocked will check again<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                Thread.sleep(1000);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                wakeUpIfBlocking();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              wakeupFlushThread();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            continue;<a name="line.359"></a>
 <span class="sourceLineNo">360</span>          }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        } catch (InterruptedException ex) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          continue;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        } catch (ConcurrentModificationException ex) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        } catch (Exception ex) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!server.checkFileSystem()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      synchronized (regionsInQueue) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>        regionsInQueue.clear();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        flushQueue.clear();<a name="line.374"></a>
+<span class="sourceLineNo">361</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          if (!flushRegion(fre)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>            break;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        } catch (InterruptedException ex) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          continue;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        } catch (ConcurrentModificationException ex) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          continue;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        } catch (Exception ex) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>          if (!server.checkFileSystem()) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>            break;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
 <span class="sourceLineNo">375</span>      }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>      // Signal anyone waiting, so they see the close flag<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      wakeUpIfBlocking();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      LOG.info(getName() + " exiting");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private void wakeupFlushThread() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private HRegion getBiggestMemStoreRegion(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      boolean checkStoreFileCount) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    synchronized (regionsInQueue) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        for (HRegion region : entry.getValue()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          if (excludedRegions.contains(region)) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            continue;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.401"></a>
+<span class="sourceLineNo">376</span>      synchronized (regionsInQueue) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        regionsInQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        flushQueue.clear();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>      // Signal anyone waiting, so they see the close flag<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      wakeUpIfBlocking();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      LOG.info(getName() + " exiting");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private void wakeupFlushThread() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private HRegion getBiggestMemStoreRegion(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      boolean checkStoreFileCount) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    synchronized (regionsInQueue) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        for (HRegion region : entry.getValue()) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          if (excludedRegions.contains(region)) {<a name="line.401"></a>
 <span class="sourceLineNo">402</span>            continue;<a name="line.402"></a>
 <span class="sourceLineNo">403</span>          }<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.405"></a>
+<span class="sourceLineNo">405</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.405"></a>
 <span class="sourceLineNo">406</span>            continue;<a name="line.406"></a>
 <span class="sourceLineNo">407</span>          }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          return region;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return null;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    synchronized (regionsInQueue) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        for (HRegion region : entry.getValue()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (excludedRegions.contains(region)) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.425"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            continue;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          return region;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return null;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    synchronized (regionsInQueue) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        for (HRegion region : entry.getValue()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          if (excludedRegions.contains(region)) {<a name="line.425"></a>
 <span class="sourceLineNo">426</span>            continue;<a name="line.426"></a>
 <span class="sourceLineNo">427</span>          }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return region;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    return null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    try {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      return region.refreshStoreFiles();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    } catch (IOException e) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return false;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  /**<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * Return true if global memory usage is above the high watermark<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private FlushType isAboveHighWaterMark() {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Return true if we're above the low watermark<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private FlushType isAboveLowWaterMark() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    r.incrementFlushesQueuedCount();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    synchronized (regionsInQueue) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        // queue. It'll come out near immediately.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        this.regionsInQueue.put(r, fqe);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        this.flushQueue.add(fqe);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    r.incrementFlushesQueuedCount();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    synchronized (regionsInQueue) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        // This entry has some delay<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        FlushRegionEntry fqe =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        fqe.requeue(delay);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        this.regionsInQueue.put(r, fqe);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        this.flushQueue.add(fqe);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public int getFlushQueueSize() {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return flushQueue.size();<a name="line.490"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            continue;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return region;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    try {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      return region.refreshStoreFiles();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    } catch (IOException e) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return false;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * Return true if global memory usage is above the high watermark<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private FlushType isAboveHighWaterMark() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * Return true if we're above the low watermark<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private FlushType isAboveLowWaterMark() {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    r.incrementFlushesQueuedCount();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (regionsInQueue) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        // queue. It'll come out near immediately.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.regionsInQueue.put(r, fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        this.flushQueue.add(fqe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      } else {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  @Override<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    r.incrementFlushesQueuedCount();<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    synchronized (regionsInQueue) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        // This entry has some delay<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushRegionEntry fqe =<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        fqe.requeue(delay);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        this.regionsInQueue.put(r, fqe);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.flushQueue.add(fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
 <span class="sourceLineNo">491</span>  }<a name="line.491"></a>
 <span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /**<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  void interruptIfNecessary() {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    lock.writeLock().lock();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    try {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        if (flushHander != null) flushHander.interrupt();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    } finally {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      lock.writeLock().unlock();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      flushHandlers[i] = new FlushHandler("MemStoreFlusher." +

<TRUNCATED>

[37/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
index 6a77cc8..7654a0e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
@@ -82,250 +82,251 @@
 <span class="sourceLineNo">074</span>   */<a name="line.74"></a>
 <span class="sourceLineNo">075</span>  private int previousState;<a name="line.75"></a>
 <span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  protected enum Flow {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    HAS_MORE_STATE,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    NO_MORE_STATE,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * called to perform a single step of the specified 'state' of the procedure<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * @param state state to execute<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * @return Flow.NO_MORE_STATE if the procedure is completed,<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   *         Flow.HAS_MORE_STATE if there is another step.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  protected abstract Flow executeFromState(TEnvironment env, TState state)<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  /**<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * called to perform the rollback of the specified state<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param state state to rollback<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @throws IOException temporary failure, the rollback will retry later<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  protected abstract void rollbackState(TEnvironment env, TState state)<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    throws IOException, InterruptedException;<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * Convert an ordinal (or state id) to an Enum (or more descriptive) state object.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * @return the state enum object<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  protected abstract TState getState(int stateId);<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * Convert the Enum (or more descriptive) state object to an ordinal (or state id).<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * @param state the state enum object<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @return stateId the ordinal() of the state enum (or state id)<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   */<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  protected abstract int getStateId(TState state);<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  /**<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * Return the initial state object that will be used for the first call to executeFromState().<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @return the initial state enum object<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected abstract TState getInitialState();<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Set the next state for the procedure.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param state the state enum object<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected void setNextState(final TState state) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    setNextState(getStateId(state));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    failIfAborted();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * By default, the executor will try ro run all the steps of the procedure start to finish.<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Return true to make the executor yield between execution steps to<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * give other procedures time to run their steps.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param state the state we are going to execute next.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @return Return true if the executor should yield before the execution of the specified step.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   *         Defaults to return false.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  protected boolean isYieldBeforeExecuteFromState(TEnvironment env, TState state) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    return false;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  /**<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   * Add a child procedure to execute<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * @param subProcedure the child procedure<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   */<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  protected void addChildProcedure(Procedure&lt;TEnvironment&gt;... subProcedure) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (subProcedure == null) return;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final int len = subProcedure.length;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    if (len == 0) return;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (subProcList == null) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      subProcList = new ArrayList&lt;&gt;(len);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    for (int i = 0; i &lt; len; ++i) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      Procedure&lt;TEnvironment&gt; proc = subProcedure[i];<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      if (!proc.hasOwner()) proc.setOwner(getOwner());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      subProcList.add(proc);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  protected Procedure[] execute(final TEnvironment env)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    updateTimestamp();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      failIfAborted();<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>      if (!hasMoreState() || isFailed()) return null;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      TState state = getCurrentState();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      if (stateCount == 0) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        setNextState(getStateId(state));<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>      if (LOG.isTraceEnabled()) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        LOG.trace(state  + " " + this + "; cycles=" + this.cycles);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      // Keep running count of cycles<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      if (getStateId(state) != this.previousState) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        this.previousState = getStateId(state);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        this.cycles = 0;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      } else {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        this.cycles++;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>      LOG.trace("{}", toString());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      stateFlow = executeFromState(env, state);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      if (!hasMoreState()) setNextState(EOF_STATE);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      if (subProcList != null &amp;&amp; !subProcList.isEmpty()) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        Procedure[] subProcedures = subProcList.toArray(new Procedure[subProcList.size()]);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        subProcList = null;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return subProcedures;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      return (isWaiting() || isFailed() || !hasMoreState()) ? null : new Procedure[] {this};<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    } finally {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      updateTimestamp();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  @Override<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  protected void rollback(final TEnvironment env)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      throws IOException, InterruptedException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (isEofState()) stateCount--;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      updateTimestamp();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      rollbackState(env, getCurrentState());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      stateCount--;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    } finally {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      updateTimestamp();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private boolean isEofState() {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return stateCount &gt; 0 &amp;&amp; states[stateCount-1] == EOF_STATE;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  protected boolean abort(final TEnvironment env) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    LOG.debug("Abort requested for {}", this);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    if (hasMoreState()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      aborted.set(true);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    LOG.debug("Ignoring abort request on {}", this);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return false;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * If procedure has more states then abort it otherwise procedure is finished and abort can be<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * ignored.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   */<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final void failIfAborted() {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    if (aborted.get()) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      if (hasMoreState()) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        setAbortFailure(getClass().getSimpleName(), "abort requested");<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        LOG.warn("Ignoring abort request on state='" + getCurrentState() + "' for " + this);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Used by the default implementation of abort() to know if the current state can be aborted<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * and rollback can be triggered.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  protected boolean isRollbackSupported(final TState state) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    return false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Override<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected boolean isYieldAfterExecutionStep(final TEnvironment env) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return isYieldBeforeExecuteFromState(env, getCurrentState());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private boolean hasMoreState() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    return stateFlow != Flow.NO_MORE_STATE;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected TState getCurrentState() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return stateCount &gt; 0 ? getState(states[stateCount-1]) : getInitialState();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * This method is used from test code as it cannot be assumed that state transition will happen<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * sequentially. Some procedures may skip steps/ states, some may add intermediate steps in<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * future.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @VisibleForTesting<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public int getCurrentStateId() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return getStateId(getCurrentState());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * Set the next state for the procedure.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  private void setNextState(final int stateId) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (states == null || states.length == stateCount) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      int newCapacity = stateCount + 8;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (states != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        states = Arrays.copyOf(states, newCapacity);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        states = new int[newCapacity];<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    states[stateCount++] = stateId;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  protected void toStringState(StringBuilder builder) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    super.toStringState(builder);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    if (!isFinished() &amp;&amp; !isEofState() &amp;&amp; getCurrentState() != null) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      builder.append(":").append(getCurrentState());<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Override<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      throws IOException {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    StateMachineProcedureData.Builder data = StateMachineProcedureData.newBuilder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    for (int i = 0; i &lt; stateCount; ++i) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      data.addState(states[i]);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    serializer.serialize(data.build());<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      throws IOException {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StateMachineProcedureData data = serializer.deserialize(StateMachineProcedureData.class);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    stateCount = data.getStateCount();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    if (stateCount &gt; 0) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      states = new int[stateCount];<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      for (int i = 0; i &lt; stateCount; ++i) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        states[i] = data.getState(i);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (isEofState()) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        stateFlow = Flow.NO_MORE_STATE;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    } else {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      states = null;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>}<a name="line.320"></a>
+<span class="sourceLineNo">077</span>  @VisibleForTesting<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public enum Flow {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    HAS_MORE_STATE,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    NO_MORE_STATE,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  /**<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * called to perform a single step of the specified 'state' of the procedure<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * @param state state to execute<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * @return Flow.NO_MORE_STATE if the procedure is completed,<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   *         Flow.HAS_MORE_STATE if there is another step.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  protected abstract Flow executeFromState(TEnvironment env, TState state)<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * called to perform the rollback of the specified state<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * @param state state to rollback<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * @throws IOException temporary failure, the rollback will retry later<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   */<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected abstract void rollbackState(TEnvironment env, TState state)<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    throws IOException, InterruptedException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  /**<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * Convert an ordinal (or state id) to an Enum (or more descriptive) state object.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * @return the state enum object<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  protected abstract TState getState(int stateId);<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  /**<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * Convert the Enum (or more descriptive) state object to an ordinal (or state id).<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * @param state the state enum object<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * @return stateId the ordinal() of the state enum (or state id)<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  protected abstract int getStateId(TState state);<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * Return the initial state object that will be used for the first call to executeFromState().<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @return the initial state enum object<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected abstract TState getInitialState();<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  /**<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Set the next state for the procedure.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param state the state enum object<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  protected void setNextState(final TState state) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    setNextState(getStateId(state));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    failIfAborted();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * By default, the executor will try ro run all the steps of the procedure start to finish.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Return true to make the executor yield between execution steps to<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * give other procedures time to run their steps.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param state the state we are going to execute next.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return Return true if the executor should yield before the execution of the specified step.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   *         Defaults to return false.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  protected boolean isYieldBeforeExecuteFromState(TEnvironment env, TState state) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    return false;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  /**<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * Add a child procedure to execute<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param subProcedure the child procedure<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   */<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  protected void addChildProcedure(Procedure&lt;TEnvironment&gt;... subProcedure) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    if (subProcedure == null) return;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final int len = subProcedure.length;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    if (len == 0) return;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (subProcList == null) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      subProcList = new ArrayList&lt;&gt;(len);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    for (int i = 0; i &lt; len; ++i) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      Procedure&lt;TEnvironment&gt; proc = subProcedure[i];<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      if (!proc.hasOwner()) proc.setOwner(getOwner());<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      subProcList.add(proc);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  protected Procedure[] execute(final TEnvironment env)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    updateTimestamp();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    try {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      failIfAborted();<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>      if (!hasMoreState() || isFailed()) return null;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      TState state = getCurrentState();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      if (stateCount == 0) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        setNextState(getStateId(state));<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>      if (LOG.isTraceEnabled()) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        LOG.trace(state  + " " + this + "; cycles=" + this.cycles);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Keep running count of cycles<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      if (getStateId(state) != this.previousState) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        this.previousState = getStateId(state);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        this.cycles = 0;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      } else {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        this.cycles++;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>      LOG.trace("{}", toString());<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      stateFlow = executeFromState(env, state);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      if (!hasMoreState()) setNextState(EOF_STATE);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (subProcList != null &amp;&amp; !subProcList.isEmpty()) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        Procedure[] subProcedures = subProcList.toArray(new Procedure[subProcList.size()]);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        subProcList = null;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return subProcedures;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      return (isWaiting() || isFailed() || !hasMoreState()) ? null : new Procedure[] {this};<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } finally {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      updateTimestamp();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  @Override<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected void rollback(final TEnvironment env)<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      throws IOException, InterruptedException {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (isEofState()) stateCount--;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    try {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      updateTimestamp();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      rollbackState(env, getCurrentState());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      stateCount--;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      updateTimestamp();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  private boolean isEofState() {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return stateCount &gt; 0 &amp;&amp; states[stateCount-1] == EOF_STATE;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  protected boolean abort(final TEnvironment env) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    LOG.debug("Abort requested for {}", this);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    if (hasMoreState()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      aborted.set(true);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return true;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    LOG.debug("Ignoring abort request on {}", this);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    return false;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  /**<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * If procedure has more states then abort it otherwise procedure is finished and abort can be<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * ignored.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected final void failIfAborted() {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    if (aborted.get()) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      if (hasMoreState()) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        setAbortFailure(getClass().getSimpleName(), "abort requested");<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        LOG.warn("Ignoring abort request on state='" + getCurrentState() + "' for " + this);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * Used by the default implementation of abort() to know if the current state can be aborted<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * and rollback can be triggered.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  protected boolean isRollbackSupported(final TState state) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  protected boolean isYieldAfterExecutionStep(final TEnvironment env) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    return isYieldBeforeExecuteFromState(env, getCurrentState());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private boolean hasMoreState() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return stateFlow != Flow.NO_MORE_STATE;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  protected TState getCurrentState() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return stateCount &gt; 0 ? getState(states[stateCount-1]) : getInitialState();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * This method is used from test code as it cannot be assumed that state transition will happen<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * sequentially. Some procedures may skip steps/ states, some may add intermediate steps in<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * future.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  @VisibleForTesting<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public int getCurrentStateId() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return getStateId(getCurrentState());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Set the next state for the procedure.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private void setNextState(final int stateId) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    if (states == null || states.length == stateCount) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      int newCapacity = stateCount + 8;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      if (states != null) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        states = Arrays.copyOf(states, newCapacity);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      } else {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        states = new int[newCapacity];<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    states[stateCount++] = stateId;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  protected void toStringState(StringBuilder builder) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    super.toStringState(builder);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (!isFinished() &amp;&amp; !isEofState() &amp;&amp; getCurrentState() != null) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      builder.append(":").append(getCurrentState());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    StateMachineProcedureData.Builder data = StateMachineProcedureData.newBuilder();<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    for (int i = 0; i &lt; stateCount; ++i) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      data.addState(states[i]);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    serializer.serialize(data.build());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    StateMachineProcedureData data = serializer.deserialize(StateMachineProcedureData.class);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    stateCount = data.getStateCount();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (stateCount &gt; 0) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      states = new int[stateCount];<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      for (int i = 0; i &lt; stateCount; ++i) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        states[i] = data.getState(i);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      if (isEofState()) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>        stateFlow = Flow.NO_MORE_STATE;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    } else {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      states = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>}<a name="line.321"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html
index 6cd219e..d112942 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html
@@ -432,7 +432,7 @@
 <span class="sourceLineNo">424</span>        long created = chunkCount.get();<a name="line.424"></a>
 <span class="sourceLineNo">425</span>        long reused = reusedChunkCount.sum();<a name="line.425"></a>
 <span class="sourceLineNo">426</span>        long total = created + reused;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.debug("{} Stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
+<span class="sourceLineNo">427</span>        LOG.debug("{} stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
 <span class="sourceLineNo">428</span>                "reused chunk count={}, reuseRatio={}", label, chunkSize, reclaimedChunks.size(),<a name="line.428"></a>
 <span class="sourceLineNo">429</span>            created, reused,<a name="line.429"></a>
 <span class="sourceLineNo">430</span>            (total == 0? "0": StringUtils.formatPercent((float)reused/(float)total,2)));<a name="line.430"></a>
@@ -503,8 +503,8 @@
 <span class="sourceLineNo">495</span>          " must be between 0.0 and 1.0");<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
 <span class="sourceLineNo">497</span>    int initialCount = (int) (initialCountPercentage * maxCount);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    LOG.info("{} allocating {} MemStoreChunkPool with chunk size {}, max count {}, " +<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            "initial count {}", label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
+<span class="sourceLineNo">498</span>    LOG.info("Allocating {} MemStoreChunkPool with chunk size {}, max count {}, initial count {}",<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
 <span class="sourceLineNo">500</span>    MemStoreChunkPool memStoreChunkPool = new MemStoreChunkPool(label, chunkSize, maxCount,<a name="line.500"></a>
 <span class="sourceLineNo">501</span>            initialCount, poolSizePercentage);<a name="line.501"></a>
 <span class="sourceLineNo">502</span>    if (heapMemoryManager != null &amp;&amp; memStoreChunkPool != null) {<a name="line.502"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.StatisticsThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.StatisticsThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.StatisticsThread.html
index 6cd219e..d112942 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.StatisticsThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.StatisticsThread.html
@@ -432,7 +432,7 @@
 <span class="sourceLineNo">424</span>        long created = chunkCount.get();<a name="line.424"></a>
 <span class="sourceLineNo">425</span>        long reused = reusedChunkCount.sum();<a name="line.425"></a>
 <span class="sourceLineNo">426</span>        long total = created + reused;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.debug("{} Stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
+<span class="sourceLineNo">427</span>        LOG.debug("{} stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
 <span class="sourceLineNo">428</span>                "reused chunk count={}, reuseRatio={}", label, chunkSize, reclaimedChunks.size(),<a name="line.428"></a>
 <span class="sourceLineNo">429</span>            created, reused,<a name="line.429"></a>
 <span class="sourceLineNo">430</span>            (total == 0? "0": StringUtils.formatPercent((float)reused/(float)total,2)));<a name="line.430"></a>
@@ -503,8 +503,8 @@
 <span class="sourceLineNo">495</span>          " must be between 0.0 and 1.0");<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
 <span class="sourceLineNo">497</span>    int initialCount = (int) (initialCountPercentage * maxCount);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    LOG.info("{} allocating {} MemStoreChunkPool with chunk size {}, max count {}, " +<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            "initial count {}", label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
+<span class="sourceLineNo">498</span>    LOG.info("Allocating {} MemStoreChunkPool with chunk size {}, max count {}, initial count {}",<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
 <span class="sourceLineNo">500</span>    MemStoreChunkPool memStoreChunkPool = new MemStoreChunkPool(label, chunkSize, maxCount,<a name="line.500"></a>
 <span class="sourceLineNo">501</span>            initialCount, poolSizePercentage);<a name="line.501"></a>
 <span class="sourceLineNo">502</span>    if (heapMemoryManager != null &amp;&amp; memStoreChunkPool != null) {<a name="line.502"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.html
index 6cd219e..d112942 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.MemStoreChunkPool.html
@@ -432,7 +432,7 @@
 <span class="sourceLineNo">424</span>        long created = chunkCount.get();<a name="line.424"></a>
 <span class="sourceLineNo">425</span>        long reused = reusedChunkCount.sum();<a name="line.425"></a>
 <span class="sourceLineNo">426</span>        long total = created + reused;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.debug("{} Stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
+<span class="sourceLineNo">427</span>        LOG.debug("{} stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
 <span class="sourceLineNo">428</span>                "reused chunk count={}, reuseRatio={}", label, chunkSize, reclaimedChunks.size(),<a name="line.428"></a>
 <span class="sourceLineNo">429</span>            created, reused,<a name="line.429"></a>
 <span class="sourceLineNo">430</span>            (total == 0? "0": StringUtils.formatPercent((float)reused/(float)total,2)));<a name="line.430"></a>
@@ -503,8 +503,8 @@
 <span class="sourceLineNo">495</span>          " must be between 0.0 and 1.0");<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
 <span class="sourceLineNo">497</span>    int initialCount = (int) (initialCountPercentage * maxCount);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    LOG.info("{} allocating {} MemStoreChunkPool with chunk size {}, max count {}, " +<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            "initial count {}", label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
+<span class="sourceLineNo">498</span>    LOG.info("Allocating {} MemStoreChunkPool with chunk size {}, max count {}, initial count {}",<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
 <span class="sourceLineNo">500</span>    MemStoreChunkPool memStoreChunkPool = new MemStoreChunkPool(label, chunkSize, maxCount,<a name="line.500"></a>
 <span class="sourceLineNo">501</span>            initialCount, poolSizePercentage);<a name="line.501"></a>
 <span class="sourceLineNo">502</span>    if (heapMemoryManager != null &amp;&amp; memStoreChunkPool != null) {<a name="line.502"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.html
index 6cd219e..d112942 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/ChunkCreator.html
@@ -432,7 +432,7 @@
 <span class="sourceLineNo">424</span>        long created = chunkCount.get();<a name="line.424"></a>
 <span class="sourceLineNo">425</span>        long reused = reusedChunkCount.sum();<a name="line.425"></a>
 <span class="sourceLineNo">426</span>        long total = created + reused;<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        LOG.debug("{} Stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
+<span class="sourceLineNo">427</span>        LOG.debug("{} stats (chunk size={}): current pool size={}, created chunk count={}, " +<a name="line.427"></a>
 <span class="sourceLineNo">428</span>                "reused chunk count={}, reuseRatio={}", label, chunkSize, reclaimedChunks.size(),<a name="line.428"></a>
 <span class="sourceLineNo">429</span>            created, reused,<a name="line.429"></a>
 <span class="sourceLineNo">430</span>            (total == 0? "0": StringUtils.formatPercent((float)reused/(float)total,2)));<a name="line.430"></a>
@@ -503,8 +503,8 @@
 <span class="sourceLineNo">495</span>          " must be between 0.0 and 1.0");<a name="line.495"></a>
 <span class="sourceLineNo">496</span>    }<a name="line.496"></a>
 <span class="sourceLineNo">497</span>    int initialCount = (int) (initialCountPercentage * maxCount);<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    LOG.info("{} allocating {} MemStoreChunkPool with chunk size {}, max count {}, " +<a name="line.498"></a>
-<span class="sourceLineNo">499</span>            "initial count {}", label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
+<span class="sourceLineNo">498</span>    LOG.info("Allocating {} MemStoreChunkPool with chunk size {}, max count {}, initial count {}",<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        label, StringUtils.byteDesc(chunkSize), maxCount, initialCount);<a name="line.499"></a>
 <span class="sourceLineNo">500</span>    MemStoreChunkPool memStoreChunkPool = new MemStoreChunkPool(label, chunkSize, maxCount,<a name="line.500"></a>
 <span class="sourceLineNo">501</span>            initialCount, poolSizePercentage);<a name="line.501"></a>
 <span class="sourceLineNo">502</span>    if (heapMemoryManager != null &amp;&amp; memStoreChunkPool != null) {<a name="line.502"></a>


[49/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 6d90dba..e8b235f 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,8 +25,8 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3585,
-             Errors: 16086,
+      <title>File: 3587,
+             Errors: 16088,
              Warnings: 0,
              Infos: 0
       </title>
@@ -2603,7 +2603,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  7
+                  8
                 </td>
               </tr>
                           <tr>
@@ -6276,6 +6276,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure.java">org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  3
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.types.RawBytes.java">org/apache/hadoop/hbase/types/RawBytes.java</a>
                 </td>
                 <td>
@@ -11283,7 +11297,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  30
+                  29
                 </td>
               </tr>
                           <tr>
@@ -19711,7 +19725,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  2
+                  3
                 </td>
               </tr>
                           <tr>
@@ -31812,6 +31826,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.regionserver.wal.TestWALDurability.java">org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.TestCellUtil.java">org/apache/hadoop/hbase/TestCellUtil.java</a>
                 </td>
                 <td>
@@ -47417,7 +47445,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  209
+                  207
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 4c7b148..d620961 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -368,7 +368,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/cygwin.html
----------------------------------------------------------------------
diff --git a/cygwin.html b/cygwin.html
index d4c7ee4..4684255 100644
--- a/cygwin.html
+++ b/cygwin.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Installing Apache HBase (TM) on Windows using Cygwin</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -667,7 +667,7 @@ Now your <b>HBase </b>server is running, <b>start coding</b> and build that next
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 47335be..18f90ff 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -433,7 +433,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 8ca052c..630efb0 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1098,7 +1098,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 4811d60..22a43f1 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -306,7 +306,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index a205147..99e76be 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180320" />
+    <meta name="Date-Revision-yyyymmdd" content="20180321" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -974,7 +974,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-03-20</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-03-21</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 301b6af..a802100 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3740,21 +3740,21 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Tue Mar 20 14:41:21 UTC 2018"</code></td>
+<td class="colLast"><code>"Wed Mar 21 14:41:50 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"2a3f4a0a4eb7bb67985050b0e007576c468f217e"</code></td>
+<td class="colLast"><code>"8ab7b20f48951d77945181024f5e15842bc253c4"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#srcChecksum">srcChecksum</a></code></td>
-<td class="colLast"><code>"1875b6188f146a29b921f647138ace23"</code></td>
+<td class="colLast"><code>"03e46ad2c22f563cdd7f970f368a1b81"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -18002,54 +18002,68 @@
 <td class="colLast"><code>30000</code></td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.DEFAULT_WAL_HSYNC">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;boolean</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#DEFAULT_WAL_HSYNC">DEFAULT_WAL_HSYNC</a></code></td>
+<td class="colLast"><code>false</code></td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.HBASE_MAX_CELL_SIZE_KEY">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#HBASE_MAX_CELL_SIZE_KEY">HBASE_MAX_CELL_SIZE_KEY</a></code></td>
 <td class="colLast"><code>"hbase.server.keyvalue.maxsize"</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.HBASE_REGIONSERVER_MINIBATCH_SIZE">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#HBASE_REGIONSERVER_MINIBATCH_SIZE">HBASE_REGIONSERVER_MINIBATCH_SIZE</a></code></td>
 <td class="colLast"><code>"hbase.regionserver.minibatch.size"</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.LOAD_CFS_ON_DEMAND_CONFIG_KEY">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#LOAD_CFS_ON_DEMAND_CONFIG_KEY">LOAD_CFS_ON_DEMAND_CONFIG_KEY</a></code></td>
 <td class="colLast"><code>"hbase.hregion.scan.loadColumnFamiliesOnDemand"</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.MAX_FLUSH_PER_CHANGES">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;long</code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#MAX_FLUSH_PER_CHANGES">MAX_FLUSH_PER_CHANGES</a></code></td>
 <td class="colLast"><code>1000000000L</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.MEMSTORE_FLUSH_PER_CHANGES">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#MEMSTORE_FLUSH_PER_CHANGES">MEMSTORE_FLUSH_PER_CHANGES</a></code></td>
 <td class="colLast"><code>"hbase.regionserver.flush.per.changes"</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.MEMSTORE_PERIODIC_FLUSH_INTERVAL">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#MEMSTORE_PERIODIC_FLUSH_INTERVAL">MEMSTORE_PERIODIC_FLUSH_INTERVAL</a></code></td>
 <td class="colLast"><code>"hbase.regionserver.optionalcacheflushinterval"</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.SYSTEM_CACHE_FLUSH_INTERVAL">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#SYSTEM_CACHE_FLUSH_INTERVAL">SYSTEM_CACHE_FLUSH_INTERVAL</a></code></td>
 <td class="colLast"><code>300000</code></td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.HRegion.WAL_HSYNC_CONF_KEY">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#WAL_HSYNC_CONF_KEY">WAL_HSYNC_CONF_KEY</a></code></td>
+<td class="colLast"><code>"hbase.wal.hsync"</code></td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 677ffb0..f6d3d0e 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -23367,6 +23367,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#DEFAULT_WAL_COUNT_WARN_THRESHOLD">DEFAULT_WAL_COUNT_WARN_THRESHOLD</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#DEFAULT_WAL_HSYNC">DEFAULT_WAL_HSYNC</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER">DEFAULT_WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HConstants.html#DEFAULT_WAL_STORAGE_POLICY">DEFAULT_WAL_STORAGE_POLICY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HConstants.html" title="class in org.apache.hadoop.hbase">HConstants</a></dt>
@@ -32252,6 +32254,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#forceSplit-byte:A-">forceSplit(byte[])</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#forceSync">forceSync</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#forcible">forcible</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling"><span class="typeNameLink">ForeignException</span></a> - Exception in <a href="org/apache/hadoop/hbase/errorhandling/package-summary.html">org.apache.hadoop.hbase.errorhandling</a></dt>
@@ -61521,6 +61525,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#isForceFlushAllStores--">isForceFlushAllStores()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#isForceSync--">isForceSync()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/Chunk.html#isFromPool--">isFromPool()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/Chunk.html" title="class in org.apache.hadoop.hbase.regionserver">Chunk</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/BlockCacheUtil.CachedBlocksByFile.html#isFull--">isFull()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/BlockCacheUtil.CachedBlocksByFile.html" title="class in org.apache.hadoop.hbase.io.hfile">BlockCacheUtil.CachedBlocksByFile</a></dt>
@@ -84197,11 +84203,11 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html#publishReadTiming-java.lang.String-java.lang.String-long-">publishReadTiming(String, String, long)</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.ZookeeperStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.ZookeeperStdOutSink</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer--">publishSyncOnRingBuffer()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-boolean-">publishSyncOnRingBuffer(boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-long-">publishSyncOnRingBuffer(long)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncOnRingBuffer-long-boolean-">publishSyncOnRingBuffer(long, boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncThenBlockOnCompletion-org.apache.htrace.core.TraceScope-">publishSyncThenBlockOnCompletion(TraceScope)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#publishSyncThenBlockOnCompletion-org.apache.htrace.core.TraceScope-boolean-">publishSyncThenBlockOnCompletion(TraceScope, boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html#publishWriteFailure-org.apache.hadoop.hbase.ServerName-org.apache.hadoop.hbase.client.RegionInfo-java.lang.Exception-">publishWriteFailure(ServerName, RegionInfo, Exception)</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/Canary.RegionStdOutSink.html" title="class in org.apache.hadoop.hbase.tool">Canary.RegionStdOutSink</a></dt>
 <dd>&nbsp;</dd>
@@ -99492,6 +99498,8 @@ service.</div>
 <dd>
 <div class="block">Set exclusive mode.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#setForceSync-boolean-">setForceSync(boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html#setFormat-java.lang.String-">setFormat(String)</a></span> - Method in class org.apache.hadoop.hbase.tmpl.master.<a href="org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.ImplData.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl.ImplData</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html#setFormat-java.lang.String-">setFormat(String)</a></span> - Method in class org.apache.hadoop.hbase.tmpl.master.<a href="org/apache/hadoop/hbase/tmpl/master/MasterStatusTmpl.html" title="class in org.apache.hadoop.hbase.tmpl.master">MasterStatusTmpl</a></dt>
@@ -108525,9 +108533,13 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync--">sync()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync-boolean-">sync(boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync-long-">sync(long)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#sync--">sync()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">ProtobufLogWriter</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#sync-long-boolean-">sync(long, boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html#sync-boolean-">sync(boolean)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/ProtobufLogWriter.html" title="class in org.apache.hadoop.hbase.regionserver.wal">ProtobufLogWriter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html#sync">sync</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.html" title="class in org.apache.hadoop.hbase.regionserver.wal">RingBufferTruck</a></dt>
 <dd>
@@ -108545,9 +108557,13 @@ service.</div>
 <dd>
 <div class="block">Sync the WAL if the txId was not already sync'd.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WAL.html#sync-boolean-">sync(boolean)</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WAL.html#sync-long-boolean-">sync(long, boolean)</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html#sync--">sync()</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.AsyncWriter</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync--">sync()</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync-boolean-">sync(boolean)</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.html#sync-java.lang.String-org.apache.zookeeper.AsyncCallback.VoidCallback-java.lang.Object-">sync(String, AsyncCallback.VoidCallback, Object)</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.html" title="class in org.apache.hadoop.hbase.zookeeper">RecoverableZooKeeper</a></dt>
 <dd>&nbsp;</dd>
@@ -115867,6 +115883,8 @@ service.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#useHsync">useHsync</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html#useHsync">useHsync</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FSHLog.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSHLog</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/CellChunkImmutableSegment.html#useIndexChunks-int-">useIndexChunks(int)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/CellChunkImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">CellChunkImmutableSegment</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/ConnectionImplementation.html#useMetaReplicas">useMetaReplicas</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/ConnectionImplementation.html" title="class in org.apache.hadoop.hbase.client">ConnectionImplementation</a></dt>
@@ -118740,6 +118758,8 @@ the order they are declared.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html#WAL_FILE_NAME_DELIMITER">WAL_FILE_NAME_DELIMITER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html" title="class in org.apache.hadoop.hbase.wal">AbstractFSWALProvider</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#WAL_HSYNC_CONF_KEY">WAL_HSYNC_CONF_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.html#WAL_OFF">WAL_OFF</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.html" title="class in org.apache.hadoop.hbase.mapreduce">MultiTableOutputFormat</a></dt>
 <dd>
 <div class="block">Property value to disable write-ahead logging</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 51d84c3..5890b1a 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/client/Durability.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/Durability.html b/devapidocs/org/apache/hadoop/hbase/client/Durability.html
index 90f0802..592afcd 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/Durability.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/Durability.html
@@ -273,9 +273,8 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FSYNC_WAL</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Durability.html#line.56">FSYNC_WAL</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/Durability.html#line.55">FSYNC_WAL</a></pre>
 <div class="block">Write the Mutation to the WAL synchronously and force the entries to disk.
- (Note: this is currently not supported and will behave identical to <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html#SYNC_WAL"><code>SYNC_WAL</code></a>)
  See <a href="https://issues.apache.org/jira/browse/HADOOP-6313">HADOOP-6313</a></div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 9a0cb5a..5629698 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -550,24 +550,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index fc1124d..681adbb 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 0916f37..fdf0ce2 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -273,12 +273,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index f930505..2e21581 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
index eb945fb..ad40e69 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
@@ -197,8 +197,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 890d83d..059174f 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -346,11 +346,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
index 0d4a367..f9f9ba0 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
@@ -536,7 +536,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>handleRIT</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.164">handleRIT</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.179">handleRIT</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                        <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;ri,
                        <a href="../../../../../../org/apache/hadoop/hbase/ServerName.html" title="class in org.apache.hadoop.hbase">ServerName</a>&nbsp;crashedServerName)</pre>
 <div class="block">Is the region stuck assigning to this failedMetaServer? If so, cancel the call
@@ -550,7 +550,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.186">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.201">rollbackState</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env,
                              org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;recoverMetaState)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -572,7 +572,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.194">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.209">getState</a>(int&nbsp;stateId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getState-int-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
@@ -591,7 +591,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.199">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;recoverMetaState)</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.214">getStateId</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;recoverMetaState)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getStateId-TState-">StateMachineProcedure</a></code></span></div>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
@@ -610,7 +610,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.204">getInitialState</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.RecoverMetaState&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.219">getInitialState</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#getInitialState--">StateMachineProcedure</a></code></span></div>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
@@ -627,7 +627,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringClassDetails</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.209">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.224">toStringClassDetails</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;sb)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringClassDetails-java.lang.StringBuilder-">Procedure</a></code></span></div>
 <div class="block">Extend the toString() information with the procedure details
  e.g. className and parameters</div>
@@ -645,7 +645,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.218">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.233">serializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -667,7 +667,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.231">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.246">deserializeStateData</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized
@@ -688,7 +688,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>acquireLock</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.243">acquireLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.258">acquireLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#acquireLock-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The user should override this method if they need a lock on an Entity.
  A lock can be anything, and it is up to the implementor. The Procedure
@@ -725,7 +725,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseLock</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.251">releaseLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.266">releaseLock</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#releaseLock-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The user should override this method, and release lock if necessary.</div>
 <dl>
@@ -740,7 +740,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>completionCleanup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.256">completionCleanup</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.271">completionCleanup</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#completionCleanup-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">Called when the procedure is marked as completed (success or rollback).
  The procedure implementor may use this method to cleanup in-memory states.
@@ -758,7 +758,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.261">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.276">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html" title="interface in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface</a></code></dd>
@@ -773,7 +773,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableOperationType</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.266">getTableOperationType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure">TableProcedureInterface.TableOperationType</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.281">getTableOperationType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.html#getTableOperationType--">TableProcedureInterface</a></code></span></div>
 <div class="block">Given an operation type we can take decisions about what to do with pending operations.
  e.g. if we get a delete and we have some table operation pending (e.g. add column)
@@ -792,7 +792,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockList">
 <li class="blockList">
 <h4>isRunRequired</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.274">isRunRequired</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.289">isRunRequired</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if failedMetaServer is not null (meta carrying server crashed) or meta is
@@ -806,7 +806,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/T
 <ul class="blockListLast">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.281">prepare</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html#line.296">prepare</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&nbsp;env)</pre>
 <div class="block">Prepare for execution</div>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 7b8e220..550d779 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -208,9 +208,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 9eb46aa..3e1ea7f 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -125,8 +125,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
 </ul>
 </li>
 </ul>


[13/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.html
index 9e3d786..d217fed 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.html
@@ -96,13 +96,13 @@
 <span class="sourceLineNo">088</span>  @Override<a name="line.88"></a>
 <span class="sourceLineNo">089</span>  public void process() {<a name="line.89"></a>
 <span class="sourceLineNo">090</span>    try {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>      String name = regionInfo.getRegionNameAsString();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      LOG.debug("Processing close of " + name);<a name="line.92"></a>
+<span class="sourceLineNo">091</span>      String name = regionInfo.getEncodedName();<a name="line.91"></a>
+<span class="sourceLineNo">092</span>      LOG.trace("Processing close of {}", name);<a name="line.92"></a>
 <span class="sourceLineNo">093</span>      String encodedRegionName = regionInfo.getEncodedName();<a name="line.93"></a>
 <span class="sourceLineNo">094</span>      // Check that this region is being served here<a name="line.94"></a>
 <span class="sourceLineNo">095</span>      HRegion region = (HRegion)rsServices.getRegion(encodedRegionName);<a name="line.95"></a>
 <span class="sourceLineNo">096</span>      if (region == null) {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>        LOG.warn("Received CLOSE for region " + name + " but currently not serving - ignoring");<a name="line.97"></a>
+<span class="sourceLineNo">097</span>        LOG.warn("Received CLOSE for region {} but currently not serving - ignoring", name);<a name="line.97"></a>
 <span class="sourceLineNo">098</span>        // TODO: do better than a simple warning<a name="line.98"></a>
 <span class="sourceLineNo">099</span>        return;<a name="line.99"></a>
 <span class="sourceLineNo">100</span>      }<a name="line.100"></a>
@@ -112,31 +112,30 @@
 <span class="sourceLineNo">104</span>        if (region.close(abort) == null) {<a name="line.104"></a>
 <span class="sourceLineNo">105</span>          // This region got closed.  Most likely due to a split.<a name="line.105"></a>
 <span class="sourceLineNo">106</span>          // The split message will clean up the master state.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>          LOG.warn("Can't close region: was already closed during close(): " +<a name="line.107"></a>
-<span class="sourceLineNo">108</span>            name);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          return;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>        }<a name="line.110"></a>
-<span class="sourceLineNo">111</span>      } catch (IOException ioe) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>        // An IOException here indicates that we couldn't successfully flush the<a name="line.112"></a>
-<span class="sourceLineNo">113</span>        // memstore before closing. So, we need to abort the server and allow<a name="line.113"></a>
-<span class="sourceLineNo">114</span>        // the master to split our logs in order to recover the data.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>        server.abort("Unrecoverable exception while closing region " +<a name="line.115"></a>
-<span class="sourceLineNo">116</span>          regionInfo.getRegionNameAsString() + ", still finishing close", ioe);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>        throw new RuntimeException(ioe);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      }<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>      this.rsServices.removeRegion(region, destination);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      rsServices.reportRegionStateTransition(new RegionStateTransitionContext(TransitionCode.CLOSED,<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          HConstants.NO_SEQNUM, -1, regionInfo));<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>      // Done!  Region is closed on this RS<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      LOG.debug("Closed " + region.getRegionInfo().getRegionNameAsString());<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    } finally {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      this.rsServices.getRegionsInTransitionInRS().<a name="line.127"></a>
-<span class="sourceLineNo">128</span>        remove(this.regionInfo.getEncodedNameAsBytes(), Boolean.FALSE);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    }<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>}<a name="line.131"></a>
+<span class="sourceLineNo">107</span>          LOG.warn("Can't close region {}, was already closed during close()", name);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>          return;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>        }<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      } catch (IOException ioe) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>        // An IOException here indicates that we couldn't successfully flush the<a name="line.111"></a>
+<span class="sourceLineNo">112</span>        // memstore before closing. So, we need to abort the server and allow<a name="line.112"></a>
+<span class="sourceLineNo">113</span>        // the master to split our logs in order to recover the data.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>        server.abort("Unrecoverable exception while closing region " +<a name="line.114"></a>
+<span class="sourceLineNo">115</span>          regionInfo.getRegionNameAsString() + ", still finishing close", ioe);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>        throw new RuntimeException(ioe);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>      this.rsServices.removeRegion(region, destination);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      rsServices.reportRegionStateTransition(new RegionStateTransitionContext(TransitionCode.CLOSED,<a name="line.120"></a>
+<span class="sourceLineNo">121</span>          HConstants.NO_SEQNUM, -1, regionInfo));<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>      // Done!  Region is closed on this RS<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      LOG.debug("Closed " + region.getRegionInfo().getRegionNameAsString());<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    } finally {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.rsServices.getRegionsInTransitionInRS().<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        remove(this.regionInfo.getEncodedNameAsBytes(), Boolean.FALSE);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
+<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
+<span class="sourceLineNo">130</span>}<a name="line.130"></a>
 
 
 


[34/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
index 807ed6b..3dbdec3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
@@ -206,392 +206,389 @@
 <span class="sourceLineNo">198</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.198"></a>
 <span class="sourceLineNo">199</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.199"></a>
 <span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      if (LOG.isDebugEnabled()) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        LOG.debug("FLUSHING TO DISK: region "<a name="line.202"></a>
-<span class="sourceLineNo">203</span>            + getRegionServices().getRegionInfo().getRegionNameAsString() + "store: "<a name="line.203"></a>
-<span class="sourceLineNo">204</span>            + getFamilyName());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      stopCompaction();<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      pushActiveToPipeline(this.active);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      if (compositeSnapshot) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        pushPipelineToSnapshot();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      } else {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        pushTailToSnapshot();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      compactor.resetStats();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * On flush, how much memory we will clear.<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return size of data that is going to be flushed<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  @Override<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public MemStoreSize getFlushableSize() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (compositeSnapshot) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  protected long keySize() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    long k = this.active.keySize();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      k += segment.keySize();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    return k;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  protected long heapSize() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    long h = this.active.heapSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      h += segment.heapSize();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return h;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      WAL WAL = getRegionServices().getWAL();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (WAL != null) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  /**<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * This message intends to inform the MemStore that next coming updates<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * are going to be part of the replaying edits from WAL<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  public void startReplayingFromWAL() {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    inWalReplay = true;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * are done<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  public void stopReplayingFromWAL() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    inWalReplay = false;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // the getSegments() method is used for tests only<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  @VisibleForTesting<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Override<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    list.add(this.active);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    list.addAll(pipelineList);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.299"></a>
+<span class="sourceLineNo">201</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      stopCompaction();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      pushActiveToPipeline(this.active);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      if (compositeSnapshot) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        pushPipelineToSnapshot();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      } else {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        pushTailToSnapshot();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      compactor.resetStats();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * On flush, how much memory we will clear.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return size of data that is going to be flushed<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public MemStoreSize getFlushableSize() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      if (compositeSnapshot) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  protected long keySize() {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    long k = this.active.keySize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      k += segment.keySize();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return k;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  protected long heapSize() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    long h = this.active.heapSize();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      h += segment.heapSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return h;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  @Override<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      WAL WAL = getRegionServices().getWAL();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (WAL != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * This message intends to inform the MemStore that next coming updates<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * are going to be part of the replaying edits from WAL<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void startReplayingFromWAL() {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    inWalReplay = true;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  /**<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * are done<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  public void stopReplayingFromWAL() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    inWalReplay = false;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  // the getSegments() method is used for tests only<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  @Override<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    list.add(this.active);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    list.addAll(pipelineList);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return list;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
 <span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return list;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      boolean merge) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // last true stands for updating the region size<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   *           The flattening happens only if versions match.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  // setter is used only for testability<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @VisibleForTesting<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  void setIndexType(IndexType type) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    indexType = type;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // If it is needed, please change in-memory flush size explicitly<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public IndexType getIndexType() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return indexType;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public boolean hasImmutableSegments() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    return !pipeline.isEmpty();<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return pipeline.getVersionedList();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public long getSmallestReadPoint() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return store.getSmallestReadPoint();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  public HStore getStore() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    return store;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  public String getFamilyName() {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  @Override<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  /*<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    MutableSegment activeTmp = active;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // The order is the Segment ordinal<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return list;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>   @VisibleForTesting<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Check whether anything need to be done based on the current active set size.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * The method is invoked upon every addition to the active set.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * size is above threshold<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Override<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  protected void checkActiveSize() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (shouldFlushInMemory()) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      * in the shared mode. */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        LOG.trace(<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      getPool().execute(runnable);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  // internally used method, externally visible only for tests<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // otherwise there is a deadlock<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @VisibleForTesting<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  void flushInMemory() throws IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    inMemoryFlushInProgress.set(true);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Phase I: Update the pipeline<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      getRegionServices().blockUpdates();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        pushActiveToPipeline(this.active);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      } finally {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getRegionServices().unblockUpdates();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>      // Used by tests<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (!allowCompaction.get()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        return;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      // Phase II: Compact the pipeline<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      try {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        // compaction is in progress<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        compactor.start();<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } finally {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      inMemoryFlushInProgress.set(false);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private Segment getLastSegment() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Segment localActive = getActive();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Segment tail = pipeline.getTail();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return tail == null ? localActive : tail;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  private byte[] getFamilyNameInBytes() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  private ThreadPoolExecutor getPool() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return getRegionServices().getInMemoryCompactionPool();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  @VisibleForTesting<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  protected boolean shouldFlushInMemory() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return false;     // regardless the size<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // the insert of the active into the compaction pipeline<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    return false;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  /**<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * The compaction may still happen if the request was sent too late<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * Non-blocking request<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  private void stopCompaction() {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    if (inMemoryFlushInProgress.get()) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      compactor.stop();<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    if (!active.isEmpty()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      pipeline.pushHead(active);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      resetActive();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  private void pushTailToSnapshot() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    pipeline.swap(segments,null,false, false);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  private void pushPipelineToSnapshot() {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    int iterationsCnt = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    boolean done = false;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    while (!done) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      iterationsCnt++;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // and the version increase, the chance of it happenning is very low<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      done = pipeline.swap(segments, null, false, false);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      if (iterationsCnt&gt;2) {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        // practically it is impossible that this loop iterates more than two times<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            " while flushing to disk.");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if(segments.isEmpty()) return;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.snapshot = segments.get(0);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      return;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    } else { // create composite snapshot<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.snapshot =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  private RegionServicesForStores getRegionServices() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    return regionServices;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  }<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>  /**<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  * There is at most one thread per memstore instance.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  * and compacts the pipeline.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  */<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    @Override<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    public void run() {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      try {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        flushInMemory();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      } catch (IOException e) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.543"></a>
-<span class="sourceLineNo">544</span>            + "store: "+ getFamilyName(), e);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @VisibleForTesting<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  boolean isMemStoreFlushingInMemory() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return inMemoryFlushInProgress.get();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>  /**<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   *             first.<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * @return Next row or null if none found.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  Cell getNextRow(final Cell cell) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Cell lowest = null;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    for (Segment segment : segments) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      if (lowest == null) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      } else {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return lowest;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @VisibleForTesting<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  long getInmemoryFlushSize() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    return inmemoryFlushSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>  // debug method<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  public void debug() {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    String msg = "active size=" + this.active.keySize();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    LOG.debug(msg);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>}<a name="line.586"></a>
+<span class="sourceLineNo">301</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      boolean merge) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // last true stands for updating the region size<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  /**<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   *           The flattening happens only if versions match.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  // setter is used only for testability<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  @VisibleForTesting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  void setIndexType(IndexType type) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    indexType = type;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    // If it is needed, please change in-memory flush size explicitly<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public IndexType getIndexType() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    return indexType;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  public boolean hasImmutableSegments() {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    return !pipeline.isEmpty();<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return pipeline.getVersionedList();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  public long getSmallestReadPoint() {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return store.getSmallestReadPoint();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public HStore getStore() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    return store;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>  public String getFamilyName() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  @Override<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  /*<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    MutableSegment activeTmp = active;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    // The order is the Segment ordinal<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return list;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>   @VisibleForTesting<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Check whether anything need to be done based on the current active set size.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * The method is invoked upon every addition to the active set.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * size is above threshold<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  @Override<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  protected void checkActiveSize() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (shouldFlushInMemory()) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      * in the shared mode. */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      if (LOG.isTraceEnabled()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        LOG.trace(<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      getPool().execute(runnable);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // internally used method, externally visible only for tests<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  // otherwise there is a deadlock<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  @VisibleForTesting<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  void flushInMemory() throws IOException {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    inMemoryFlushInProgress.set(true);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    try {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      // Phase I: Update the pipeline<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      getRegionServices().blockUpdates();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        pushActiveToPipeline(this.active);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        getRegionServices().unblockUpdates();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>      // Used by tests<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      if (!allowCompaction.get()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      // Phase II: Compact the pipeline<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        // compaction is in progress<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        compactor.start();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      } catch (IOException e) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } finally {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      inMemoryFlushInProgress.set(false);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private Segment getLastSegment() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    Segment localActive = getActive();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    Segment tail = pipeline.getTail();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return tail == null ? localActive : tail;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private byte[] getFamilyNameInBytes() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private ThreadPoolExecutor getPool() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getRegionServices().getInMemoryCompactionPool();<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>  @VisibleForTesting<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  protected boolean shouldFlushInMemory() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        return false;     // regardless the size<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // the insert of the active into the compaction pipeline<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return false;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * The compaction may still happen if the request was sent too late<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Non-blocking request<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  private void stopCompaction() {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    if (inMemoryFlushInProgress.get()) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      compactor.stop();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    if (!active.isEmpty()) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      pipeline.pushHead(active);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      resetActive();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>  private void pushTailToSnapshot() {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    pipeline.swap(segments,null,false, false);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  private void pushPipelineToSnapshot() {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    int iterationsCnt = 0;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    boolean done = false;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    while (!done) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      iterationsCnt++;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      // and the version increase, the chance of it happenning is very low<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      done = pipeline.swap(segments, null, false, false);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (iterationsCnt&gt;2) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        // practically it is impossible that this loop iterates more than two times<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.503"></a>
+<span class="sourceLineNo">504</span>            " while flushing to disk.");<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        break;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      }<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    if(segments.isEmpty()) return;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.snapshot = segments.get(0);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      return;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    } else { // create composite snapshot<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      this.snapshot =<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
+<span class="sourceLineNo">521</span><a name="line.521"></a>
+<span class="sourceLineNo">522</span>  private RegionServicesForStores getRegionServices() {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    return regionServices;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  * There is at most one thread per memstore instance.<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  * and compacts the pipeline.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  */<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    @Override<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    public void run() {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      try {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        flushInMemory();<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (IOException e) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.539"></a>
+<span class="sourceLineNo">540</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            + "store: "+ getFamilyName(), e);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  @VisibleForTesting<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  boolean isMemStoreFlushingInMemory() {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    return inMemoryFlushInProgress.get();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">550</span><a name="line.550"></a>
+<span class="sourceLineNo">551</span>  /**<a name="line.551"></a>
+<span class="sourceLineNo">552</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   *             first.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @return Next row or null if none found.<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  Cell getNextRow(final Cell cell) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    Cell lowest = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    for (Segment segment : segments) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      if (lowest == null) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      } else {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    return lowest;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>  @VisibleForTesting<a name="line.569"></a>
+<span class="sourceLineNo">570</span>  long getInmemoryFlushSize() {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    return inmemoryFlushSize;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  }<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>  // debug method<a name="line.574"></a>
+<span class="sourceLineNo">575</span>  public void debug() {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    String msg = "active size=" + this.active.keySize();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    LOG.debug(msg);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>}<a name="line.583"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.html
index 49fa7b5..8060a9c 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/DefaultStoreFlusher.html
@@ -90,14 +90,13 @@
 <span class="sourceLineNo">082</span>    } finally {<a name="line.82"></a>
 <span class="sourceLineNo">083</span>      scanner.close();<a name="line.83"></a>
 <span class="sourceLineNo">084</span>    }<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    LOG.info("Flushed, sequenceid=" + cacheFlushId +", memsize="<a name="line.85"></a>
-<span class="sourceLineNo">086</span>        + StringUtils.TraditionalBinaryPrefix.long2String(snapshot.getDataSize(), "", 1) +<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        ", hasBloomFilter=" + writer.hasGeneralBloom() +<a name="line.87"></a>
-<span class="sourceLineNo">088</span>        ", into tmp file " + writer.getPath());<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    result.add(writer.getPath());<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    return result;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  }<a name="line.91"></a>
-<span class="sourceLineNo">092</span>}<a name="line.92"></a>
+<span class="sourceLineNo">085</span>    LOG.info("Flushed memstore data size={} at sequenceid={} (bloomFilter={}), to={}",<a name="line.85"></a>
+<span class="sourceLineNo">086</span>        StringUtils.byteDesc(snapshot.getDataSize()), cacheFlushId, writer.hasGeneralBloom(),<a name="line.86"></a>
+<span class="sourceLineNo">087</span>        writer.getPath());<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    result.add(writer.getPath());<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    return result;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  }<a name="line.90"></a>
+<span class="sourceLineNo">091</span>}<a name="line.91"></a>
 
 
 


[06/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html b/devapidocs/src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
index 7556544..ce54cbb 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/replication/ZKReplicationQueueStorage.html
@@ -41,520 +41,530 @@
 <span class="sourceLineNo">033</span>import org.apache.hadoop.fs.Path;<a name="line.33"></a>
 <span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.HConstants;<a name="line.34"></a>
 <span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.ServerName;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.CollectionUtils;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.zookeeper.KeeperException;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.zookeeper.KeeperException.BadVersionException;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.zookeeper.KeeperException.NoNodeException;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.zookeeper.KeeperException.NotEmptyException;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.zookeeper.data.Stat;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.slf4j.Logger;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.slf4j.LoggerFactory;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.54"></a>
-<span class="sourceLineNo">055</span><a name="line.55"></a>
-<span class="sourceLineNo">056</span>/**<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * ZK based replication queue storage.<a name="line.57"></a>
-<span class="sourceLineNo">058</span> * &lt;p&gt;<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * The base znode for each regionserver is the regionserver name. For example:<a name="line.59"></a>
-<span class="sourceLineNo">060</span> *<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * &lt;pre&gt;<a name="line.61"></a>
-<span class="sourceLineNo">062</span> * /hbase/replication/rs/hostname.example.org,6020,1234<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * &lt;/pre&gt;<a name="line.63"></a>
-<span class="sourceLineNo">064</span> *<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Within this znode, the region server maintains a set of WAL replication queues. These queues are<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * represented by child znodes named using there give queue id. For example:<a name="line.66"></a>
-<span class="sourceLineNo">067</span> *<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * &lt;pre&gt;<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * /hbase/replication/rs/hostname.example.org,6020,1234/1<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * /hbase/replication/rs/hostname.example.org,6020,1234/2<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * &lt;/pre&gt;<a name="line.71"></a>
-<span class="sourceLineNo">072</span> *<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * Each queue has one child znode for every WAL that still needs to be replicated. The value of<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * these WAL child znodes is the latest position that has been replicated. This position is updated<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * every time a WAL entry is replicated. For example:<a name="line.75"></a>
-<span class="sourceLineNo">076</span> *<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * &lt;pre&gt;<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * /hbase/replication/rs/hostname.example.org,6020,1234/1/23522342.23422 [VALUE: 254]<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * &lt;/pre&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> */<a name="line.80"></a>
-<span class="sourceLineNo">081</span>@InterfaceAudience.Private<a name="line.81"></a>
-<span class="sourceLineNo">082</span>class ZKReplicationQueueStorage extends ZKReplicationStorageBase<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    implements ReplicationQueueStorage {<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private static final Logger LOG = LoggerFactory.getLogger(ZKReplicationQueueStorage.class);<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY =<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      "zookeeper.znode.replication.hfile.refs";<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT = "hfile-refs";<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY =<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      "zookeeper.znode.replication.regions";<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT = "regions";<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  /**<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * The name of the znode that contains all replication queues<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   */<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private final String queuesZNode;<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  /**<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * The name of the znode that contains queues of hfile references to be replicated<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   */<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private final String hfileRefsZNode;<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  private final String regionsZNode;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public ZKReplicationQueueStorage(ZKWatcher zookeeper, Configuration conf) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    super(zookeeper, conf);<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>    String queuesZNodeName = conf.get("zookeeper.znode.replication.rs", "rs");<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    String hfileRefsZNodeName = conf.get(ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>      ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    this.queuesZNode = ZNodePaths.joinZNode(replicationZNode, queuesZNodeName);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    this.hfileRefsZNode = ZNodePaths.joinZNode(replicationZNode, hfileRefsZNodeName);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    this.regionsZNode = ZNodePaths.joinZNode(replicationZNode, conf<a name="line.115"></a>
-<span class="sourceLineNo">116</span>        .get(ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY, ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT));<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private String getRsNode(ServerName serverName) {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return ZNodePaths.joinZNode(queuesZNode, serverName.getServerName());<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private String getQueueNode(ServerName serverName, String queueId) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return ZNodePaths.joinZNode(getRsNode(serverName), queueId);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private String getFileNode(String queueNode, String fileName) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return ZNodePaths.joinZNode(queueNode, fileName);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>  }<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private String getFileNode(ServerName serverName, String queueId, String fileName) {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return getFileNode(getQueueNode(serverName, queueId), fileName);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  }<a name="line.133"></a>
-<span class="sourceLineNo">134</span><a name="line.134"></a>
-<span class="sourceLineNo">135</span>  /**<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   * Put all regions under /hbase/replication/regions znode will lead to too many children because<a name="line.136"></a>
-<span class="sourceLineNo">137</span>   * of the huge number of regions in real production environment. So here we use hash of encoded<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   * region name to distribute the znode into multiple znodes. &lt;br&gt;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * So the final znode path will be format like this:<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   *<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   * &lt;pre&gt;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * /hbase/replication/regions/254/dd04e76a6966d4ffa908ed0586764767-100<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * &lt;/pre&gt;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   *<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * The 254 indicate the hash of encoded region name, the 100 indicate the peer id.<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @param encodedRegionName the encoded region name.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   * @param peerId peer id for replication.<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * @return ZNode path to persist the max sequence id that we've pushed for the given region and<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   *         peer.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   */<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private String getSerialReplicationRegionPeerNode(String encodedRegionName, String peerId) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    int hash = encodedRegionName.hashCode() &amp; 0x0000FFFF;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    String hashPath = ZNodePaths.joinZNode(regionsZNode, String.valueOf(hash));<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    return ZNodePaths.joinZNode(hashPath, String.format("%s-%s", encodedRegionName, peerId));<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  @Override<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  public void removeQueue(ServerName serverName, String queueId) throws ReplicationException {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    try {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      ZKUtil.deleteNodeRecursively(zookeeper, getQueueNode(serverName, queueId));<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    } catch (KeeperException e) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      throw new ReplicationException(<a name="line.162"></a>
-<span class="sourceLineNo">163</span>          "Failed to delete queue (serverName=" + serverName + ", queueId=" + queueId + ")", e);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.exceptions.DeserializationException;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.CollectionUtils;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil.ZKUtilOp;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.zookeeper.KeeperException;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.zookeeper.KeeperException.BadVersionException;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.zookeeper.KeeperException.NoNodeException;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.zookeeper.KeeperException.NodeExistsException;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.zookeeper.KeeperException.NotEmptyException;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.zookeeper.data.Stat;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.slf4j.Logger;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.slf4j.LoggerFactory;<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.55"></a>
+<span class="sourceLineNo">056</span><a name="line.56"></a>
+<span class="sourceLineNo">057</span>/**<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * ZK based replication queue storage.<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * &lt;p&gt;<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * The base znode for each regionserver is the regionserver name. For example:<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * &lt;pre&gt;<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * /hbase/replication/rs/hostname.example.org,6020,1234<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * &lt;/pre&gt;<a name="line.64"></a>
+<span class="sourceLineNo">065</span> *<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * Within this znode, the region server maintains a set of WAL replication queues. These queues are<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * represented by child znodes named using there give queue id. For example:<a name="line.67"></a>
+<span class="sourceLineNo">068</span> *<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * &lt;pre&gt;<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * /hbase/replication/rs/hostname.example.org,6020,1234/1<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * /hbase/replication/rs/hostname.example.org,6020,1234/2<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * &lt;/pre&gt;<a name="line.72"></a>
+<span class="sourceLineNo">073</span> *<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * Each queue has one child znode for every WAL that still needs to be replicated. The value of<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * these WAL child znodes is the latest position that has been replicated. This position is updated<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * every time a WAL entry is replicated. For example:<a name="line.76"></a>
+<span class="sourceLineNo">077</span> *<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * &lt;pre&gt;<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * /hbase/replication/rs/hostname.example.org,6020,1234/1/23522342.23422 [VALUE: 254]<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;/pre&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>@InterfaceAudience.Private<a name="line.82"></a>
+<span class="sourceLineNo">083</span>class ZKReplicationQueueStorage extends ZKReplicationStorageBase<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    implements ReplicationQueueStorage {<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>  private static final Logger LOG = LoggerFactory.getLogger(ZKReplicationQueueStorage.class);<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY =<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      "zookeeper.znode.replication.hfile.refs";<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT = "hfile-refs";<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY =<a name="line.92"></a>
+<span class="sourceLineNo">093</span>      "zookeeper.znode.replication.regions";<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public static final String ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT = "regions";<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  /**<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   * The name of the znode that contains all replication queues<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private final String queuesZNode;<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>  /**<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * The name of the znode that contains queues of hfile references to be replicated<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private final String hfileRefsZNode;<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private final String regionsZNode;<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public ZKReplicationQueueStorage(ZKWatcher zookeeper, Configuration conf) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    super(zookeeper, conf);<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    String queuesZNodeName = conf.get("zookeeper.znode.replication.rs", "rs");<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    String hfileRefsZNodeName = conf.get(ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_KEY,<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      ZOOKEEPER_ZNODE_REPLICATION_HFILE_REFS_DEFAULT);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.queuesZNode = ZNodePaths.joinZNode(replicationZNode, queuesZNodeName);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    this.hfileRefsZNode = ZNodePaths.joinZNode(replicationZNode, hfileRefsZNodeName);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    this.regionsZNode = ZNodePaths.joinZNode(replicationZNode, conf<a name="line.116"></a>
+<span class="sourceLineNo">117</span>        .get(ZOOKEEPER_ZNODE_REPLICATION_REGIONS_KEY, ZOOKEEPER_ZNODE_REPLICATION_REGIONS_DEFAULT));<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  }<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  private String getRsNode(ServerName serverName) {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    return ZNodePaths.joinZNode(queuesZNode, serverName.getServerName());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  private String getQueueNode(ServerName serverName, String queueId) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    return ZNodePaths.joinZNode(getRsNode(serverName), queueId);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  private String getFileNode(String queueNode, String fileName) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    return ZNodePaths.joinZNode(queueNode, fileName);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  }<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private String getFileNode(ServerName serverName, String queueId, String fileName) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    return getFileNode(getQueueNode(serverName, queueId), fileName);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Put all regions under /hbase/replication/regions znode will lead to too many children because<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * of the huge number of regions in real production environment. So here we use hash of encoded<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * region name to distribute the znode into multiple znodes. &lt;br&gt;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * So the final znode path will be format like this:<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   *<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * &lt;pre&gt;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * /hbase/replication/regions/e1/ff/dd04e76a6966d4ffa908ed0586764767-100<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   * &lt;/pre&gt;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   *<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * The e1 indicate the first level hash of encoded region name, and the ff indicate the second<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   * level hash of encoded region name, the 100 indicate the peer id. &lt;br&gt;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>   * Note that here we use two-level hash because if only one-level hash (such as mod 65535), it<a name="line.148"></a>
+<span class="sourceLineNo">149</span>   * will still lead to too many children under the /hbase/replication/regions znode.<a name="line.149"></a>
+<span class="sourceLineNo">150</span>   * @param encodedRegionName the encoded region name.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @param peerId peer id for replication.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @return ZNode path to persist the max sequence id that we've pushed for the given region and<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *         peer.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  @VisibleForTesting<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  public String getSerialReplicationRegionPeerNode(String encodedRegionName, String peerId) {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    if (encodedRegionName == null || encodedRegionName.length() != RegionInfo.MD5_HEX_LENGTH) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      throw new IllegalArgumentException(<a name="line.158"></a>
+<span class="sourceLineNo">159</span>          "Invalid encoded region name: " + encodedRegionName + ", length should be 32.");<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    return new StringBuilder(regionsZNode).append(ZNodePaths.ZNODE_PATH_SEPARATOR)<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        .append(encodedRegionName.substring(0, 2)).append(ZNodePaths.ZNODE_PATH_SEPARATOR)<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        .append(encodedRegionName.substring(2, 4)).append(ZNodePaths.ZNODE_PATH_SEPARATOR)<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        .append(encodedRegionName).append("-").append(peerId).toString();<a name="line.164"></a>
 <span class="sourceLineNo">165</span>  }<a name="line.165"></a>
 <span class="sourceLineNo">166</span><a name="line.166"></a>
 <span class="sourceLineNo">167</span>  @Override<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  public void addWAL(ServerName serverName, String queueId, String fileName)<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      throws ReplicationException {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    try {<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      ZKUtil.createWithParents(zookeeper, getFileNode(serverName, queueId, fileName));<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    } catch (KeeperException e) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      throw new ReplicationException("Failed to add wal to queue (serverName=" + serverName<a name="line.173"></a>
-<span class="sourceLineNo">174</span>          + ", queueId=" + queueId + ", fileName=" + fileName + ")", e);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>  @Override<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public void removeWAL(ServerName serverName, String queueId, String fileName)<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      throws ReplicationException {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    String fileNode = getFileNode(serverName, queueId, fileName);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      ZKUtil.deleteNode(zookeeper, fileNode);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    } catch (NoNodeException e) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      LOG.warn("{} already deleted when removing log", fileNode);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    } catch (KeeperException e) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      throw new ReplicationException("Failed to remove wal from queue (serverName=" + serverName +<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        ", queueId=" + queueId + ", fileName=" + fileName + ")", e);<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  }<a name="line.190"></a>
-<span class="sourceLineNo">191</span><a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @Override<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  public void setWALPosition(ServerName serverName, String queueId, String fileName, long position,<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      Map&lt;String, Long&gt; lastSeqIds) throws ReplicationException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    try {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      List&lt;ZKUtilOp&gt; listOfOps = new ArrayList&lt;&gt;();<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      if (position &gt; 0) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        listOfOps.add(ZKUtilOp.setData(getFileNode(serverName, queueId, fileName),<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          ZKUtil.positionToByteArray(position)));<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      // Persist the max sequence id(s) of regions for serial replication atomically.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      for (Entry&lt;String, Long&gt; lastSeqEntry : lastSeqIds.entrySet()) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>        String peerId = new ReplicationQueueInfo(queueId).getPeerId();<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        String path = getSerialReplicationRegionPeerNode(lastSeqEntry.getKey(), peerId);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        /*<a name="line.205"></a>
-<span class="sourceLineNo">206</span>         * Make sure the existence of path<a name="line.206"></a>
-<span class="sourceLineNo">207</span>         * /hbase/replication/regions/&lt;hash&gt;/&lt;encoded-region-name&gt;-&lt;peer-id&gt;. As the javadoc in<a name="line.207"></a>
-<span class="sourceLineNo">208</span>         * multiOrSequential() method said, if received a NodeExistsException, all operations will<a name="line.208"></a>
-<span class="sourceLineNo">209</span>         * fail. So create the path here, and in fact, no need to add this operation to listOfOps,<a name="line.209"></a>
-<span class="sourceLineNo">210</span>         * because only need to make sure that update file position and sequence id atomically.<a name="line.210"></a>
-<span class="sourceLineNo">211</span>         */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        ZKUtil.createWithParents(zookeeper, path);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        // Persist the max sequence id of region to zookeeper.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        listOfOps.add(ZKUtilOp.setData(path, ZKUtil.positionToByteArray(lastSeqEntry.getValue())));<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      if (!listOfOps.isEmpty()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        ZKUtil.multiOrSequential(zookeeper, listOfOps, false);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    } catch (KeeperException e) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      throw new ReplicationException("Failed to set log position (serverName=" + serverName<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          + ", queueId=" + queueId + ", fileName=" + fileName + ", position=" + position + ")", e);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
-<span class="sourceLineNo">224</span><a name="line.224"></a>
-<span class="sourceLineNo">225</span>  @Override<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  public long getLastSequenceId(String encodedRegionName, String peerId)<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      throws ReplicationException {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    byte[] data;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    try {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      data =<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          ZKUtil.getData(zookeeper, getSerialReplicationRegionPeerNode(encodedRegionName, peerId));<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    } catch (KeeperException | InterruptedException e) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>      throw new ReplicationException("Failed to get the last sequence id(region="<a name="line.233"></a>
-<span class="sourceLineNo">234</span>          + encodedRegionName + ", peerId=" + peerId + ")");<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    try {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      return ZKUtil.parseWALPositionFrom(data);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    } catch (DeserializationException de) {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      LOG.warn("Failed to parse log position (region=" + encodedRegionName + ", peerId=" + peerId<a name="line.239"></a>
-<span class="sourceLineNo">240</span>          + "), data=" + Bytes.toStringBinary(data));<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    }<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return HConstants.NO_SEQNUM;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  @Override<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  public long getWALPosition(ServerName serverName, String queueId, String fileName)<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      throws ReplicationException {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    byte[] bytes;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    try {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      bytes = ZKUtil.getData(zookeeper, getFileNode(serverName, queueId, fileName));<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    } catch (KeeperException | InterruptedException e) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      throw new ReplicationException("Failed to get log position (serverName=" + serverName +<a name="line.252"></a>
-<span class="sourceLineNo">253</span>        ", queueId=" + queueId + ", fileName=" + fileName + ")", e);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    try {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      return ZKUtil.parseWALPositionFrom(bytes);<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    } catch (DeserializationException de) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      LOG.warn("Failed parse log position (serverName={}, queueId={}, fileName={})",<a name="line.258"></a>
-<span class="sourceLineNo">259</span>          serverName, queueId, fileName);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    // if we can not parse the position, start at the beginning of the wal file again<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    return 0;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  }<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public Pair&lt;String, SortedSet&lt;String&gt;&gt; claimQueue(ServerName sourceServerName, String queueId,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      ServerName destServerName) throws ReplicationException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    LOG.info("Atomically moving {}/{}'s WALs to {}", sourceServerName, queueId, destServerName);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    try {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      ZKUtil.createWithParents(zookeeper, getRsNode(destServerName));<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    } catch (KeeperException e) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      throw new ReplicationException(<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          "Claim queue queueId=" + queueId + " from " + sourceServerName + " to " + destServerName +<a name="line.273"></a>
-<span class="sourceLineNo">274</span>            " failed when creating the node for " + destServerName,<a name="line.274"></a>
-<span class="sourceLineNo">275</span>          e);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    try {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      String oldQueueNode = getQueueNode(sourceServerName, queueId);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      List&lt;String&gt; wals = ZKUtil.listChildrenNoWatch(zookeeper, oldQueueNode);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      String newQueueId = queueId + "-" + sourceServerName;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      if (CollectionUtils.isEmpty(wals)) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        ZKUtil.deleteNodeFailSilent(zookeeper, oldQueueNode);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        LOG.info("Removed empty {}/{}", sourceServerName, queueId);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        return new Pair&lt;&gt;(newQueueId, Collections.emptySortedSet());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      String newQueueNode = getQueueNode(destServerName, newQueueId);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      List&lt;ZKUtilOp&gt; listOfOps = new ArrayList&lt;&gt;();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      SortedSet&lt;String&gt; logQueue = new TreeSet&lt;&gt;();<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      // create the new cluster znode<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      listOfOps.add(ZKUtilOp.createAndFailSilent(newQueueNode, HConstants.EMPTY_BYTE_ARRAY));<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      // get the offset of the logs and set it to new znodes<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      for (String wal : wals) {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        String oldWalNode = getFileNode(oldQueueNode, wal);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        byte[] logOffset = ZKUtil.getData(this.zookeeper, oldWalNode);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        LOG.debug("Creating {} with data {}", wal, Bytes.toStringBinary(logOffset));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        String newWalNode = getFileNode(newQueueNode, wal);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        listOfOps.add(ZKUtilOp.createAndFailSilent(newWalNode, logOffset));<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldWalNode));<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        logQueue.add(wal);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      // add delete op for peer<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldQueueNode));<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>      LOG.trace("The multi list size is {}", listOfOps.size());<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      ZKUtil.multiOrSequential(zookeeper, listOfOps, false);<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>      LOG.info("Atomically moved {}/{}'s WALs to {}", sourceServerName, queueId, destServerName);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      return new Pair&lt;&gt;(newQueueId, logQueue);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    } catch (NoNodeException | NodeExistsException | NotEmptyException | BadVersionException e) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      // Multi call failed; it looks like some other regionserver took away the logs.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // These exceptions mean that zk tells us the request can not be execute so it is safe to just<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // return a null. For other types of exception should be thrown out to notify the upper layer.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      LOG.info("Claim queue queueId={} from {} to {} failed with {}, someone else took the log?",<a name="line.313"></a>
-<span class="sourceLineNo">314</span>          queueId,sourceServerName, destServerName, e.toString());<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      return null;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    } catch (KeeperException | InterruptedException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      throw new ReplicationException("Claim queue queueId=" + queueId + " from " +<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        sourceServerName + " to " + destServerName + " failed", e);<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>  @Override<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  public void removeReplicatorIfQueueIsEmpty(ServerName serverName) throws ReplicationException {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    try {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      ZKUtil.deleteNodeFailSilent(zookeeper, getRsNode(serverName));<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    } catch (NotEmptyException e) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      // keep silence to avoid logging too much.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    } catch (KeeperException e) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      throw new ReplicationException("Failed to remove replicator for " + serverName, e);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    }<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  private List&lt;ServerName&gt; getListOfReplicators0() throws KeeperException {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, queuesZNode)).stream()<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        .map(ServerName::parseServerName).collect(toList());<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  @Override<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  public List&lt;ServerName&gt; getListOfReplicators() throws ReplicationException {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    try {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      return getListOfReplicators0();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    } catch (KeeperException e) {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      throw new ReplicationException("Failed to get list of replicators", e);<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>  }<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>  private List&lt;String&gt; getWALsInQueue0(ServerName serverName, String queueId)<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      throws KeeperException {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, getQueueNode(serverName, queueId)));<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  }<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  @Override<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  public List&lt;String&gt; getWALsInQueue(ServerName serverName, String queueId)<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      throws ReplicationException {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    try {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      return getWALsInQueue0(serverName, queueId);<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    } catch (KeeperException e) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      throw new ReplicationException(<a name="line.358"></a>
-<span class="sourceLineNo">359</span>          "Failed to get wals in queue (serverName=" + serverName + ", queueId=" + queueId + ")",<a name="line.359"></a>
-<span class="sourceLineNo">360</span>          e);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  }<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private List&lt;String&gt; getAllQueues0(ServerName serverName) throws KeeperException {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, getRsNode(serverName)));<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  @Override<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  public List&lt;String&gt; getAllQueues(ServerName serverName) throws ReplicationException {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    try {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      return getAllQueues0(serverName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    } catch (KeeperException e) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      throw new ReplicationException("Failed to get all queues (serverName=" + serverName + ")", e);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // will be overridden in UTs<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  @VisibleForTesting<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  protected int getQueuesZNodeCversion() throws KeeperException {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    Stat stat = new Stat();<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    ZKUtil.getDataNoWatch(this.zookeeper, this.queuesZNode, stat);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    return stat.getCversion();<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  }<a name="line.383"></a>
-<span class="sourceLineNo">384</span><a name="line.384"></a>
-<span class="sourceLineNo">385</span>  @Override<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  public Set&lt;String&gt; getAllWALs() throws ReplicationException {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    try {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      for (int retry = 0;; retry++) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        int v0 = getQueuesZNodeCversion();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        List&lt;ServerName&gt; rss = getListOfReplicators0();<a name="line.390"></a>
-<span class="sourceLineNo">391</span>        if (rss.isEmpty()) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>          LOG.debug("Didn't find a RegionServer that replicates, won't prevent deletions.");<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          return Collections.emptySet();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>        }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        Set&lt;String&gt; wals = new HashSet&lt;&gt;();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        for (ServerName rs : rss) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          for (String queueId : getAllQueues0(rs)) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            wals.addAll(getWALsInQueue0(rs, queueId));<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        int v1 = getQueuesZNodeCversion();<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (v0 == v1) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          return wals;<a name="line.403"></a>
+<span class="sourceLineNo">168</span>  public void removeQueue(ServerName serverName, String queueId) throws ReplicationException {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    try {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      ZKUtil.deleteNodeRecursively(zookeeper, getQueueNode(serverName, queueId));<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    } catch (KeeperException e) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      throw new ReplicationException(<a name="line.172"></a>
+<span class="sourceLineNo">173</span>          "Failed to delete queue (serverName=" + serverName + ", queueId=" + queueId + ")", e);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  @Override<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  public void addWAL(ServerName serverName, String queueId, String fileName)<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      throws ReplicationException {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    try {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      ZKUtil.createWithParents(zookeeper, getFileNode(serverName, queueId, fileName));<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    } catch (KeeperException e) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      throw new ReplicationException("Failed to add wal to queue (serverName=" + serverName<a name="line.183"></a>
+<span class="sourceLineNo">184</span>          + ", queueId=" + queueId + ", fileName=" + fileName + ")", e);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  @Override<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public void removeWAL(ServerName serverName, String queueId, String fileName)<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      throws ReplicationException {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    String fileNode = getFileNode(serverName, queueId, fileName);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    try {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      ZKUtil.deleteNode(zookeeper, fileNode);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    } catch (NoNodeException e) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      LOG.warn("{} already deleted when removing log", fileNode);<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    } catch (KeeperException e) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      throw new ReplicationException("Failed to remove wal from queue (serverName=" + serverName +<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        ", queueId=" + queueId + ", fileName=" + fileName + ")", e);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  }<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>  @Override<a name="line.202"></a>
+<span class="sourceLineNo">203</span>  public void setWALPosition(ServerName serverName, String queueId, String fileName, long position,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      Map&lt;String, Long&gt; lastSeqIds) throws ReplicationException {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    try {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      List&lt;ZKUtilOp&gt; listOfOps = new ArrayList&lt;&gt;();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      if (position &gt; 0) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        listOfOps.add(ZKUtilOp.setData(getFileNode(serverName, queueId, fileName),<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          ZKUtil.positionToByteArray(position)));<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      // Persist the max sequence id(s) of regions for serial replication atomically.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      for (Entry&lt;String, Long&gt; lastSeqEntry : lastSeqIds.entrySet()) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        String peerId = new ReplicationQueueInfo(queueId).getPeerId();<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        String path = getSerialReplicationRegionPeerNode(lastSeqEntry.getKey(), peerId);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        /*<a name="line.215"></a>
+<span class="sourceLineNo">216</span>         * Make sure the existence of path<a name="line.216"></a>
+<span class="sourceLineNo">217</span>         * /hbase/replication/regions/&lt;hash&gt;/&lt;encoded-region-name&gt;-&lt;peer-id&gt;. As the javadoc in<a name="line.217"></a>
+<span class="sourceLineNo">218</span>         * multiOrSequential() method said, if received a NodeExistsException, all operations will<a name="line.218"></a>
+<span class="sourceLineNo">219</span>         * fail. So create the path here, and in fact, no need to add this operation to listOfOps,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>         * because only need to make sure that update file position and sequence id atomically.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>         */<a name="line.221"></a>
+<span class="sourceLineNo">222</span>        ZKUtil.createWithParents(zookeeper, path);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        // Persist the max sequence id of region to zookeeper.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        listOfOps.add(ZKUtilOp.setData(path, ZKUtil.positionToByteArray(lastSeqEntry.getValue())));<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      }<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      if (!listOfOps.isEmpty()) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        ZKUtil.multiOrSequential(zookeeper, listOfOps, false);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    } catch (KeeperException e) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      throw new ReplicationException("Failed to set log position (serverName=" + serverName<a name="line.230"></a>
+<span class="sourceLineNo">231</span>          + ", queueId=" + queueId + ", fileName=" + fileName + ", position=" + position + ")", e);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public long getLastSequenceId(String encodedRegionName, String peerId)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      throws ReplicationException {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    byte[] data;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    try {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      data =<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          ZKUtil.getData(zookeeper, getSerialReplicationRegionPeerNode(encodedRegionName, peerId));<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    } catch (KeeperException | InterruptedException e) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      throw new ReplicationException("Failed to get the last sequence id(region="<a name="line.243"></a>
+<span class="sourceLineNo">244</span>          + encodedRegionName + ", peerId=" + peerId + ")");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    try {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      return ZKUtil.parseWALPositionFrom(data);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    } catch (DeserializationException de) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      LOG.warn("Failed to parse log position (region=" + encodedRegionName + ", peerId=" + peerId<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          + "), data=" + Bytes.toStringBinary(data));<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    return HConstants.NO_SEQNUM;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  public long getWALPosition(ServerName serverName, String queueId, String fileName)<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      throws ReplicationException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    byte[] bytes;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    try {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      bytes = ZKUtil.getData(zookeeper, getFileNode(serverName, queueId, fileName));<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    } catch (KeeperException | InterruptedException e) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      throw new ReplicationException("Failed to get log position (serverName=" + serverName +<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        ", queueId=" + queueId + ", fileName=" + fileName + ")", e);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    }<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    try {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      return ZKUtil.parseWALPositionFrom(bytes);<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    } catch (DeserializationException de) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      LOG.warn("Failed parse log position (serverName={}, queueId={}, fileName={})",<a name="line.268"></a>
+<span class="sourceLineNo">269</span>          serverName, queueId, fileName);<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    // if we can not parse the position, start at the beginning of the wal file again<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    return 0;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public Pair&lt;String, SortedSet&lt;String&gt;&gt; claimQueue(ServerName sourceServerName, String queueId,<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      ServerName destServerName) throws ReplicationException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    LOG.info("Atomically moving {}/{}'s WALs to {}", sourceServerName, queueId, destServerName);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    try {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      ZKUtil.createWithParents(zookeeper, getRsNode(destServerName));<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    } catch (KeeperException e) {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      throw new ReplicationException(<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          "Claim queue queueId=" + queueId + " from " + sourceServerName + " to " + destServerName +<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            " failed when creating the node for " + destServerName,<a name="line.284"></a>
+<span class="sourceLineNo">285</span>          e);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    try {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      String oldQueueNode = getQueueNode(sourceServerName, queueId);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      List&lt;String&gt; wals = ZKUtil.listChildrenNoWatch(zookeeper, oldQueueNode);<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      String newQueueId = queueId + "-" + sourceServerName;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      if (CollectionUtils.isEmpty(wals)) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>        ZKUtil.deleteNodeFailSilent(zookeeper, oldQueueNode);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        LOG.info("Removed empty {}/{}", sourceServerName, queueId);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        return new Pair&lt;&gt;(newQueueId, Collections.emptySortedSet());<a name="line.294"></a>
+<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      String newQueueNode = getQueueNode(destServerName, newQueueId);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      List&lt;ZKUtilOp&gt; listOfOps = new ArrayList&lt;&gt;();<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      SortedSet&lt;String&gt; logQueue = new TreeSet&lt;&gt;();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      // create the new cluster znode<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      listOfOps.add(ZKUtilOp.createAndFailSilent(newQueueNode, HConstants.EMPTY_BYTE_ARRAY));<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      // get the offset of the logs and set it to new znodes<a name="line.301"></a>
+<span class="sourceLineNo">302</span>      for (String wal : wals) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        String oldWalNode = getFileNode(oldQueueNode, wal);<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        byte[] logOffset = ZKUtil.getData(this.zookeeper, oldWalNode);<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        LOG.debug("Creating {} with data {}", wal, Bytes.toStringBinary(logOffset));<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        String newWalNode = getFileNode(newQueueNode, wal);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        listOfOps.add(ZKUtilOp.createAndFailSilent(newWalNode, logOffset));<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldWalNode));<a name="line.308"></a>
+<span class="sourceLineNo">309</span>        logQueue.add(wal);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      }<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      // add delete op for peer<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      listOfOps.add(ZKUtilOp.deleteNodeFailSilent(oldQueueNode));<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>      LOG.trace("The multi list size is {}", listOfOps.size());<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      ZKUtil.multiOrSequential(zookeeper, listOfOps, false);<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>      LOG.info("Atomically moved {}/{}'s WALs to {}", sourceServerName, queueId, destServerName);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      return new Pair&lt;&gt;(newQueueId, logQueue);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    } catch (NoNodeException | NodeExistsException | NotEmptyException | BadVersionException e) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // Multi call failed; it looks like some other regionserver took away the logs.<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // These exceptions mean that zk tells us the request can not be execute so it is safe to just<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // return a null. For other types of exception should be thrown out to notify the upper layer.<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      LOG.info("Claim queue queueId={} from {} to {} failed with {}, someone else took the log?",<a name="line.323"></a>
+<span class="sourceLineNo">324</span>          queueId,sourceServerName, destServerName, e.toString());<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      return null;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    } catch (KeeperException | InterruptedException e) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      throw new ReplicationException("Claim queue queueId=" + queueId + " from " +<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        sourceServerName + " to " + destServerName + " failed", e);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  @Override<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  public void removeReplicatorIfQueueIsEmpty(ServerName serverName) throws ReplicationException {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      ZKUtil.deleteNodeFailSilent(zookeeper, getRsNode(serverName));<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    } catch (NotEmptyException e) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      // keep silence to avoid logging too much.<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    } catch (KeeperException e) {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      throw new ReplicationException("Failed to remove replicator for " + serverName, e);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>  private List&lt;ServerName&gt; getListOfReplicators0() throws KeeperException {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, queuesZNode)).stream()<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        .map(ServerName::parseServerName).collect(toList());<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  }<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>  @Override<a name="line.348"></a>
+<span class="sourceLineNo">349</span>  public List&lt;ServerName&gt; getListOfReplicators() throws ReplicationException {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    try {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>      return getListOfReplicators0();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    } catch (KeeperException e) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>      throw new ReplicationException("Failed to get list of replicators", e);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>  private List&lt;String&gt; getWALsInQueue0(ServerName serverName, String queueId)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      throws KeeperException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, getQueueNode(serverName, queueId)));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  }<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Override<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public List&lt;String&gt; getWALsInQueue(ServerName serverName, String queueId)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>      throws ReplicationException {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    try {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      return getWALsInQueue0(serverName, queueId);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    } catch (KeeperException e) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      throw new ReplicationException(<a name="line.368"></a>
+<span class="sourceLineNo">369</span>          "Failed to get wals in queue (serverName=" + serverName + ", queueId=" + queueId + ")",<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          e);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    }<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private List&lt;String&gt; getAllQueues0(ServerName serverName) throws KeeperException {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, getRsNode(serverName)));<a name="line.375"></a>
+<span class="sourceLineNo">376</span>  }<a name="line.376"></a>
+<span class="sourceLineNo">377</span><a name="line.377"></a>
+<span class="sourceLineNo">378</span>  @Override<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  public List&lt;String&gt; getAllQueues(ServerName serverName) throws ReplicationException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    try {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      return getAllQueues0(serverName);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    } catch (KeeperException e) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      throw new ReplicationException("Failed to get all queues (serverName=" + serverName + ")", e);<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  // will be overridden in UTs<a name="line.387"></a>
+<span class="sourceLineNo">388</span>  @VisibleForTesting<a name="line.388"></a>
+<span class="sourceLineNo">389</span>  protected int getQueuesZNodeCversion() throws KeeperException {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    Stat stat = new Stat();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    ZKUtil.getDataNoWatch(this.zookeeper, this.queuesZNode, stat);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    return stat.getCversion();<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  }<a name="line.393"></a>
+<span class="sourceLineNo">394</span><a name="line.394"></a>
+<span class="sourceLineNo">395</span>  @Override<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  public Set&lt;String&gt; getAllWALs() throws ReplicationException {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    try {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      for (int retry = 0;; retry++) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>        int v0 = getQueuesZNodeCversion();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        List&lt;ServerName&gt; rss = getListOfReplicators0();<a name="line.400"></a>
+<span class="sourceLineNo">401</span>        if (rss.isEmpty()) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>          LOG.debug("Didn't find a RegionServer that replicates, won't prevent deletions.");<a name="line.402"></a>
+<span class="sourceLineNo">403</span>          return Collections.emptySet();<a name="line.403"></a>
 <span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        LOG.info("Replication queue node cversion changed from %d to %d, retry = %d",<a name="line.405"></a>
-<span class="sourceLineNo">406</span>            v0, v1, retry);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    } catch (KeeperException e) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      throw new ReplicationException("Failed to get all wals", e);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
-<span class="sourceLineNo">412</span><a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private String getHFileRefsPeerNode(String peerId) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return ZNodePaths.joinZNode(hfileRefsZNode, peerId);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>  }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  private String getHFileNode(String peerNode, String fileName) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    return ZNodePaths.joinZNode(peerNode, fileName);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
-<span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  @Override<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public void addPeerToHFileRefs(String peerId) throws ReplicationException {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    String peerNode = getHFileRefsPeerNode(peerId);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    try {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      if (ZKUtil.checkExists(zookeeper, peerNode) == -1) {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        LOG.info("Adding peer {} to hfile reference queue.", peerId);<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        ZKUtil.createWithParents(zookeeper, peerNode);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      }<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (KeeperException e) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      throw new ReplicationException("Failed to add peer " + peerId + " to hfile reference queue.",<a name="line.430"></a>
-<span class="sourceLineNo">431</span>          e);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  @Override<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  public void removePeerFromHFileRefs(String peerId) throws ReplicationException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    String peerNode = getHFileRefsPeerNode(peerId);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    try {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      if (ZKUtil.checkExists(zookeeper, peerNode) == -1) {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>          LOG.debug("Peer {} not found in hfile reference queue.", peerNode);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      } else {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        LOG.info("Removing peer {} from hfile reference queue.", peerNode);<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        ZKUtil.deleteNodeRecursively(zookeeper, peerNode);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      }<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    } catch (KeeperException e) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      throw new ReplicationException(<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          "Failed to remove peer " + peerId + " from hfile reference queue.", e);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  @Override<a name="line.451"></a>
-<span class="sourceLineNo">452</span>  public void addHFileRefs(String peerId, List&lt;Pair&lt;Path, Path&gt;&gt; pairs)<a name="line.452"></a>
-<span class="sourceLineNo">453</span>      throws ReplicationException {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    String peerNode = getHFileRefsPeerNode(peerId);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    LOG.debug("Adding hfile references {} in queue {}", pairs, peerNode);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    List&lt;ZKUtilOp&gt; listOfOps = pairs.stream().map(p -&gt; p.getSecond().getName())<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        .map(n -&gt; getHFileNode(peerNode, n))<a name="line.457"></a>
-<span class="sourceLineNo">458</span>        .map(f -&gt; ZKUtilOp.createAndFailSilent(f, HConstants.EMPTY_BYTE_ARRAY)).collect(toList());<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      LOG.debug("The multi list size for adding hfile references in zk for node {} is {}",<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          peerNode, listOfOps.size());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    try {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      ZKUtil.multiOrSequential(this.zookeeper, listOfOps, true);<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } catch (KeeperException e) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      throw new ReplicationException("Failed to add hfile reference to peer " + peerId, e);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>  }<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>  @Override<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  public void removeHFileRefs(String peerId, List&lt;String&gt; files) throws ReplicationException {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    String peerNode = getHFileRefsPeerNode(peerId);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    LOG.debug("Removing hfile references {} from queue {}", files, peerNode);<a name="line.471"></a>
-<span class="sourceLineNo">472</span><a name="line.472"></a>
-<span class="sourceLineNo">473</span>    List&lt;ZKUtilOp&gt; listOfOps = files.stream().map(n -&gt; getHFileNode(peerNode, n))<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        .map(ZKUtilOp::deleteNodeFailSilent).collect(toList());<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    LOG.debug("The multi list size for removing hfile references in zk for node {} is {}",<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        peerNode, listOfOps.size());<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    try {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      ZKUtil.multiOrSequential(this.zookeeper, listOfOps, true);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    } catch (KeeperException e) {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      throw new ReplicationException("Failed to remove hfile reference from peer " + peerId, e);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  private List&lt;String&gt; getAllPeersFromHFileRefsQueue0() throws KeeperException {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    return nullToEmpty(ZKUtil.listChildrenNoWatch(zookeeper, hfileRefsZNode));<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>  @Override<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public List&lt;String&gt; getAllPeersFromHFileRefsQueue() throws ReplicationException {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    try {<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      return getAllPeersFromHFileRefsQueue0();<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    } catch (KeeperException e) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      throw new ReplicationException("Failed to get list of all peers in hfile references node.",<a name="line.493"></a>
-<span class="sourceLineNo">494</span>          e);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    }<a name="line.495"></a>
+<span class="sourceLineNo">405</span>        Set&lt;String&gt; wals = new HashSet&lt;&gt;();<a name="line.405"></a>
+<span class="sourceLineNo">406</span>        for (ServerName rs : rss) {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>          for (String queueId : getAllQueues0(rs)) {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            wals.addAll(getWALsInQueue0(rs, queueId));<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        int v1 = getQueuesZNodeCversion();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        if (v0 == v1) {<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          return wals;<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>        LOG.info("Replication queue node cversion changed from %d to %d, retry = %d",<a name="line.415"></a>
+<span class="sourceLineNo">416</span>            v0, v1, retry);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    } catch (KeeperException e) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>      throw new ReplicationException("Failed to get all wals", e);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
+<span class="sourceLineNo">422</span><a name="line.422"></a>
+<span class="sourceLineNo">423</span>  private String getHFileRefsPeerNode(String peerId) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    return ZNodePaths.joinZNode(hfileRefsZNode, peerId);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  }<a name="line.425"></a>
+<span class="sourceLineNo">426</span><a name="line.426"></a>
+<span class="sourceLineNo">427</span>  private String getHFileNode(String peerNode, String fileName) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    return ZNodePaths.joinZNode(peerNode, fileName);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  }<a name="line.429"></a>
+<span class="sourceLineNo">430</s

<TRUNCATED>

[42/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
index 1b6c6d1..8771c2c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.320">MemStoreFlusher.FlushHandler</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.324">MemStoreFlusher.FlushHandler</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" title="class in org.apache.hadoop.hbase.util">HasThread</a></pre>
 </li>
 </ul>
@@ -200,7 +200,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushHandler</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.322">FlushHandler</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.326">FlushHandler</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 </li>
 </ul>
 </li>
@@ -217,7 +217,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.327">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html#line.331">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
index 89f548d..bae780c 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
@@ -107,7 +107,7 @@
 </dl>
 <hr>
 <br>
-<pre>static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.814">MemStoreFlusher.FlushQueueEntry</a>
+<pre>static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.818">MemStoreFlusher.FlushQueueEntry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a></pre>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
index aee5adb..3ef4e5f 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.825">MemStoreFlusher.FlushRegionEntry</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.829">MemStoreFlusher.FlushRegionEntry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a></pre>
 <div class="block">Datastructure used in the flush queue.  Holds region and retry count.
@@ -270,7 +270,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.826">region</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.830">region</a></pre>
 </li>
 </ul>
 <a name="createTime">
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>createTime</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.828">createTime</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.832">createTime</a></pre>
 </li>
 </ul>
 <a name="whenToExpire">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>whenToExpire</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.829">whenToExpire</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.833">whenToExpire</a></pre>
 </li>
 </ul>
 <a name="requeueCount">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>requeueCount</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.830">requeueCount</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.834">requeueCount</a></pre>
 </li>
 </ul>
 <a name="forceFlushAllStores">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>forceFlushAllStores</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.832">forceFlushAllStores</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.836">forceFlushAllStores</a></pre>
 </li>
 </ul>
 <a name="tracker">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockListLast">
 <li class="blockList">
 <h4>tracker</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.834">tracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.838">tracker</a></pre>
 </li>
 </ul>
 </li>
@@ -332,7 +332,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushRegionEntry</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.836">FlushRegionEntry</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.840">FlushRegionEntry</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                  boolean&nbsp;forceFlushAllStores,
                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
@@ -351,7 +351,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>isMaximumWait</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.848">isMaximumWait</a>(long&nbsp;maximumWait)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.852">isMaximumWait</a>(long&nbsp;maximumWait)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>maximumWait</code> - </dd>
@@ -366,7 +366,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequeueCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.856">getRequeueCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.860">getRequeueCount</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Count of times <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#requeue-long-"><code>requeue(long)</code></a> was called; i.e this is
@@ -380,7 +380,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>isForceFlushAllStores</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.863">isForceFlushAllStores</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.867">isForceFlushAllStores</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>whether we need to flush all stores.</dd>
@@ -393,7 +393,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>getTracker</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.867">getTracker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.871">getTracker</a>()</pre>
 </li>
 </ul>
 <a name="requeue-long-">
@@ -402,7 +402,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>requeue</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.877">requeue</a>(long&nbsp;when)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.881">requeue</a>(long&nbsp;when)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>when</code> - When to expire, when to come up out of the queue.
@@ -419,7 +419,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>getDelay</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.884">getDelay</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;unit)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.888">getDelay</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;unit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true#getDelay-java.util.concurrent.TimeUnit-" title="class or interface in java.util.concurrent">getDelay</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a></code></dd>
@@ -432,7 +432,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.890">compareTo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&nbsp;other)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.894">compareTo</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&nbsp;other)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Delayed.html?is-external=true" title="class or interface in java.util.concurrent">Delayed</a>&gt;</code></dd>
@@ -445,7 +445,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.902">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.906">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -458,7 +458,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.907">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.911">hashCode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -471,7 +471,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore
 <ul class="blockListLast">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.913">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html#line.917">equals</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;obj)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
index 2b6dc7b..bed9f6b 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html
@@ -114,7 +114,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.70">MemStoreFlusher</a>
+class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.69">MemStoreFlusher</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequester</a></pre>
 <div class="block">Thread that flushes cache on request
@@ -458,7 +458,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.71">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.70">LOG</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -467,7 +467,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.73">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.72">conf</a></pre>
 </li>
 </ul>
 <a name="flushQueue">
@@ -476,7 +476,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushQueue</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">BlockingQueue</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.76">flushQueue</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/BlockingQueue.html?is-external=true" title="class or interface in java.util.concurrent">BlockingQueue</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.75">flushQueue</a></pre>
 </li>
 </ul>
 <a name="regionsInQueue">
@@ -485,7 +485,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsInQueue</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.77">regionsInQueue</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>,<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.76">regionsInQueue</a></pre>
 </li>
 </ul>
 <a name="wakeupPending">
@@ -494,7 +494,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeupPending</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.78">wakeupPending</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.77">wakeupPending</a></pre>
 </li>
 </ul>
 <a name="threadWakeFrequency">
@@ -503,7 +503,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>threadWakeFrequency</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.80">threadWakeFrequency</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.79">threadWakeFrequency</a></pre>
 </li>
 </ul>
 <a name="server">
@@ -512,7 +512,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>server</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.81">server</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.80">server</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -521,7 +521,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.82">lock</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantReadWriteLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.81">lock</a></pre>
 </li>
 </ul>
 <a name="blockSignal">
@@ -530,7 +530,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>blockSignal</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.83">blockSignal</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.82">blockSignal</a></pre>
 </li>
 </ul>
 <a name="blockingWaitTime">
@@ -539,7 +539,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>blockingWaitTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.85">blockingWaitTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.84">blockingWaitTime</a></pre>
 </li>
 </ul>
 <a name="updatesBlockedMsHighWater">
@@ -548,7 +548,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>updatesBlockedMsHighWater</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.86">updatesBlockedMsHighWater</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.85">updatesBlockedMsHighWater</a></pre>
 </li>
 </ul>
 <a name="flushHandlers">
@@ -557,7 +557,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushHandlers</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushHandler</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.88">flushHandlers</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushHandler.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushHandler</a>[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.87">flushHandlers</a></pre>
 </li>
 </ul>
 <a name="flushRequestListeners">
@@ -566,7 +566,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRequestListeners</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.89">flushRequestListeners</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.88">flushRequestListeners</a></pre>
 </li>
 </ul>
 <a name="flushType">
@@ -575,7 +575,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushType</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.91">flushType</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.90">flushType</a></pre>
 </li>
 </ul>
 <a name="WAKEUPFLUSH_INSTANCE">
@@ -584,7 +584,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WAKEUPFLUSH_INSTANCE</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.96">WAKEUPFLUSH_INSTANCE</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushQueueEntry</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.95">WAKEUPFLUSH_INSTANCE</a></pre>
 <div class="block">Singleton instance inserted into flush queue used for signaling.</div>
 </li>
 </ul>
@@ -602,7 +602,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MemStoreFlusher</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.123">MemStoreFlusher</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.122">MemStoreFlusher</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;server)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -625,7 +625,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getUpdatesBlockedMsHighWater</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.144">getUpdatesBlockedMsHighWater</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/LongAdder.html?is-external=true" title="class or interface in java.util.concurrent.atomic">LongAdder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.143">getUpdatesBlockedMsHighWater</a>()</pre>
 </li>
 </ul>
 <a name="setFlushType-org.apache.hadoop.hbase.regionserver.FlushType-">
@@ -634,7 +634,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>setFlushType</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.148">setFlushType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.147">setFlushType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;flushType)</pre>
 </li>
 </ul>
 <a name="flushOneForGlobalPressure--">
@@ -643,7 +643,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushOneForGlobalPressure</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.158">flushOneForGlobalPressure</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.157">flushOneForGlobalPressure</a>()</pre>
 <div class="block">The memstore across all regions has exceeded the low water mark. Pick
  one region to flush and flush it synchronously (this is called from the
  flush thread)</div>
@@ -659,7 +659,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreOffHeapSize</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.302">getMemStoreOffHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.306">getMemStoreOffHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return memstore offheap size or null if <code>r</code> is null</dd>
@@ -672,7 +672,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreHeapSize</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.309">getMemStoreHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.313">getMemStoreHeapSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return memstore heap size or null if <code>r</code> is null</dd>
@@ -685,7 +685,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreDataSize</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.316">getMemStoreDataSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.320">getMemStoreDataSize</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Return memstore data size or null if <code>r</code> is null</dd>
@@ -698,7 +698,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeupFlushThread</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.384">wakeupFlushThread</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.388">wakeupFlushThread</a>()</pre>
 </li>
 </ul>
 <a name="getBiggestMemStoreRegion-java.util.SortedMap-java.util.Set-boolean-">
@@ -707,7 +707,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getBiggestMemStoreRegion</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.390">getBiggestMemStoreRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;regionsBySize,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.394">getBiggestMemStoreRegion</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;regionsBySize,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&nbsp;excludedRegions,
                                          boolean&nbsp;checkStoreFileCount)</pre>
 </li>
@@ -718,7 +718,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getBiggestMemStoreOfRegionReplica</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.415">getBiggestMemStoreOfRegionReplica</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;regionsBySize,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.419">getBiggestMemStoreOfRegionReplica</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html?is-external=true" title="class or interface in java.util">SortedMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&gt;&nbsp;regionsBySize,
                                                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&gt;&nbsp;excludedRegions)</pre>
 </li>
 </ul>
@@ -728,7 +728,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFilesAndReclaimMemory</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.435">refreshStoreFilesAndReclaimMemory</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.439">refreshStoreFilesAndReclaimMemory</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="isAboveHighWaterMark--">
@@ -737,7 +737,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isAboveHighWaterMark</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.447">isAboveHighWaterMark</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.451">isAboveHighWaterMark</a>()</pre>
 <div class="block">Return true if global memory usage is above the high watermark</div>
 </li>
 </ul>
@@ -747,7 +747,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isAboveLowWaterMark</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.454">isAboveLowWaterMark</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver">FlushType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.458">isAboveLowWaterMark</a>()</pre>
 <div class="block">Return true if we're above the low watermark</div>
 </li>
 </ul>
@@ -757,7 +757,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.459">requestFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.463">requestFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                          boolean&nbsp;forceFlushAllStores,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html#requestFlush-org.apache.hadoop.hbase.regionserver.HRegion-boolean-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">FlushRequester</a></code></span></div>
@@ -778,7 +778,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>requestDelayedFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.475">requestDelayedFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.479">requestDelayedFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r,
                                 long&nbsp;delay,
                                 boolean&nbsp;forceFlushAllStores)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequester.html#requestDelayedFlush-org.apache.hadoop.hbase.regionserver.HRegion-long-boolean-">FlushRequester</a></code></span></div>
@@ -800,7 +800,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushQueueSize</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.489">getFlushQueueSize</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.493">getFlushQueueSize</a>()</pre>
 </li>
 </ul>
 <a name="interruptIfNecessary--">
@@ -809,7 +809,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>interruptIfNecessary</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.496">interruptIfNecessary</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.500">interruptIfNecessary</a>()</pre>
 <div class="block">Only interrupt once it's done with a run through the work loop.</div>
 </li>
 </ul>
@@ -819,7 +819,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.507">start</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a>&nbsp;eh)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.511">start</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.UncaughtExceptionHandler.html?is-external=true" title="class or interface in java.lang">Thread.UncaughtExceptionHandler</a>&nbsp;eh)</pre>
 </li>
 </ul>
 <a name="isAlive--">
@@ -828,7 +828,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isAlive</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.517">isAlive</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.521">isAlive</a>()</pre>
 </li>
 </ul>
 <a name="join--">
@@ -837,7 +837,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.526">join</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.530">join</a>()</pre>
 </li>
 </ul>
 <a name="flushRegion-org.apache.hadoop.hbase.regionserver.MemStoreFlusher.FlushRegionEntry-">
@@ -846,7 +846,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRegion</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.542">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;fqe)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.546">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushRegionEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreFlusher.FlushRegionEntry</a>&nbsp;fqe)</pre>
 <div class="block">A flushRegion that checks store file count.  If too many, puts the flush
  on delay queue to retry later.</div>
 <dl>
@@ -865,7 +865,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>flushRegion</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.591">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.595">flushRegion</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
                             boolean&nbsp;emergencyFlush,
                             boolean&nbsp;forceFlushAllStores,
                             <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
@@ -891,7 +891,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>notifyFlushRequest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.642">notifyFlushRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.646">notifyFlushRequest</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region,
                                 boolean&nbsp;emergencyFlush)</pre>
 </li>
 </ul>
@@ -901,7 +901,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>wakeUpIfBlocking</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.655">wakeUpIfBlocking</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.659">wakeUpIfBlocking</a>()</pre>
 </li>
 </ul>
 <a name="isTooManyStoreFiles-org.apache.hadoop.hbase.regionserver.Region-">
@@ -910,7 +910,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>isTooManyStoreFiles</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.661">isTooManyStoreFiles</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.665">isTooManyStoreFiles</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;region)</pre>
 </li>
 </ul>
 <a name="reclaimMemStoreMemory--">
@@ -919,7 +919,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>reclaimMemStoreMemory</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.682">reclaimMemStoreMemory</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.686">reclaimMemStoreMemory</a>()</pre>
 <div class="block">Check if the regionserver's memstore memory usage is greater than the
  limit. If so, flush regions with the biggest memstores until we're down
  to the lower limit. This method blocks callers until we're down to a safe
@@ -932,7 +932,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>logMsg</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.759">logMsg</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;string1,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.763">logMsg</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;string1,
                     long&nbsp;val,
                     long&nbsp;max)</pre>
 </li>
@@ -943,7 +943,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.766">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.770">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -956,7 +956,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>dumpQueue</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.771">dumpQueue</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.775">dumpQueue</a>()</pre>
 </li>
 </ul>
 <a name="registerFlushRequestListener-org.apache.hadoop.hbase.regionserver.FlushRequestListener-">
@@ -965,7 +965,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>registerFlushRequestListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.790">registerFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.794">registerFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
 <div class="block">Register a MemstoreFlushListener</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -981,7 +981,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterFlushRequestListener</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.800">unregisterFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.804">unregisterFlushRequestListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushRequestListener.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushRequestListener</a>&nbsp;listener)</pre>
 <div class="block">Unregister the listener from MemstoreFlushListeners</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -999,7 +999,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushReq
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setGlobalMemStoreLimit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.809">setGlobalMemStoreLimit</a>(long&nbsp;globalMemStoreSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.html#line.813">setGlobalMemStoreLimit</a>(long&nbsp;globalMemStoreSize)</pre>
 <div class="block">Sets the global memstore limit to a new size.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 74784bb..86457ea 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -704,20 +704,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
index b377318..3bd22b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,8 +130,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
index 5855bca..9c6d22a 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
@@ -748,7 +748,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.wal.<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync--">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-">sync</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync--">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-boolean-">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-boolean-">sync</a></code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AsyncFSWAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AsyncFSWAL.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AsyncFSWAL.html
index 50b1b44..fc79eb0 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AsyncFSWAL.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AsyncFSWAL.html
@@ -523,6 +523,13 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 <h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
 <code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.wal.WAL">
+<!--   -->
+</a>
+<h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.wal.<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></h3>
+<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-boolean-">sync</a>, <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-boolean-">sync</a></code></li>
+</ul>
 </li>
 </ul>
 </li>


[02/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index 5559cca..9d74b78 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -165,7 +165,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_CACHE_FLUSH_INTERVAL
 , timestampSlop, writeRequestsCount, writestate</code></li>
+<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, DEFAULT_WAL_HSYNC, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_C
 ACHE_FLUSH_INTERVAL, timestampSlop, WAL_HSYNC_CONF_KEY, writeRequestsCount, writestate</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index 3cff0f1..09715bb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -163,7 +163,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_CACHE_FLUSH_INTERVAL
 , timestampSlop, writeRequestsCount, writestate</code></li>
+<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, DEFAULT_WAL_HSYNC, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_C
 ACHE_FLUSH_INTERVAL, timestampSlop, WAL_HSYNC_CONF_KEY, writeRequestsCount, writestate</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.ErrorThrowingHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.ErrorThrowingHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.ErrorThrowingHRegion.html
index b87cbc3..8768ac7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.ErrorThrowingHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.ErrorThrowingHRegion.html
@@ -164,7 +164,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_CACHE_FLUSH_INTERVAL
 , timestampSlop, writeRequestsCount, writestate</code></li>
+<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, DEFAULT_WAL_HSYNC, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_C
 ACHE_FLUSH_INTERVAL, timestampSlop, WAL_HSYNC_CONF_KEY, writeRequestsCount, writestate</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatHRegion.html
index 9f3e7c5..2218196 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatHRegion.html
@@ -193,7 +193,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_CACHE_FLUSH_INTERVAL
 , timestampSlop, writeRequestsCount, writestate</code></li>
+<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, DEFAULT_WAL_HSYNC, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_C
 ACHE_FLUSH_INTERVAL, timestampSlop, WAL_HSYNC_CONF_KEY, writeRequestsCount, writestate</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.DodgyFSLog.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.DodgyFSLog.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.DodgyFSLog.html
index e75f354..8727b4e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.DodgyFSLog.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestWALLockup.DodgyFSLog.html
@@ -237,7 +237,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog</h3>
-<code>append, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getSequenceOnRingBuffer, publishSyncOnRingBuffer, sync, sync</code></li>
+<code>append, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getSequenceOnRingBuffer, publishSyncOnRingBuffer, sync, sync, sync, sync</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index df88362..d2906b6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -653,11 +653,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.MockWAL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.MockWAL.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.MockWAL.html
index 39e0adf..33fdb6e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.MockWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.MockWAL.html
@@ -232,7 +232,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog</h3>
-<code>afterCreatingZigZagLatch, append, beforeWaitOnSafePoint, createWriterInstance, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getLogReplication, getOutputStream, getPipeline, getSequenceOnRingBuffer, isLowReplicationRollEnabled, publishSyncOnRingBuffer, sync, sync</code></li>
+<code>afterCreatingZigZagLatch, append, beforeWaitOnSafePoint, createWriterInstance, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getLogReplication, getOutputStream, getPipeline, getSequenceOnRingBuffer, isLowReplicationRollEnabled, publishSyncOnRingBuffer, sync, sync, sync, sync</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html
index ad2593f..92cf6fd 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html
@@ -189,7 +189,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html#sync--">sync</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html#sync-boolean-">sync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -258,13 +258,13 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="sync--">
+<a name="sync-boolean-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html#line.70">sync</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.HighLatencySyncWriter.html#line.70">sync</a>(boolean&nbsp;forceSync)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html
index 6056ab1..20447eb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.DummyWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" target="_top">Frames</a></li>
@@ -350,7 +350,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.DummyWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html
new file mode 100644
index 0000000..7f7832f
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html
@@ -0,0 +1,467 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestWALDurability (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestWALDurability (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":9,"i2":10,"i3":10};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestWALDurability.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" target="_top">Frames</a></li>
+<li><a href="TestWALDurability.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.regionserver.wal</div>
+<h2 title="Class TestWALDurability" class="title">Class TestWALDurability</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.regionserver.wal.TestWALDurability</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.50">TestWALDurability</a>
+extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
+<div class="block">Tests for WAL write durability - hflush vs hsync</div>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#COLUMN_FAMILY">COLUMN_FAMILY</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#COLUMN_FAMILY_BYTES">COLUMN_FAMILY_BYTES</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private org.apache.hadoop.conf.Configuration</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#conf">conf</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#dir">dir</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>org.junit.rules.TestName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#name">name</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.TableName</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#tableName">tableName</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#TestWALDurability--">TestWALDurability</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#getName--">getName</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>static org.apache.hadoop.hbase.regionserver.HRegion</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#initHRegion-org.apache.hadoop.hbase.TableName-byte:A-byte:A-org.apache.hadoop.hbase.wal.WAL-">initHRegion</a></span>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+           byte[]&nbsp;startKey,
+           byte[]&nbsp;stopKey,
+           org.apache.hadoop.hbase.wal.WAL&nbsp;wal)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#setup--">setup</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#testWALDurability--">testWALDurability</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.53">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="COLUMN_FAMILY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>COLUMN_FAMILY</h4>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.56">COLUMN_FAMILY</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.wal.TestWALDurability.COLUMN_FAMILY">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="COLUMN_FAMILY_BYTES">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>COLUMN_FAMILY_BYTES</h4>
+<pre>private static final&nbsp;byte[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.57">COLUMN_FAMILY_BYTES</a></pre>
+</li>
+</ul>
+<a name="TEST_UTIL">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>TEST_UTIL</h4>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.59">TEST_UTIL</a></pre>
+</li>
+</ul>
+<a name="conf">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>conf</h4>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.60">conf</a></pre>
+</li>
+</ul>
+<a name="dir">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>dir</h4>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.61">dir</a></pre>
+</li>
+</ul>
+<a name="name">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>name</h4>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.63">name</a></pre>
+</li>
+</ul>
+<a name="tableName">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>tableName</h4>
+<pre>protected&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.66">tableName</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestWALDurability--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestWALDurability</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.50">TestWALDurability</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="setup--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setup</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.69">setup</a>()
+           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testWALDurability--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testWALDurability</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.76">testWALDurability</a>()
+                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="getName--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getName</h4>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.147">getName</a>()</pre>
+</li>
+</ul>
+<a name="initHRegion-org.apache.hadoop.hbase.TableName-byte:A-byte:A-org.apache.hadoop.hbase.wal.WAL-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>initHRegion</h4>
+<pre>public static&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#line.155">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+                                                                       byte[]&nbsp;startKey,
+                                                                       byte[]&nbsp;stopKey,
+                                                                       org.apache.hadoop.hbase.wal.WAL&nbsp;wal)
+                                                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>A region on which you must call <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#closeRegionAndWAL-org.apache.hadoop.hbase.regionserver.HRegion-"><code>HBaseTestingUtility.closeRegionAndWAL(HRegion)</code></a>
+         when done.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestWALDurability.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" target="_top">Frames</a></li>
+<li><a href="TestWALDurability.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html
index 1783b03..88e4b09 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -329,7 +329,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/Abst
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/TestWALDurability.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/TestWALDurability.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/TestWALDurability.html
new file mode 100644
index 0000000..43487bc
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/class-use/TestWALDurability.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.regionserver.wal.TestWALDurability (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.regionserver.wal.TestWALDurability (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/regionserver/wal/class-use/TestWALDurability.html" target="_top">Frames</a></li>
+<li><a href="TestWALDurability.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.regionserver.wal.TestWALDurability" class="title">Uses of Class<br>org.apache.hadoop.hbase.regionserver.wal.TestWALDurability</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.regionserver.wal.TestWALDurability</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/regionserver/wal/class-use/TestWALDurability.html" target="_top">Frames</a></li>
+<li><a href="TestWALDurability.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-frame.html
index 2114a3c..f04570e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-frame.html
@@ -52,6 +52,7 @@
 <li><a href="TestWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALActionsListener</a></li>
 <li><a href="TestWALActionsListener.DummyWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALActionsListener.DummyWALActionsListener</a></li>
 <li><a href="TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALCellCodecWithCompression</a></li>
+<li><a href="TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALDurability</a></li>
 <li><a href="TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALReplay</a></li>
 <li><a href="TestWALReplayBoundedLogWriterCreation.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALReplayBoundedLogWriterCreation</a></li>
 <li><a href="TestWALReplayCompressed.html" title="class in org.apache.hadoop.hbase.regionserver.wal" target="classFrame">TestWALReplayCompressed</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-summary.html
index c8f943a..accfd3d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-summary.html
@@ -270,14 +270,20 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALDurability</a></td>
+<td class="colLast">
+<div class="block">Tests for WAL write durability - hflush vs hsync</div>
+</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALReplay</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALReplayBoundedLogWriterCreation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayCompressed.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestWALReplayCompressed</a></td>
 <td class="colLast">
 <div class="block">Enables compression and runs the TestWALReplay tests.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 2ece9a2..0a6cb65 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -170,6 +170,7 @@
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestWALActionsListener</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.DummyWALActionsListener.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestWALActionsListener.DummyWALActionsListener</span></a> (implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener)</li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestWALCellCodecWithCompression</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestWALDurability</span></a></li>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Thread</span></a> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.Appender.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestLogRollingNoCluster.Appender</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html
index 9276c44..e332c73 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html
@@ -576,7 +576,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertConnectedPeerStatus</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html#line.320">assertConnectedPeerStatus</a>(boolean&nbsp;status,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html#line.321">assertConnectedPeerStatus</a>(boolean&nbsp;status,
                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;peerId)
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
@@ -591,7 +591,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>assertNumberOfPeers</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html#line.339">assertNumberOfPeers</a>(int&nbsp;total)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html#line.340">assertNumberOfPeers</a>(int&nbsp;total)
                             throws org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -605,7 +605,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>populateQueues</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html#line.347">populateQueues</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestReplicationStateBasic.html#line.348">populateQueues</a>()
                        throws org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html
index 2ddd612..6cd3d2b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":9,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.47">TestZKReplicationQueueStorage</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.48">TestZKReplicationQueueStorage</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -216,6 +216,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i10" class="altColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#testRegionsZNodeLayout--">testRegionsZNodeLayout</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#testReplicator--">testReplicator</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -246,7 +250,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.50">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.51">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="UTIL">
@@ -255,7 +259,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseZKTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.53">UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseZKTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.54">UTIL</a></pre>
 </li>
 </ul>
 <a name="STORAGE">
@@ -264,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>STORAGE</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.55">STORAGE</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage <a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.56">STORAGE</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +285,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestZKReplicationQueueStorage</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.47">TestZKReplicationQueueStorage</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.48">TestZKReplicationQueueStorage</a>()</pre>
 </li>
 </ul>
 </li>
@@ -298,7 +302,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.58">setUp</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.59">setUp</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -312,7 +316,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.64">tearDown</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.65">tearDown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -326,7 +330,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterTest</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.69">tearDownAfterTest</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.70">tearDownAfterTest</a>()
                        throws org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -340,7 +344,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.ServerName&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.81">getServerName</a>(int&nbsp;i)</pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.ServerName&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.82">getServerName</a>(int&nbsp;i)</pre>
 </li>
 </ul>
 <a name="testReplicator--">
@@ -349,7 +353,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testReplicator</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.86">testReplicator</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.87">testReplicator</a>()
                     throws org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -363,7 +367,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.110">getFileName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.111">getFileName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;base,
                            int&nbsp;i)</pre>
 </li>
 </ul>
@@ -373,7 +377,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAddRemoveLog</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.115">testAddRemoveLog</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.116">testAddRemoveLog</a>()
                       throws org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -387,7 +391,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testClaimQueueChangeCversion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.205">testClaimQueueChangeCversion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.206">testClaimQueueChangeCversion</a>()
                                   throws org.apache.hadoop.hbase.replication.ReplicationException,
                                          org.apache.zookeeper.KeeperException</pre>
 <dl>
@@ -403,7 +407,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWithUnstableCversion</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.217">createWithUnstableCversion</a>()
+<pre>private&nbsp;org.apache.hadoop.hbase.replication.ZKReplicationQueueStorage&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.218">createWithUnstableCversion</a>()
                                                                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -417,7 +421,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetAllWALsCversionChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.233">testGetAllWALsCversionChange</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.234">testGetAllWALsCversionChange</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                          org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
@@ -430,10 +434,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testGetAllHFileRefsCversionChange--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testGetAllHFileRefsCversionChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.244">testGetAllHFileRefsCversionChange</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.245">testGetAllHFileRefsCversionChange</a>()
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                               org.apache.hadoop.hbase.replication.ReplicationException</pre>
 <dl>
@@ -443,6 +447,20 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testRegionsZNodeLayout--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testRegionsZNodeLayout</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/replication/TestZKReplicationQueueStorage.html#line.257">testRegionsZNodeLayout</a>()
+                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 2acdb55..833e5c3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -255,8 +255,8 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/wal/FaultyFSLog.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/FaultyFSLog.html b/testdevapidocs/org/apache/hadoop/hbase/wal/FaultyFSLog.html
index b6bc206..15878ae 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/FaultyFSLog.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/FaultyFSLog.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -239,13 +239,18 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.html#sync-long-">sync</a></span>(long&nbsp;txid)</code>&nbsp;</td>
 </tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.html#sync-long-boolean-">sync</a></span>(long&nbsp;txid,
+    boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.FSHLog">
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog</h3>
-<code>afterCreatingZigZagLatch, beforeWaitOnSafePoint, createWriterInstance, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getSequenceOnRingBuffer, publishSyncOnRingBuffer, sync</code></li>
+<code>afterCreatingZigZagLatch, beforeWaitOnSafePoint, createWriterInstance, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getSequenceOnRingBuffer, publishSyncOnRingBuffer, sync, sync</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL">
@@ -344,13 +349,32 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 </dl>
 </li>
 </ul>
+<a name="sync-long-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>sync</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/FaultyFSLog.html#line.58">sync</a>(long&nbsp;txid,
+                 boolean&nbsp;forceSync)
+          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>sync</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.wal.WAL</code></dd>
+<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
+<dd><code>sync</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.regionserver.wal.FSHLog</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="append-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKeyImpl-org.apache.hadoop.hbase.wal.WALEdit-boolean-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>append</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/FaultyFSLog.html#line.61">append</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/FaultyFSLog.html#line.66">append</a>(org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
                    org.apache.hadoop.hbase.wal.WALKeyImpl&nbsp;key,
                    org.apache.hadoop.hbase.wal.WALEdit&nbsp;edits,
                    boolean&nbsp;inMemstore)

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
index 137876f..00b4818 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html
@@ -240,7 +240,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.FSHLog</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.wal.FSHLog</h3>
-<code>afterCreatingZigZagLatch, append, beforeWaitOnSafePoint, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getSequenceOnRingBuffer, publishSyncOnRingBuffer, sync, sync</code></li>
+<code>afterCreatingZigZagLatch, append, beforeWaitOnSafePoint, doAppend, doCheckLogLowReplication, doReplaceWriter, doShutdown, getSequenceOnRingBuffer, publishSyncOnRingBuffer, sync, sync, sync, sync</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
index 163e650..c2fc71f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html
@@ -221,7 +221,7 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#sync--">sync</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#sync-boolean-">sync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -363,13 +363,13 @@ extends org.apache.hadoop.hbase.regionserver.wal.ProtobufLogWriter</pre>
 </dl>
 </li>
 </ul>
-<a name="sync--">
+<a name="sync-boolean-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>sync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.269">sync</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWriter.html#line.269">sync</a>(boolean&nbsp;forceSync)
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>


[05/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html
index 0fa5a23..e31f5c6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html
@@ -148,143 +148,160 @@
 <span class="sourceLineNo">140</span>  void sync(long txid) throws IOException;<a name="line.140"></a>
 <span class="sourceLineNo">141</span><a name="line.141"></a>
 <span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * WAL keeps track of the sequence numbers that are as yet not flushed im memstores<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * in order to be able to do accounting to figure which WALs can be let go. This method tells WAL<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * that some region is about to flush. The flush can be the whole region or for a column family<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * of the region only.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   *<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * &lt;p&gt;Currently, it is expected that the update lock is held for the region; i.e. no<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * concurrent appends while we set up cache flush.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param families Families to flush. May be a subset of all families in the region.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return Returns {@link HConstants#NO_SEQNUM} if we are flushing the whole region OR if<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * we are flushing a subset of all families but there are no edits in those families not<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * being flushed; in other words, this is effectively same as a flush of all of the region<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * though we were passed a subset of regions. Otherwise, it returns the sequence id of the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * oldest/lowest outstanding edit.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @see #completeCacheFlush(byte[])<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @see #abortCacheFlush(byte[])<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  Long startCacheFlush(final byte[] encodedRegionName, Set&lt;byte[]&gt; families);<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  Long startCacheFlush(final byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Complete the cache flush.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * @param encodedRegionName Encoded region name.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @see #startCacheFlush(byte[], Set)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @see #abortCacheFlush(byte[])<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  void completeCacheFlush(final byte[] encodedRegionName);<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  /**<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * Abort a cache flush. Call if the flush fails. Note that the only recovery<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * for an aborted flush currently is a restart of the regionserver so the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * snapshot content dropped by the failure gets restored to the memstore.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param encodedRegionName Encoded region name.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void abortCacheFlush(byte[] encodedRegionName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @return Coprocessor host.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  WALCoprocessorHost getCoprocessorHost();<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  /**<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * Gets the earliest unflushed sequence id in the memstore for the region.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * @param encodedRegionName The region to get the number for.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @deprecated Since version 1.2.0. Removing because not used and exposes subtle internal<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * workings. Use {@link #getEarliestMemStoreSeqNum(byte[], byte[])}<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @VisibleForTesting<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @Deprecated<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Gets the earliest unflushed sequence id in the memstore for the store.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @param encodedRegionName The region to get the number for.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param familyName The family to get the number for.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * Human readable identifying information about the state of this WAL.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Implementors are encouraged to include information appropriate for debugging.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * Consumers are advised not to rely on the details of the returned String; it does<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * not have a defined structure.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  String toString();<a name="line.210"></a>
+<span class="sourceLineNo">143</span>   * @param forceSync Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   *          vs hsync.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  default void sync(boolean forceSync) throws IOException {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    sync();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @param txid Transaction id to sync to.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param forceSync Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *          vs hsync.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  default void sync(long txid, boolean forceSync) throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    sync(txid);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  /**<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * WAL keeps track of the sequence numbers that are as yet not flushed im memstores<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * in order to be able to do accounting to figure which WALs can be let go. This method tells WAL<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * that some region is about to flush. The flush can be the whole region or for a column family<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * of the region only.<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   *<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * &lt;p&gt;Currently, it is expected that the update lock is held for the region; i.e. no<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * concurrent appends while we set up cache flush.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param families Families to flush. May be a subset of all families in the region.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return Returns {@link HConstants#NO_SEQNUM} if we are flushing the whole region OR if<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * we are flushing a subset of all families but there are no edits in those families not<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * being flushed; in other words, this is effectively same as a flush of all of the region<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * though we were passed a subset of regions. Otherwise, it returns the sequence id of the<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * oldest/lowest outstanding edit.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * @see #completeCacheFlush(byte[])<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * @see #abortCacheFlush(byte[])<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  Long startCacheFlush(final byte[] encodedRegionName, Set&lt;byte[]&gt; families);<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  Long startCacheFlush(final byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq);<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>  /**<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * Complete the cache flush.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param encodedRegionName Encoded region name.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @see #startCacheFlush(byte[], Set)<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @see #abortCacheFlush(byte[])<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  void completeCacheFlush(final byte[] encodedRegionName);<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Abort a cache flush. Call if the flush fails. Note that the only recovery<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * for an aborted flush currently is a restart of the regionserver so the<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * snapshot content dropped by the failure gets restored to the memstore.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param encodedRegionName Encoded region name.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  void abortCacheFlush(byte[] encodedRegionName);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @return Coprocessor host.<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  WALCoprocessorHost getCoprocessorHost();<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /**<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * Gets the earliest unflushed sequence id in the memstore for the region.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param encodedRegionName The region to get the number for.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @deprecated Since version 1.2.0. Removing because not used and exposes subtle internal<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * workings. Use {@link #getEarliestMemStoreSeqNum(byte[], byte[])}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @VisibleForTesting<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  @Deprecated<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName);<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
 <span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * When outside clients need to consume persisted WALs, they rely on a provided<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * Reader.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  interface Reader extends Closeable {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Entry next() throws IOException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Entry next(Entry reuse) throws IOException;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    void seek(long pos) throws IOException;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    long getPosition() throws IOException;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    void reset() throws IOException;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * Utility class that lets us keep track of the edit with it's key.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  class Entry {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    private final WALEdit edit;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private final WALKeyImpl key;<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public Entry() {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      this(new WALKeyImpl(), new WALEdit());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>    /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>     * Constructor for both params<a name="line.236"></a>
-<span class="sourceLineNo">237</span>     *<a name="line.237"></a>
-<span class="sourceLineNo">238</span>     * @param edit log's edit<a name="line.238"></a>
-<span class="sourceLineNo">239</span>     * @param key log's key<a name="line.239"></a>
-<span class="sourceLineNo">240</span>     */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    public Entry(WALKeyImpl key, WALEdit edit) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      this.key = key;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      this.edit = edit;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    /**<a name="line.246"></a>
-<span class="sourceLineNo">247</span>     * Gets the edit<a name="line.247"></a>
-<span class="sourceLineNo">248</span>     *<a name="line.248"></a>
-<span class="sourceLineNo">249</span>     * @return edit<a name="line.249"></a>
-<span class="sourceLineNo">250</span>     */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    public WALEdit getEdit() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      return edit;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * Gets the key<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     *<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     * @return key<a name="line.258"></a>
-<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    public WALKeyImpl getKey() {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return key;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    /**<a name="line.264"></a>
-<span class="sourceLineNo">265</span>     * Set compression context for this entry.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     *<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * @param compressionContext<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     *          Compression context<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public void setCompressionContext(CompressionContext compressionContext) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      key.setCompressionContext(compressionContext);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    public String toString() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      return this.key + "=" + this.edit;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>}<a name="line.279"></a>
+<span class="sourceLineNo">213</span>   * Gets the earliest unflushed sequence id in the memstore for the store.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param encodedRegionName The region to get the number for.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param familyName The family to get the number for.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Human readable identifying information about the state of this WAL.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * Implementors are encouraged to include information appropriate for debugging.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Consumers are advised not to rely on the details of the returned String; it does<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * not have a defined structure.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  String toString();<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * When outside clients need to consume persisted WALs, they rely on a provided<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * Reader.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  interface Reader extends Closeable {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    Entry next() throws IOException;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    Entry next(Entry reuse) throws IOException;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    void seek(long pos) throws IOException;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    long getPosition() throws IOException;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    void reset() throws IOException;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Utility class that lets us keep track of the edit with it's key.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   */<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  class Entry {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    private final WALEdit edit;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    private final WALKeyImpl key;<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public Entry() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      this(new WALKeyImpl(), new WALEdit());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>    /**<a name="line.252"></a>
+<span class="sourceLineNo">253</span>     * Constructor for both params<a name="line.253"></a>
+<span class="sourceLineNo">254</span>     *<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * @param edit log's edit<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param key log's key<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    public Entry(WALKeyImpl key, WALEdit edit) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      this.key = key;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      this.edit = edit;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>    /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>     * Gets the edit<a name="line.264"></a>
+<span class="sourceLineNo">265</span>     *<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * @return edit<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    public WALEdit getEdit() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      return edit;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>     * Gets the key<a name="line.273"></a>
+<span class="sourceLineNo">274</span>     *<a name="line.274"></a>
+<span class="sourceLineNo">275</span>     * @return key<a name="line.275"></a>
+<span class="sourceLineNo">276</span>     */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    public WALKeyImpl getKey() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      return key;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>    /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>     * Set compression context for this entry.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>     *<a name="line.283"></a>
+<span class="sourceLineNo">284</span>     * @param compressionContext<a name="line.284"></a>
+<span class="sourceLineNo">285</span>     *          Compression context<a name="line.285"></a>
+<span class="sourceLineNo">286</span>     */<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    public void setCompressionContext(CompressionContext compressionContext) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      key.setCompressionContext(compressionContext);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    public String toString() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      return this.key + "=" + this.edit;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html
index 0fa5a23..e31f5c6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html
@@ -148,143 +148,160 @@
 <span class="sourceLineNo">140</span>  void sync(long txid) throws IOException;<a name="line.140"></a>
 <span class="sourceLineNo">141</span><a name="line.141"></a>
 <span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * WAL keeps track of the sequence numbers that are as yet not flushed im memstores<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * in order to be able to do accounting to figure which WALs can be let go. This method tells WAL<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * that some region is about to flush. The flush can be the whole region or for a column family<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * of the region only.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   *<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * &lt;p&gt;Currently, it is expected that the update lock is held for the region; i.e. no<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * concurrent appends while we set up cache flush.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param families Families to flush. May be a subset of all families in the region.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return Returns {@link HConstants#NO_SEQNUM} if we are flushing the whole region OR if<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * we are flushing a subset of all families but there are no edits in those families not<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * being flushed; in other words, this is effectively same as a flush of all of the region<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * though we were passed a subset of regions. Otherwise, it returns the sequence id of the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * oldest/lowest outstanding edit.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @see #completeCacheFlush(byte[])<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @see #abortCacheFlush(byte[])<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  Long startCacheFlush(final byte[] encodedRegionName, Set&lt;byte[]&gt; families);<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  Long startCacheFlush(final byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Complete the cache flush.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * @param encodedRegionName Encoded region name.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @see #startCacheFlush(byte[], Set)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @see #abortCacheFlush(byte[])<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  void completeCacheFlush(final byte[] encodedRegionName);<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  /**<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * Abort a cache flush. Call if the flush fails. Note that the only recovery<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * for an aborted flush currently is a restart of the regionserver so the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * snapshot content dropped by the failure gets restored to the memstore.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param encodedRegionName Encoded region name.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void abortCacheFlush(byte[] encodedRegionName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @return Coprocessor host.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  WALCoprocessorHost getCoprocessorHost();<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  /**<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * Gets the earliest unflushed sequence id in the memstore for the region.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * @param encodedRegionName The region to get the number for.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @deprecated Since version 1.2.0. Removing because not used and exposes subtle internal<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * workings. Use {@link #getEarliestMemStoreSeqNum(byte[], byte[])}<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @VisibleForTesting<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @Deprecated<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Gets the earliest unflushed sequence id in the memstore for the store.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @param encodedRegionName The region to get the number for.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param familyName The family to get the number for.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * Human readable identifying information about the state of this WAL.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Implementors are encouraged to include information appropriate for debugging.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * Consumers are advised not to rely on the details of the returned String; it does<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * not have a defined structure.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  String toString();<a name="line.210"></a>
+<span class="sourceLineNo">143</span>   * @param forceSync Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   *          vs hsync.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  default void sync(boolean forceSync) throws IOException {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    sync();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @param txid Transaction id to sync to.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param forceSync Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *          vs hsync.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  default void sync(long txid, boolean forceSync) throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    sync(txid);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  /**<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * WAL keeps track of the sequence numbers that are as yet not flushed im memstores<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * in order to be able to do accounting to figure which WALs can be let go. This method tells WAL<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * that some region is about to flush. The flush can be the whole region or for a column family<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * of the region only.<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   *<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * &lt;p&gt;Currently, it is expected that the update lock is held for the region; i.e. no<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * concurrent appends while we set up cache flush.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param families Families to flush. May be a subset of all families in the region.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return Returns {@link HConstants#NO_SEQNUM} if we are flushing the whole region OR if<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * we are flushing a subset of all families but there are no edits in those families not<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * being flushed; in other words, this is effectively same as a flush of all of the region<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * though we were passed a subset of regions. Otherwise, it returns the sequence id of the<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * oldest/lowest outstanding edit.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * @see #completeCacheFlush(byte[])<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * @see #abortCacheFlush(byte[])<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  Long startCacheFlush(final byte[] encodedRegionName, Set&lt;byte[]&gt; families);<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  Long startCacheFlush(final byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq);<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>  /**<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * Complete the cache flush.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param encodedRegionName Encoded region name.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @see #startCacheFlush(byte[], Set)<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @see #abortCacheFlush(byte[])<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  void completeCacheFlush(final byte[] encodedRegionName);<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Abort a cache flush. Call if the flush fails. Note that the only recovery<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * for an aborted flush currently is a restart of the regionserver so the<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * snapshot content dropped by the failure gets restored to the memstore.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param encodedRegionName Encoded region name.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  void abortCacheFlush(byte[] encodedRegionName);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @return Coprocessor host.<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  WALCoprocessorHost getCoprocessorHost();<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /**<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * Gets the earliest unflushed sequence id in the memstore for the region.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param encodedRegionName The region to get the number for.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @deprecated Since version 1.2.0. Removing because not used and exposes subtle internal<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * workings. Use {@link #getEarliestMemStoreSeqNum(byte[], byte[])}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @VisibleForTesting<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  @Deprecated<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName);<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
 <span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * When outside clients need to consume persisted WALs, they rely on a provided<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * Reader.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  interface Reader extends Closeable {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Entry next() throws IOException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Entry next(Entry reuse) throws IOException;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    void seek(long pos) throws IOException;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    long getPosition() throws IOException;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    void reset() throws IOException;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * Utility class that lets us keep track of the edit with it's key.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  class Entry {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    private final WALEdit edit;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private final WALKeyImpl key;<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public Entry() {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      this(new WALKeyImpl(), new WALEdit());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>    /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>     * Constructor for both params<a name="line.236"></a>
-<span class="sourceLineNo">237</span>     *<a name="line.237"></a>
-<span class="sourceLineNo">238</span>     * @param edit log's edit<a name="line.238"></a>
-<span class="sourceLineNo">239</span>     * @param key log's key<a name="line.239"></a>
-<span class="sourceLineNo">240</span>     */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    public Entry(WALKeyImpl key, WALEdit edit) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      this.key = key;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      this.edit = edit;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    /**<a name="line.246"></a>
-<span class="sourceLineNo">247</span>     * Gets the edit<a name="line.247"></a>
-<span class="sourceLineNo">248</span>     *<a name="line.248"></a>
-<span class="sourceLineNo">249</span>     * @return edit<a name="line.249"></a>
-<span class="sourceLineNo">250</span>     */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    public WALEdit getEdit() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      return edit;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * Gets the key<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     *<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     * @return key<a name="line.258"></a>
-<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    public WALKeyImpl getKey() {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return key;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    /**<a name="line.264"></a>
-<span class="sourceLineNo">265</span>     * Set compression context for this entry.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     *<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * @param compressionContext<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     *          Compression context<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public void setCompressionContext(CompressionContext compressionContext) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      key.setCompressionContext(compressionContext);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    public String toString() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      return this.key + "=" + this.edit;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>}<a name="line.279"></a>
+<span class="sourceLineNo">213</span>   * Gets the earliest unflushed sequence id in the memstore for the store.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param encodedRegionName The region to get the number for.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param familyName The family to get the number for.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Human readable identifying information about the state of this WAL.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * Implementors are encouraged to include information appropriate for debugging.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Consumers are advised not to rely on the details of the returned String; it does<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * not have a defined structure.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  String toString();<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * When outside clients need to consume persisted WALs, they rely on a provided<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * Reader.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  interface Reader extends Closeable {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    Entry next() throws IOException;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    Entry next(Entry reuse) throws IOException;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    void seek(long pos) throws IOException;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    long getPosition() throws IOException;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    void reset() throws IOException;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Utility class that lets us keep track of the edit with it's key.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   */<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  class Entry {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    private final WALEdit edit;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    private final WALKeyImpl key;<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public Entry() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      this(new WALKeyImpl(), new WALEdit());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>    /**<a name="line.252"></a>
+<span class="sourceLineNo">253</span>     * Constructor for both params<a name="line.253"></a>
+<span class="sourceLineNo">254</span>     *<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * @param edit log's edit<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param key log's key<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    public Entry(WALKeyImpl key, WALEdit edit) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      this.key = key;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      this.edit = edit;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>    /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>     * Gets the edit<a name="line.264"></a>
+<span class="sourceLineNo">265</span>     *<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * @return edit<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    public WALEdit getEdit() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      return edit;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>     * Gets the key<a name="line.273"></a>
+<span class="sourceLineNo">274</span>     *<a name="line.274"></a>
+<span class="sourceLineNo">275</span>     * @return key<a name="line.275"></a>
+<span class="sourceLineNo">276</span>     */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    public WALKeyImpl getKey() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      return key;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>    /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>     * Set compression context for this entry.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>     *<a name="line.283"></a>
+<span class="sourceLineNo">284</span>     * @param compressionContext<a name="line.284"></a>
+<span class="sourceLineNo">285</span>     *          Compression context<a name="line.285"></a>
+<span class="sourceLineNo">286</span>     */<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    public void setCompressionContext(CompressionContext compressionContext) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      key.setCompressionContext(compressionContext);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    public String toString() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      return this.key + "=" + this.edit;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.html
index 0fa5a23..e31f5c6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WAL.html
@@ -148,143 +148,160 @@
 <span class="sourceLineNo">140</span>  void sync(long txid) throws IOException;<a name="line.140"></a>
 <span class="sourceLineNo">141</span><a name="line.141"></a>
 <span class="sourceLineNo">142</span>  /**<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   * WAL keeps track of the sequence numbers that are as yet not flushed im memstores<a name="line.143"></a>
-<span class="sourceLineNo">144</span>   * in order to be able to do accounting to figure which WALs can be let go. This method tells WAL<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   * that some region is about to flush. The flush can be the whole region or for a column family<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * of the region only.<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   *<a name="line.147"></a>
-<span class="sourceLineNo">148</span>   * &lt;p&gt;Currently, it is expected that the update lock is held for the region; i.e. no<a name="line.148"></a>
-<span class="sourceLineNo">149</span>   * concurrent appends while we set up cache flush.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * @param families Families to flush. May be a subset of all families in the region.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return Returns {@link HConstants#NO_SEQNUM} if we are flushing the whole region OR if<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * we are flushing a subset of all families but there are no edits in those families not<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * being flushed; in other words, this is effectively same as a flush of all of the region<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * though we were passed a subset of regions. Otherwise, it returns the sequence id of the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * oldest/lowest outstanding edit.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @see #completeCacheFlush(byte[])<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * @see #abortCacheFlush(byte[])<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  Long startCacheFlush(final byte[] encodedRegionName, Set&lt;byte[]&gt; families);<a name="line.159"></a>
-<span class="sourceLineNo">160</span><a name="line.160"></a>
-<span class="sourceLineNo">161</span>  Long startCacheFlush(final byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq);<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * Complete the cache flush.<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * @param encodedRegionName Encoded region name.<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @see #startCacheFlush(byte[], Set)<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @see #abortCacheFlush(byte[])<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   */<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  void completeCacheFlush(final byte[] encodedRegionName);<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>  /**<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * Abort a cache flush. Call if the flush fails. Note that the only recovery<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   * for an aborted flush currently is a restart of the regionserver so the<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * snapshot content dropped by the failure gets restored to the memstore.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param encodedRegionName Encoded region name.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void abortCacheFlush(byte[] encodedRegionName);<a name="line.177"></a>
-<span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>  /**<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @return Coprocessor host.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  WALCoprocessorHost getCoprocessorHost();<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  /**<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * Gets the earliest unflushed sequence id in the memstore for the region.<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * @param encodedRegionName The region to get the number for.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * @deprecated Since version 1.2.0. Removing because not used and exposes subtle internal<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * workings. Use {@link #getEarliestMemStoreSeqNum(byte[], byte[])}<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  @VisibleForTesting<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  @Deprecated<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName);<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Gets the earliest unflushed sequence id in the memstore for the store.<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @param encodedRegionName The region to get the number for.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param familyName The family to get the number for.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * Human readable identifying information about the state of this WAL.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Implementors are encouraged to include information appropriate for debugging.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * Consumers are advised not to rely on the details of the returned String; it does<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * not have a defined structure.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  @Override<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  String toString();<a name="line.210"></a>
+<span class="sourceLineNo">143</span>   * @param forceSync Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   *          vs hsync.<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  default void sync(boolean forceSync) throws IOException {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    sync();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  }<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
+<span class="sourceLineNo">151</span>   * @param txid Transaction id to sync to.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param forceSync Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   *          vs hsync.<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   */<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  default void sync(long txid, boolean forceSync) throws IOException {<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    sync(txid);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  /**<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * WAL keeps track of the sequence numbers that are as yet not flushed im memstores<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * in order to be able to do accounting to figure which WALs can be let go. This method tells WAL<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * that some region is about to flush. The flush can be the whole region or for a column family<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   * of the region only.<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   *<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   * &lt;p&gt;Currently, it is expected that the update lock is held for the region; i.e. no<a name="line.165"></a>
+<span class="sourceLineNo">166</span>   * concurrent appends while we set up cache flush.<a name="line.166"></a>
+<span class="sourceLineNo">167</span>   * @param families Families to flush. May be a subset of all families in the region.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return Returns {@link HConstants#NO_SEQNUM} if we are flushing the whole region OR if<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * we are flushing a subset of all families but there are no edits in those families not<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * being flushed; in other words, this is effectively same as a flush of all of the region<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * though we were passed a subset of regions. Otherwise, it returns the sequence id of the<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * oldest/lowest outstanding edit.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * @see #completeCacheFlush(byte[])<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * @see #abortCacheFlush(byte[])<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  Long startCacheFlush(final byte[] encodedRegionName, Set&lt;byte[]&gt; families);<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  Long startCacheFlush(final byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq);<a name="line.178"></a>
+<span class="sourceLineNo">179</span><a name="line.179"></a>
+<span class="sourceLineNo">180</span>  /**<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * Complete the cache flush.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param encodedRegionName Encoded region name.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @see #startCacheFlush(byte[], Set)<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @see #abortCacheFlush(byte[])<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  void completeCacheFlush(final byte[] encodedRegionName);<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * Abort a cache flush. Call if the flush fails. Note that the only recovery<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * for an aborted flush currently is a restart of the regionserver so the<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * snapshot content dropped by the failure gets restored to the memstore.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param encodedRegionName Encoded region name.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  void abortCacheFlush(byte[] encodedRegionName);<a name="line.194"></a>
+<span class="sourceLineNo">195</span><a name="line.195"></a>
+<span class="sourceLineNo">196</span>  /**<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @return Coprocessor host.<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  WALCoprocessorHost getCoprocessorHost();<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /**<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * Gets the earliest unflushed sequence id in the memstore for the region.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param encodedRegionName The region to get the number for.<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @deprecated Since version 1.2.0. Removing because not used and exposes subtle internal<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   * workings. Use {@link #getEarliestMemStoreSeqNum(byte[], byte[])}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  @VisibleForTesting<a name="line.208"></a>
+<span class="sourceLineNo">209</span>  @Deprecated<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName);<a name="line.210"></a>
 <span class="sourceLineNo">211</span><a name="line.211"></a>
 <span class="sourceLineNo">212</span>  /**<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * When outside clients need to consume persisted WALs, they rely on a provided<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * Reader.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  interface Reader extends Closeable {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    Entry next() throws IOException;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    Entry next(Entry reuse) throws IOException;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    void seek(long pos) throws IOException;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    long getPosition() throws IOException;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    void reset() throws IOException;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * Utility class that lets us keep track of the edit with it's key.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
-<span class="sourceLineNo">227</span>  class Entry {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    private final WALEdit edit;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    private final WALKeyImpl key;<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    public Entry() {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      this(new WALKeyImpl(), new WALEdit());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>    /**<a name="line.235"></a>
-<span class="sourceLineNo">236</span>     * Constructor for both params<a name="line.236"></a>
-<span class="sourceLineNo">237</span>     *<a name="line.237"></a>
-<span class="sourceLineNo">238</span>     * @param edit log's edit<a name="line.238"></a>
-<span class="sourceLineNo">239</span>     * @param key log's key<a name="line.239"></a>
-<span class="sourceLineNo">240</span>     */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    public Entry(WALKeyImpl key, WALEdit edit) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      this.key = key;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      this.edit = edit;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>    /**<a name="line.246"></a>
-<span class="sourceLineNo">247</span>     * Gets the edit<a name="line.247"></a>
-<span class="sourceLineNo">248</span>     *<a name="line.248"></a>
-<span class="sourceLineNo">249</span>     * @return edit<a name="line.249"></a>
-<span class="sourceLineNo">250</span>     */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    public WALEdit getEdit() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      return edit;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * Gets the key<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     *<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     * @return key<a name="line.258"></a>
-<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    public WALKeyImpl getKey() {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      return key;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>    /**<a name="line.264"></a>
-<span class="sourceLineNo">265</span>     * Set compression context for this entry.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     *<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * @param compressionContext<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     *          Compression context<a name="line.268"></a>
-<span class="sourceLineNo">269</span>     */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public void setCompressionContext(CompressionContext compressionContext) {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      key.setCompressionContext(compressionContext);<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>    @Override<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    public String toString() {<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      return this.key + "=" + this.edit;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    }<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>}<a name="line.279"></a>
+<span class="sourceLineNo">213</span>   * Gets the earliest unflushed sequence id in the memstore for the store.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @param encodedRegionName The region to get the number for.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @param familyName The family to get the number for.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * @return The earliest/lowest/oldest sequence id if present, HConstants.NO_SEQNUM if absent.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   */<a name="line.217"></a>
+<span class="sourceLineNo">218</span>  long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
+<span class="sourceLineNo">221</span>   * Human readable identifying information about the state of this WAL.<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * Implementors are encouraged to include information appropriate for debugging.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Consumers are advised not to rely on the details of the returned String; it does<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * not have a defined structure.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   */<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  @Override<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  String toString();<a name="line.227"></a>
+<span class="sourceLineNo">228</span><a name="line.228"></a>
+<span class="sourceLineNo">229</span>  /**<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   * When outside clients need to consume persisted WALs, they rely on a provided<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * Reader.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   */<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  interface Reader extends Closeable {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    Entry next() throws IOException;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    Entry next(Entry reuse) throws IOException;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    void seek(long pos) throws IOException;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    long getPosition() throws IOException;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    void reset() throws IOException;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>  /**<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Utility class that lets us keep track of the edit with it's key.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   */<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  class Entry {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    private final WALEdit edit;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    private final WALKeyImpl key;<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>    public Entry() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      this(new WALKeyImpl(), new WALEdit());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>    /**<a name="line.252"></a>
+<span class="sourceLineNo">253</span>     * Constructor for both params<a name="line.253"></a>
+<span class="sourceLineNo">254</span>     *<a name="line.254"></a>
+<span class="sourceLineNo">255</span>     * @param edit log's edit<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * @param key log's key<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     */<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    public Entry(WALKeyImpl key, WALEdit edit) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      this.key = key;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      this.edit = edit;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>    /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>     * Gets the edit<a name="line.264"></a>
+<span class="sourceLineNo">265</span>     *<a name="line.265"></a>
+<span class="sourceLineNo">266</span>     * @return edit<a name="line.266"></a>
+<span class="sourceLineNo">267</span>     */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    public WALEdit getEdit() {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      return edit;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>    /**<a name="line.272"></a>
+<span class="sourceLineNo">273</span>     * Gets the key<a name="line.273"></a>
+<span class="sourceLineNo">274</span>     *<a name="line.274"></a>
+<span class="sourceLineNo">275</span>     * @return key<a name="line.275"></a>
+<span class="sourceLineNo">276</span>     */<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    public WALKeyImpl getKey() {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      return key;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
+<span class="sourceLineNo">280</span><a name="line.280"></a>
+<span class="sourceLineNo">281</span>    /**<a name="line.281"></a>
+<span class="sourceLineNo">282</span>     * Set compression context for this entry.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>     *<a name="line.283"></a>
+<span class="sourceLineNo">284</span>     * @param compressionContext<a name="line.284"></a>
+<span class="sourceLineNo">285</span>     *          Compression context<a name="line.285"></a>
+<span class="sourceLineNo">286</span>     */<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    public void setCompressionContext(CompressionContext compressionContext) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      key.setCompressionContext(compressionContext);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    @Override<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    public String toString() {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>      return this.key + "=" + this.edit;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    }<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  }<a name="line.295"></a>
+<span class="sourceLineNo">296</span>}<a name="line.296"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html
index 4a4e386..6959ba69 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.AsyncWriter.html
@@ -87,7 +87,7 @@
 <span class="sourceLineNo">079</span>  // Writers are used internally. Users outside of the WAL should be relying on the<a name="line.79"></a>
 <span class="sourceLineNo">080</span>  // interface provided by WAL.<a name="line.80"></a>
 <span class="sourceLineNo">081</span>  interface Writer extends WriterBase {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    void sync() throws IOException;<a name="line.82"></a>
+<span class="sourceLineNo">082</span>    void sync(boolean forceSync) throws IOException;<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>    void append(WAL.Entry entry) throws IOException;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>  }<a name="line.85"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
index 4a4e386..6959ba69 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
@@ -87,7 +87,7 @@
 <span class="sourceLineNo">079</span>  // Writers are used internally. Users outside of the WAL should be relying on the<a name="line.79"></a>
 <span class="sourceLineNo">080</span>  // interface provided by WAL.<a name="line.80"></a>
 <span class="sourceLineNo">081</span>  interface Writer extends WriterBase {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    void sync() throws IOException;<a name="line.82"></a>
+<span class="sourceLineNo">082</span>    void sync(boolean forceSync) throws IOException;<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>    void append(WAL.Entry entry) throws IOException;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>  }<a name="line.85"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.WriterBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.WriterBase.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.WriterBase.html
index 4a4e386..6959ba69 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.WriterBase.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.WriterBase.html
@@ -87,7 +87,7 @@
 <span class="sourceLineNo">079</span>  // Writers are used internally. Users outside of the WAL should be relying on the<a name="line.79"></a>
 <span class="sourceLineNo">080</span>  // interface provided by WAL.<a name="line.80"></a>
 <span class="sourceLineNo">081</span>  interface Writer extends WriterBase {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    void sync() throws IOException;<a name="line.82"></a>
+<span class="sourceLineNo">082</span>    void sync(boolean forceSync) throws IOException;<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>    void append(WAL.Entry entry) throws IOException;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>  }<a name="line.85"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.html
index 4a4e386..6959ba69 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALProvider.html
@@ -87,7 +87,7 @@
 <span class="sourceLineNo">079</span>  // Writers are used internally. Users outside of the WAL should be relying on the<a name="line.79"></a>
 <span class="sourceLineNo">080</span>  // interface provided by WAL.<a name="line.80"></a>
 <span class="sourceLineNo">081</span>  interface Writer extends WriterBase {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    void sync() throws IOException;<a name="line.82"></a>
+<span class="sourceLineNo">082</span>    void sync(boolean forceSync) throws IOException;<a name="line.82"></a>
 <span class="sourceLineNo">083</span><a name="line.83"></a>
 <span class="sourceLineNo">084</span>    void append(WAL.Entry entry) throws IOException;<a name="line.84"></a>
 <span class="sourceLineNo">085</span>  }<a name="line.85"></a>


[31/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>

<TRUNCATED>

[38/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
index 6a77cc8..7654a0e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
@@ -82,250 +82,251 @@
 <span class="sourceLineNo">074</span>   */<a name="line.74"></a>
 <span class="sourceLineNo">075</span>  private int previousState;<a name="line.75"></a>
 <span class="sourceLineNo">076</span><a name="line.76"></a>
-<span class="sourceLineNo">077</span>  protected enum Flow {<a name="line.77"></a>
-<span class="sourceLineNo">078</span>    HAS_MORE_STATE,<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    NO_MORE_STATE,<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * called to perform a single step of the specified 'state' of the procedure<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * @param state state to execute<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * @return Flow.NO_MORE_STATE if the procedure is completed,<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   *         Flow.HAS_MORE_STATE if there is another step.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  protected abstract Flow executeFromState(TEnvironment env, TState state)<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException;<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  /**<a name="line.91"></a>
-<span class="sourceLineNo">092</span>   * called to perform the rollback of the specified state<a name="line.92"></a>
-<span class="sourceLineNo">093</span>   * @param state state to rollback<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * @throws IOException temporary failure, the rollback will retry later<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  protected abstract void rollbackState(TEnvironment env, TState state)<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    throws IOException, InterruptedException;<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   * Convert an ordinal (or state id) to an Enum (or more descriptive) state object.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * @return the state enum object<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  protected abstract TState getState(int stateId);<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * Convert the Enum (or more descriptive) state object to an ordinal (or state id).<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * @param state the state enum object<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @return stateId the ordinal() of the state enum (or state id)<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   */<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  protected abstract int getStateId(TState state);<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  /**<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * Return the initial state object that will be used for the first call to executeFromState().<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @return the initial state enum object<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  protected abstract TState getInitialState();<a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Set the next state for the procedure.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param state the state enum object<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  protected void setNextState(final TState state) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    setNextState(getStateId(state));<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    failIfAborted();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  /**<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   * By default, the executor will try ro run all the steps of the procedure start to finish.<a name="line.129"></a>
-<span class="sourceLineNo">130</span>   * Return true to make the executor yield between execution steps to<a name="line.130"></a>
-<span class="sourceLineNo">131</span>   * give other procedures time to run their steps.<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param state the state we are going to execute next.<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @return Return true if the executor should yield before the execution of the specified step.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   *         Defaults to return false.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  protected boolean isYieldBeforeExecuteFromState(TEnvironment env, TState state) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    return false;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  }<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  /**<a name="line.140"></a>
-<span class="sourceLineNo">141</span>   * Add a child procedure to execute<a name="line.141"></a>
-<span class="sourceLineNo">142</span>   * @param subProcedure the child procedure<a name="line.142"></a>
-<span class="sourceLineNo">143</span>   */<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  protected void addChildProcedure(Procedure&lt;TEnvironment&gt;... subProcedure) {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (subProcedure == null) return;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    final int len = subProcedure.length;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    if (len == 0) return;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (subProcList == null) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      subProcList = new ArrayList&lt;&gt;(len);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    }<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    for (int i = 0; i &lt; len; ++i) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      Procedure&lt;TEnvironment&gt; proc = subProcedure[i];<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      if (!proc.hasOwner()) proc.setOwner(getOwner());<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      subProcList.add(proc);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
-<span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  @Override<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  protected Procedure[] execute(final TEnvironment env)<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    updateTimestamp();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    try {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      failIfAborted();<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>      if (!hasMoreState() || isFailed()) return null;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      TState state = getCurrentState();<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      if (stateCount == 0) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        setNextState(getStateId(state));<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      }<a name="line.169"></a>
-<span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>      if (LOG.isTraceEnabled()) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>        LOG.trace(state  + " " + this + "; cycles=" + this.cycles);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      // Keep running count of cycles<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      if (getStateId(state) != this.previousState) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>        this.previousState = getStateId(state);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>        this.cycles = 0;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      } else {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>        this.cycles++;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      }<a name="line.180"></a>
-<span class="sourceLineNo">181</span><a name="line.181"></a>
-<span class="sourceLineNo">182</span>      LOG.trace("{}", toString());<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      stateFlow = executeFromState(env, state);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      if (!hasMoreState()) setNextState(EOF_STATE);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      if (subProcList != null &amp;&amp; !subProcList.isEmpty()) {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        Procedure[] subProcedures = subProcList.toArray(new Procedure[subProcList.size()]);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        subProcList = null;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        return subProcedures;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      }<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      return (isWaiting() || isFailed() || !hasMoreState()) ? null : new Procedure[] {this};<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    } finally {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      updateTimestamp();<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  @Override<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  protected void rollback(final TEnvironment env)<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      throws IOException, InterruptedException {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    if (isEofState()) stateCount--;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    try {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      updateTimestamp();<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      rollbackState(env, getCurrentState());<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      stateCount--;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    } finally {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      updateTimestamp();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    }<a name="line.206"></a>
-<span class="sourceLineNo">207</span>  }<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>  private boolean isEofState() {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    return stateCount &gt; 0 &amp;&amp; states[stateCount-1] == EOF_STATE;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
-<span class="sourceLineNo">214</span>  protected boolean abort(final TEnvironment env) {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    LOG.debug("Abort requested for {}", this);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    if (hasMoreState()) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      aborted.set(true);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    LOG.debug("Ignoring abort request on {}", this);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    return false;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * If procedure has more states then abort it otherwise procedure is finished and abort can be<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * ignored.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   */<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  protected final void failIfAborted() {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    if (aborted.get()) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      if (hasMoreState()) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        setAbortFailure(getClass().getSimpleName(), "abort requested");<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        LOG.warn("Ignoring abort request on state='" + getCurrentState() + "' for " + this);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Used by the default implementation of abort() to know if the current state can be aborted<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * and rollback can be triggered.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  protected boolean isRollbackSupported(final TState state) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    return false;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @Override<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  protected boolean isYieldAfterExecutionStep(final TEnvironment env) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    return isYieldBeforeExecuteFromState(env, getCurrentState());<a name="line.248"></a>
-<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>  private boolean hasMoreState() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    return stateFlow != Flow.NO_MORE_STATE;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  protected TState getCurrentState() {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return stateCount &gt; 0 ? getState(states[stateCount-1]) : getInitialState();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * This method is used from test code as it cannot be assumed that state transition will happen<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * sequentially. Some procedures may skip steps/ states, some may add intermediate steps in<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * future.<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @VisibleForTesting<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public int getCurrentStateId() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    return getStateId(getCurrentState());<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  }<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>  /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   * Set the next state for the procedure.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
-<span class="sourceLineNo">273</span>  private void setNextState(final int stateId) {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (states == null || states.length == stateCount) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      int newCapacity = stateCount + 8;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (states != null) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        states = Arrays.copyOf(states, newCapacity);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      } else {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        states = new int[newCapacity];<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      }<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    states[stateCount++] = stateId;<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  protected void toStringState(StringBuilder builder) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    super.toStringState(builder);<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    if (!isFinished() &amp;&amp; !isEofState() &amp;&amp; getCurrentState() != null) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      builder.append(":").append(getCurrentState());<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Override<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      throws IOException {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    StateMachineProcedureData.Builder data = StateMachineProcedureData.newBuilder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    for (int i = 0; i &lt; stateCount; ++i) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>      data.addState(states[i]);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    serializer.serialize(data.build());<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      throws IOException {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    StateMachineProcedureData data = serializer.deserialize(StateMachineProcedureData.class);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    stateCount = data.getStateCount();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    if (stateCount &gt; 0) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      states = new int[stateCount];<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      for (int i = 0; i &lt; stateCount; ++i) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>        states[i] = data.getState(i);<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      }<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      if (isEofState()) {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        stateFlow = Flow.NO_MORE_STATE;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      }<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    } else {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      states = null;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
-<span class="sourceLineNo">320</span>}<a name="line.320"></a>
+<span class="sourceLineNo">077</span>  @VisibleForTesting<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public enum Flow {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    HAS_MORE_STATE,<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    NO_MORE_STATE,<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  /**<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * called to perform a single step of the specified 'state' of the procedure<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * @param state state to execute<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   * @return Flow.NO_MORE_STATE if the procedure is completed,<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   *         Flow.HAS_MORE_STATE if there is another step.<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   */<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  protected abstract Flow executeFromState(TEnvironment env, TState state)<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * called to perform the rollback of the specified state<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * @param state state to rollback<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * @throws IOException temporary failure, the rollback will retry later<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   */<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  protected abstract void rollbackState(TEnvironment env, TState state)<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    throws IOException, InterruptedException;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  /**<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * Convert an ordinal (or state id) to an Enum (or more descriptive) state object.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * @return the state enum object<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  protected abstract TState getState(int stateId);<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  /**<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * Convert the Enum (or more descriptive) state object to an ordinal (or state id).<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * @param state the state enum object<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * @return stateId the ordinal() of the state enum (or state id)<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  protected abstract int getStateId(TState state);<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * Return the initial state object that will be used for the first call to executeFromState().<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * @return the initial state enum object<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  protected abstract TState getInitialState();<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  /**<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Set the next state for the procedure.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param state the state enum object<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  protected void setNextState(final TState state) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    setNextState(getStateId(state));<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    failIfAborted();<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span><a name="line.128"></a>
+<span class="sourceLineNo">129</span>  /**<a name="line.129"></a>
+<span class="sourceLineNo">130</span>   * By default, the executor will try ro run all the steps of the procedure start to finish.<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   * Return true to make the executor yield between execution steps to<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * give other procedures time to run their steps.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param state the state we are going to execute next.<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   * @return Return true if the executor should yield before the execution of the specified step.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>   *         Defaults to return false.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  protected boolean isYieldBeforeExecuteFromState(TEnvironment env, TState state) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    return false;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  }<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  /**<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * Add a child procedure to execute<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   * @param subProcedure the child procedure<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   */<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  protected void addChildProcedure(Procedure&lt;TEnvironment&gt;... subProcedure) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    if (subProcedure == null) return;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    final int len = subProcedure.length;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    if (len == 0) return;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (subProcList == null) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      subProcList = new ArrayList&lt;&gt;(len);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    }<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    for (int i = 0; i &lt; len; ++i) {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      Procedure&lt;TEnvironment&gt; proc = subProcedure[i];<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      if (!proc.hasOwner()) proc.setOwner(getOwner());<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      subProcList.add(proc);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    }<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>  @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  protected Procedure[] execute(final TEnvironment env)<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  throws ProcedureSuspendedException, ProcedureYieldException, InterruptedException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    updateTimestamp();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    try {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      failIfAborted();<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>      if (!hasMoreState() || isFailed()) return null;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      TState state = getCurrentState();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      if (stateCount == 0) {<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        setNextState(getStateId(state));<a name="line.169"></a>
+<span class="sourceLineNo">170</span>      }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>      if (LOG.isTraceEnabled()) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>        LOG.trace(state  + " " + this + "; cycles=" + this.cycles);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      }<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      // Keep running count of cycles<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      if (getStateId(state) != this.previousState) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>        this.previousState = getStateId(state);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        this.cycles = 0;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      } else {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        this.cycles++;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>      LOG.trace("{}", toString());<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      stateFlow = executeFromState(env, state);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      if (!hasMoreState()) setNextState(EOF_STATE);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      if (subProcList != null &amp;&amp; !subProcList.isEmpty()) {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>        Procedure[] subProcedures = subProcList.toArray(new Procedure[subProcList.size()]);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        subProcList = null;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return subProcedures;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      return (isWaiting() || isFailed() || !hasMoreState()) ? null : new Procedure[] {this};<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } finally {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      updateTimestamp();<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  }<a name="line.195"></a>
+<span class="sourceLineNo">196</span><a name="line.196"></a>
+<span class="sourceLineNo">197</span>  @Override<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  protected void rollback(final TEnvironment env)<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      throws IOException, InterruptedException {<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    if (isEofState()) stateCount--;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    try {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      updateTimestamp();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      rollbackState(env, getCurrentState());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      stateCount--;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    } finally {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      updateTimestamp();<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    }<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>  private boolean isEofState() {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    return stateCount &gt; 0 &amp;&amp; states[stateCount-1] == EOF_STATE;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  @Override<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  protected boolean abort(final TEnvironment env) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    LOG.debug("Abort requested for {}", this);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    if (hasMoreState()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      aborted.set(true);<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return true;<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    LOG.debug("Ignoring abort request on {}", this);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    return false;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  /**<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * If procedure has more states then abort it otherwise procedure is finished and abort can be<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * ignored.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  protected final void failIfAborted() {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    if (aborted.get()) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      if (hasMoreState()) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>        setAbortFailure(getClass().getSimpleName(), "abort requested");<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      } else {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        LOG.warn("Ignoring abort request on state='" + getCurrentState() + "' for " + this);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * Used by the default implementation of abort() to know if the current state can be aborted<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * and rollback can be triggered.<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   */<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  protected boolean isRollbackSupported(final TState state) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  protected boolean isYieldAfterExecutionStep(final TEnvironment env) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    return isYieldBeforeExecuteFromState(env, getCurrentState());<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  private boolean hasMoreState() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return stateFlow != Flow.NO_MORE_STATE;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>  protected TState getCurrentState() {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    return stateCount &gt; 0 ? getState(states[stateCount-1]) : getInitialState();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span><a name="line.259"></a>
+<span class="sourceLineNo">260</span>  /**<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * This method is used from test code as it cannot be assumed that state transition will happen<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * sequentially. Some procedures may skip steps/ states, some may add intermediate steps in<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * future.<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  @VisibleForTesting<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public int getCurrentStateId() {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return getStateId(getCurrentState());<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * Set the next state for the procedure.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * @param stateId the ordinal() of the state enum (or state id)<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  private void setNextState(final int stateId) {<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    if (states == null || states.length == stateCount) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>      int newCapacity = stateCount + 8;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      if (states != null) {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        states = Arrays.copyOf(states, newCapacity);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      } else {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        states = new int[newCapacity];<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    states[stateCount++] = stateId;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<a name="line.284"></a>
+<span class="sourceLineNo">285</span><a name="line.285"></a>
+<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  protected void toStringState(StringBuilder builder) {<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    super.toStringState(builder);<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    if (!isFinished() &amp;&amp; !isEofState() &amp;&amp; getCurrentState() != null) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      builder.append(":").append(getCurrentState());<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    }<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  }<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @Override<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      throws IOException {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    StateMachineProcedureData.Builder data = StateMachineProcedureData.newBuilder();<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    for (int i = 0; i &lt; stateCount; ++i) {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      data.addState(states[i]);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    serializer.serialize(data.build());<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>  @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    StateMachineProcedureData data = serializer.deserialize(StateMachineProcedureData.class);<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    stateCount = data.getStateCount();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    if (stateCount &gt; 0) {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      states = new int[stateCount];<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      for (int i = 0; i &lt; stateCount; ++i) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        states[i] = data.getState(i);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      }<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      if (isEofState()) {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>        stateFlow = Flow.NO_MORE_STATE;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    } else {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      states = null;<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>}<a name="line.321"></a>
 
 
 


[39/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index b3c8be7..022b67f 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -532,14 +532,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/DisabledWALProvider.DisabledWAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/DisabledWALProvider.DisabledWAL.html b/devapidocs/org/apache/hadoop/hbase/wal/DisabledWALProvider.DisabledWAL.html
index f107575..3aaa4f0 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/DisabledWALProvider.DisabledWAL.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/DisabledWALProvider.DisabledWAL.html
@@ -329,6 +329,13 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="
 <h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
 <code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
 </ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.wal.WAL">
+<!--   -->
+</a>
+<h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></h3>
+<code><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-boolean-">sync</a>, <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-boolean-">sync</a></code></li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/FSHLogProvider.Writer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/FSHLogProvider.Writer.html b/devapidocs/org/apache/hadoop/hbase/wal/FSHLogProvider.Writer.html
index 42d9d4a..d530fa4 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/FSHLogProvider.Writer.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/FSHLogProvider.Writer.html
@@ -146,7 +146,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.h
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#append-org.apache.hadoop.hbase.wal.WAL.Entry-">append</a>, <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync--">sync</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#append-org.apache.hadoop.hbase.wal.WAL.Entry-">append</a>, <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync-boolean-">sync</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.wal.WALProvider.WriterBase">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/WAL.Entry.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WAL.Entry.html b/devapidocs/org/apache/hadoop/hbase/wal/WAL.Entry.html
index 565cc4b..951d475 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WAL.Entry.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WAL.Entry.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.227">WAL.Entry</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.244">WAL.Entry</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Utility class that lets us keep track of the edit with it's key.</div>
 </li>
@@ -234,7 +234,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>edit</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.228">edit</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.245">edit</a></pre>
 </li>
 </ul>
 <a name="key">
@@ -243,7 +243,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>key</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.229">key</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.246">key</a></pre>
 </li>
 </ul>
 </li>
@@ -260,7 +260,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>Entry</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.231">Entry</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.248">Entry</a>()</pre>
 </li>
 </ul>
 <a name="Entry-org.apache.hadoop.hbase.wal.WALKeyImpl-org.apache.hadoop.hbase.wal.WALEdit-">
@@ -269,7 +269,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Entry</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.241">Entry</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.258">Entry</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
              <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</pre>
 <div class="block">Constructor for both params</div>
 <dl>
@@ -293,7 +293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getEdit</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.251">getEdit</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.268">getEdit</a>()</pre>
 <div class="block">Gets the edit</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -307,7 +307,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getKey</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.260">getKey</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.277">getKey</a>()</pre>
 <div class="block">Gets the key</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -321,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompressionContext</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.270">setCompressionContext</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.html" title="class in org.apache.hadoop.hbase.regionserver.wal">CompressionContext</a>&nbsp;compressionContext)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.287">setCompressionContext</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.html" title="class in org.apache.hadoop.hbase.regionserver.wal">CompressionContext</a>&nbsp;compressionContext)</pre>
 <div class="block">Set compression context for this entry.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -335,7 +335,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.275">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Entry.html#line.292">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/WAL.Reader.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WAL.Reader.html b/devapidocs/org/apache/hadoop/hbase/wal/WAL.Reader.html
index 52ed458..5985710 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WAL.Reader.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WAL.Reader.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.216">WAL.Reader</a>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.233">WAL.Reader</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.html?is-external=true" title="class or interface in java.io">Closeable</a></pre>
 <div class="block">When outside clients need to consume persisted WALs, they rely on a provided
  Reader.</div>
@@ -187,7 +187,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.217">next</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.234">next</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -201,7 +201,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>next</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.218">next</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;reuse)
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.235">next</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;reuse)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -215,7 +215,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>seek</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.219">seek</a>(long&nbsp;pos)
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.236">seek</a>(long&nbsp;pos)
    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -229,7 +229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getPosition</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.220">getPosition</a>()
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.237">getPosition</a>()
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -243,7 +243,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>reset</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.221">reset</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.Reader.html#line.238">reset</a>()
     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/WAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WAL.html b/devapidocs/org/apache/hadoop/hbase/wal/WAL.html
index 26f0baa..aa07f0a 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WAL.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WAL.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":38,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":6,"i15":6,"i16":6,"i17":6};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],32:["t6","Deprecated Methods"]};
+var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":38,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6,"i12":6,"i13":6,"i14":18,"i15":6,"i16":18,"i17":6,"i18":6,"i19":6};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -159,7 +159,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 </a>
 <h3>Method Summary</h3>
 <table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t6" class="tableTab"><span><a href="javascript:show(32);">Deprecated Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t5" class="tableTab"><span><a href="javascript:show(16);">Default Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t6" class="tableTab"><span><a href="javascript:show(32);">Deprecated Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Method and Description</th>
@@ -255,24 +255,33 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 </td>
 </tr>
 <tr id="i14" class="altColor">
+<td class="colFirst"><code>default void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-boolean-">sync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-">sync</a></span>(long&nbsp;txid)</code>
 <div class="block">Sync the WAL if the txId was not already sync'd.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
+<td class="colFirst"><code>default void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#sync-long-boolean-">sync</a></span>(long&nbsp;txid,
+    boolean&nbsp;forceSync)</code>&nbsp;</td>
+</tr>
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#toString--">toString</a></span>()</code>
 <div class="block">Human readable identifying information about the state of this WAL.</div>
 </td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#unregisterWALActionsListener-org.apache.hadoop.hbase.regionserver.wal.WALActionsListener-">unregisterWALActionsListener</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</code>
 <div class="block">Unregisters WALActionsListener</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#updateStore-byte:A-byte:A-java.lang.Long-boolean-">updateStore</a></span>(byte[]&nbsp;encodedRegionName,
            byte[]&nbsp;familyName,
@@ -499,13 +508,49 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 </dl>
 </li>
 </ul>
+<a name="sync-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>sync</h4>
+<pre>default&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.146">sync</a>(boolean&nbsp;forceSync)
+           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>forceSync</code> - Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush
+          vs hsync.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="sync-long-boolean-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>sync</h4>
+<pre>default&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.155">sync</a>(long&nbsp;txid,
+                  boolean&nbsp;forceSync)
+           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>txid</code> - Transaction id to sync to.</dd>
+<dd><code>forceSync</code> - Flag to force sync rather than flushing to the buffer. Example - Hadoop hflush
+          vs hsync.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="startCacheFlush-byte:A-java.util.Set-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>startCacheFlush</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.159">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.176">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&nbsp;families)</pre>
 <div class="block">WAL keeps track of the sequence numbers that are as yet not flushed im memstores
  in order to be able to do accounting to figure which WALs can be let go. This method tells WAL
@@ -535,7 +580,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>startCacheFlush</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.161">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.178">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;familyToSeq)</pre>
 </li>
 </ul>
@@ -545,7 +590,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>completeCacheFlush</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.169">completeCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.186">completeCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block">Complete the cache flush.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -562,7 +607,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>abortCacheFlush</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.177">abortCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.194">abortCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block">Abort a cache flush. Call if the flush fails. Note that the only recovery
  for an aborted flush currently is a restart of the regionserver so the
  snapshot content dropped by the failure gets restored to the memstore.</div>
@@ -578,7 +623,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoprocessorHost</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.182">getCoprocessorHost</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.199">getCoprocessorHost</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Coprocessor host.</dd>
@@ -592,7 +637,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/io/Closeable.htm
 <li class="blockList">
 <h4>getEarliestMemStoreSeqNum</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.193">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName)</pre>
+long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.210">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since version 1.2.0. Removing because not used and exposes subtle internal
  workings. Use <a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html#getEarliestMemStoreSeqNum-byte:A-byte:A-"><code>getEarliestMemStoreSeqNum(byte[], byte[])</code></a></span></div>
 <div class="block">Gets the earliest unflushed sequence id in the memstore for the region.</div>
@@ -610,7 +655,7 @@ long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#
 <ul class="blockList">
 <li class="blockList">
 <h4>getEarliestMemStoreSeqNum</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.201">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName,
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.218">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName,
                                byte[]&nbsp;familyName)</pre>
 <div class="block">Gets the earliest unflushed sequence id in the memstore for the store.</div>
 <dl>
@@ -628,7 +673,7 @@ long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.210">toString</a>()</pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WAL.html#line.227">toString</a>()</pre>
 <div class="block">Human readable identifying information about the state of this WAL.
  Implementors are encouraged to include information appropriate for debugging.
  Consumers are advised not to rely on the details of the returned String; it does

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALProvider.Writer.html b/devapidocs/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
index 0bf0a0d..117c5b6 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALProvider.Writer.html
@@ -143,7 +143,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.WriterBa
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync--">sync</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html#sync-boolean-">sync</a></span>(boolean&nbsp;forceSync)</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -174,13 +174,13 @@ extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.WriterBa
 <!--   -->
 </a>
 <h3>Method Detail</h3>
-<a name="sync--">
+<a name="sync-boolean-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>sync</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html#line.82">sync</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALProvider.Writer.html#line.82">sync</a>(boolean&nbsp;forceSync)
    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index c0e28b4..9ec5b35 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -189,8 +189,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">WALFactory.Providers</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">RegionGroupingProvider.Strategies</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 538dfb3..9f52a8e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,11 +16,11 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "2a3f4a0a4eb7bb67985050b0e007576c468f217e";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "8ab7b20f48951d77945181024f5e15842bc253c4";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Tue Mar 20 14:41:21 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Wed Mar 21 14:41:50 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://asf920.gq1.ygridcore.net/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "1875b6188f146a29b921f647138ace23";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "03e46ad2c22f563cdd7f970f368a1b81";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/client/Durability.html b/devapidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
index fe0fb30..0cdca93 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/client/Durability.html
@@ -58,11 +58,10 @@
 <span class="sourceLineNo">050</span>  SYNC_WAL,<a name="line.50"></a>
 <span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
 <span class="sourceLineNo">052</span>   * Write the Mutation to the WAL synchronously and force the entries to disk.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   * (Note: this is currently not supported and will behave identical to {@link #SYNC_WAL})<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   * See &lt;a href="https://issues.apache.org/jira/browse/HADOOP-6313"&gt;HADOOP-6313&lt;/a&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   */<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  FSYNC_WAL<a name="line.56"></a>
-<span class="sourceLineNo">057</span>}<a name="line.57"></a>
+<span class="sourceLineNo">053</span>   * See &lt;a href="https://issues.apache.org/jira/browse/HADOOP-6313"&gt;HADOOP-6313&lt;/a&gt;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>  FSYNC_WAL<a name="line.55"></a>
+<span class="sourceLineNo">056</span>}<a name="line.56"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.HFileDeleteTask.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.HFileDeleteTask.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.HFileDeleteTask.html
index 3c54cae..a587380 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.HFileDeleteTask.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.HFileDeleteTask.html
@@ -243,12 +243,12 @@
 <span class="sourceLineNo">235</span>          break;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>        }<a name="line.236"></a>
 <span class="sourceLineNo">237</span>        if (task != null) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.debug("Removing: {} from archive", task.filePath);<a name="line.238"></a>
+<span class="sourceLineNo">238</span>          LOG.debug("Removing {}", task.filePath);<a name="line.238"></a>
 <span class="sourceLineNo">239</span>          boolean succeed;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>          try {<a name="line.240"></a>
 <span class="sourceLineNo">241</span>            succeed = this.fs.delete(task.filePath, false);<a name="line.241"></a>
 <span class="sourceLineNo">242</span>          } catch (IOException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            LOG.warn("Failed to delete file {}", task.filePath, e);<a name="line.243"></a>
+<span class="sourceLineNo">243</span>            LOG.warn("Failed to delete {}", task.filePath, e);<a name="line.243"></a>
 <span class="sourceLineNo">244</span>            succeed = false;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>          }<a name="line.245"></a>
 <span class="sourceLineNo">246</span>          task.setResult(succeed);<a name="line.246"></a>
@@ -258,7 +258,7 @@
 <span class="sourceLineNo">250</span>        }<a name="line.250"></a>
 <span class="sourceLineNo">251</span>      }<a name="line.251"></a>
 <span class="sourceLineNo">252</span>    } finally {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      LOG.debug("Exit thread: {}", Thread.currentThread());<a name="line.253"></a>
+<span class="sourceLineNo">253</span>      LOG.debug("Exit {}", Thread.currentThread());<a name="line.253"></a>
 <span class="sourceLineNo">254</span>    }<a name="line.254"></a>
 <span class="sourceLineNo">255</span>  }<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html
index 3c54cae..a587380 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html
@@ -243,12 +243,12 @@
 <span class="sourceLineNo">235</span>          break;<a name="line.235"></a>
 <span class="sourceLineNo">236</span>        }<a name="line.236"></a>
 <span class="sourceLineNo">237</span>        if (task != null) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.debug("Removing: {} from archive", task.filePath);<a name="line.238"></a>
+<span class="sourceLineNo">238</span>          LOG.debug("Removing {}", task.filePath);<a name="line.238"></a>
 <span class="sourceLineNo">239</span>          boolean succeed;<a name="line.239"></a>
 <span class="sourceLineNo">240</span>          try {<a name="line.240"></a>
 <span class="sourceLineNo">241</span>            succeed = this.fs.delete(task.filePath, false);<a name="line.241"></a>
 <span class="sourceLineNo">242</span>          } catch (IOException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            LOG.warn("Failed to delete file {}", task.filePath, e);<a name="line.243"></a>
+<span class="sourceLineNo">243</span>            LOG.warn("Failed to delete {}", task.filePath, e);<a name="line.243"></a>
 <span class="sourceLineNo">244</span>            succeed = false;<a name="line.244"></a>
 <span class="sourceLineNo">245</span>          }<a name="line.245"></a>
 <span class="sourceLineNo">246</span>          task.setResult(succeed);<a name="line.246"></a>
@@ -258,7 +258,7 @@
 <span class="sourceLineNo">250</span>        }<a name="line.250"></a>
 <span class="sourceLineNo">251</span>      }<a name="line.251"></a>
 <span class="sourceLineNo">252</span>    } finally {<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      LOG.debug("Exit thread: {}", Thread.currentThread());<a name="line.253"></a>
+<span class="sourceLineNo">253</span>      LOG.debug("Exit {}", Thread.currentThread());<a name="line.253"></a>
 <span class="sourceLineNo">254</span>    }<a name="line.254"></a>
 <span class="sourceLineNo">255</span>  }<a name="line.255"></a>
 <span class="sourceLineNo">256</span><a name="line.256"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
index d90ed37..b4519ba 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html
@@ -112,187 +112,202 @@
 <span class="sourceLineNo">104</span><a name="line.104"></a>
 <span class="sourceLineNo">105</span>    try {<a name="line.105"></a>
 <span class="sourceLineNo">106</span>      switch (state) {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>        case RECOVER_META_SPLIT_LOGS:<a name="line.107"></a>
-<span class="sourceLineNo">108</span>          LOG.info("Start " + this);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>          if (shouldSplitWal) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>            // TODO: Matteo. We BLOCK here but most important thing to be doing at this moment.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>            if (failedMetaServer != null) {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>              master.getMasterWalManager().splitMetaLog(failedMetaServer);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>            } else {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>              ServerName serverName =<a name="line.114"></a>
-<span class="sourceLineNo">115</span>                  master.getMetaTableLocator().getMetaRegionLocation(master.getZooKeeper());<a name="line.115"></a>
-<span class="sourceLineNo">116</span>              Set&lt;ServerName&gt; previouslyFailedServers =<a name="line.116"></a>
-<span class="sourceLineNo">117</span>                  master.getMasterWalManager().getFailedServersFromLogFolders();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>              if (serverName != null &amp;&amp; previouslyFailedServers.contains(serverName)) {<a name="line.118"></a>
-<span class="sourceLineNo">119</span>                master.getMasterWalManager().splitMetaLog(serverName);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>              }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>            }<a name="line.121"></a>
-<span class="sourceLineNo">122</span>          }<a name="line.122"></a>
-<span class="sourceLineNo">123</span>          setNextState(RecoverMetaState.RECOVER_META_ASSIGN_REGIONS);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>          break;<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>        case RECOVER_META_ASSIGN_REGIONS:<a name="line.126"></a>
-<span class="sourceLineNo">127</span>          RegionInfo hri = RegionReplicaUtil.getRegionInfoForReplica(<a name="line.127"></a>
-<span class="sourceLineNo">128</span>              RegionInfoBuilder.FIRST_META_REGIONINFO, this.replicaId);<a name="line.128"></a>
-<span class="sourceLineNo">129</span><a name="line.129"></a>
-<span class="sourceLineNo">130</span>          AssignProcedure metaAssignProcedure;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>          AssignmentManager am = master.getAssignmentManager();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>          if (failedMetaServer != null) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>            handleRIT(env, hri, this.failedMetaServer);<a name="line.133"></a>
-<span class="sourceLineNo">134</span>            LOG.info(this + "; Assigning meta with new plan; previous server=" + failedMetaServer);<a name="line.134"></a>
-<span class="sourceLineNo">135</span>            metaAssignProcedure = am.createAssignProcedure(hri);<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          } else {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>            // get server carrying meta from zk<a name="line.137"></a>
-<span class="sourceLineNo">138</span>            ServerName metaServer =<a name="line.138"></a>
-<span class="sourceLineNo">139</span>                MetaTableLocator.getMetaRegionState(master.getZooKeeper()).getServerName();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            LOG.info(this + "; Retaining meta assignment to server=" + metaServer);<a name="line.140"></a>
-<span class="sourceLineNo">141</span>            metaAssignProcedure = am.createAssignProcedure(hri, metaServer);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>          }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>          addChildProcedure(metaAssignProcedure);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          return Flow.NO_MORE_STATE;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>        default:<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      }<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    } catch (IOException|KeeperException e) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      LOG.warn(this + "; Failed state=" + state + ", retry " + this + "; cycles=" +<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          getCycles(), e);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    return Flow.HAS_MORE_STATE;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  /**<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * Is the region stuck assigning to this failedMetaServer? If so, cancel the call<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * just as we do over in ServerCrashProcedure#handleRIT except less to do here; less context<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * to carry.<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   */<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  // NOTE: Make sure any fix or improvement done here is also done in SCP#handleRIT; the methods<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  // have overlap.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private void handleRIT(MasterProcedureEnv env, RegionInfo ri, ServerName crashedServerName) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    RegionTransitionProcedure rtp = am.getRegionStates().getRegionTransitionProcedure(ri);<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    if (rtp == null) {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return; // Nothing to do. Not in RIT.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    // Make sure the RIT is against this crashed server. In the case where there are many<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    // processings of a crashed server -- backed up for whatever reason (slow WAL split)<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    // -- then a previous SCP may have already failed an assign, etc., and it may have a<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    // new location target; DO NOT fail these else we make for assign flux.<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    ServerName rtpServerName = rtp.getServer(env);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    if (rtpServerName == null) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      LOG.warn("RIT with ServerName null! " + rtp);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    } else if (rtpServerName.equals(crashedServerName)) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      LOG.info("pid=" + getProcId() + " found RIT " + rtp + "; " +<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          rtp.getRegionState(env).toShortString());<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      rtp.remoteCallFailed(env, crashedServerName,<a name="line.180"></a>
-<span class="sourceLineNo">181</span>          new ServerCrashException(getProcId(), crashedServerName));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  @Override<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  protected void rollbackState(MasterProcedureEnv env,<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      MasterProcedureProtos.RecoverMetaState recoverMetaState)<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      throws IOException, InterruptedException {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    // Can't rollback<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    throw new UnsupportedOperationException("unhandled state=" + recoverMetaState);<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>  @Override<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  protected MasterProcedureProtos.RecoverMetaState getState(int stateId) {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    return RecoverMetaState.forNumber(stateId);<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  }<a name="line.196"></a>
-<span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  @Override<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  protected int getStateId(MasterProcedureProtos.RecoverMetaState recoverMetaState) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    return recoverMetaState.getNumber();<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  }<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  @Override<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  protected MasterProcedureProtos.RecoverMetaState getInitialState() {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    return RecoverMetaState.RECOVER_META_SPLIT_LOGS;<a name="line.205"></a>
+<span class="sourceLineNo">107</span>        case RECOVER_META_PREPARE:<a name="line.107"></a>
+<span class="sourceLineNo">108</span>          // If Master is going down or cluster is up, skip this assign by returning NO_MORE_STATE<a name="line.108"></a>
+<span class="sourceLineNo">109</span>          if (!master.isClusterUp()) {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>            String msg = "Cluster not up! Skipping hbase:meta assign.";<a name="line.110"></a>
+<span class="sourceLineNo">111</span>            LOG.warn(msg);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>            return Flow.NO_MORE_STATE;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>          }<a name="line.113"></a>
+<span class="sourceLineNo">114</span>          if (master.isStopping() || master.isStopped()) {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>            String msg = "Master stopping=" + master.isStopping() + ", stopped=" +<a name="line.115"></a>
+<span class="sourceLineNo">116</span>                master.isStopped() + "; skipping hbase:meta assign.";<a name="line.116"></a>
+<span class="sourceLineNo">117</span>            LOG.warn(msg);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>            return Flow.NO_MORE_STATE;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>          }<a name="line.119"></a>
+<span class="sourceLineNo">120</span>          setNextState(RecoverMetaState.RECOVER_META_SPLIT_LOGS);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>          break;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        case RECOVER_META_SPLIT_LOGS:<a name="line.122"></a>
+<span class="sourceLineNo">123</span>          LOG.info("Start " + this);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>          if (shouldSplitWal) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>            // TODO: Matteo. We BLOCK here but most important thing to be doing at this moment.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>            if (failedMetaServer != null) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>              master.getMasterWalManager().splitMetaLog(failedMetaServer);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>            } else {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>              ServerName serverName =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>                  master.getMetaTableLocator().getMetaRegionLocation(master.getZooKeeper());<a name="line.130"></a>
+<span class="sourceLineNo">131</span>              Set&lt;ServerName&gt; previouslyFailedServers =<a name="line.131"></a>
+<span class="sourceLineNo">132</span>                  master.getMasterWalManager().getFailedServersFromLogFolders();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>              if (serverName != null &amp;&amp; previouslyFailedServers.contains(serverName)) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>                master.getMasterWalManager().splitMetaLog(serverName);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>              }<a name="line.135"></a>
+<span class="sourceLineNo">136</span>            }<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          }<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          setNextState(RecoverMetaState.RECOVER_META_ASSIGN_REGIONS);<a name="line.138"></a>
+<span class="sourceLineNo">139</span>          break;<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>        case RECOVER_META_ASSIGN_REGIONS:<a name="line.141"></a>
+<span class="sourceLineNo">142</span>          RegionInfo hri = RegionReplicaUtil.getRegionInfoForReplica(<a name="line.142"></a>
+<span class="sourceLineNo">143</span>              RegionInfoBuilder.FIRST_META_REGIONINFO, this.replicaId);<a name="line.143"></a>
+<span class="sourceLineNo">144</span><a name="line.144"></a>
+<span class="sourceLineNo">145</span>          AssignProcedure metaAssignProcedure;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>          AssignmentManager am = master.getAssignmentManager();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>          if (failedMetaServer != null) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>            handleRIT(env, hri, this.failedMetaServer);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            LOG.info(this + "; Assigning meta with new plan; previous server=" + failedMetaServer);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            metaAssignProcedure = am.createAssignProcedure(hri);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          } else {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>            // get server carrying meta from zk<a name="line.152"></a>
+<span class="sourceLineNo">153</span>            ServerName metaServer =<a name="line.153"></a>
+<span class="sourceLineNo">154</span>                MetaTableLocator.getMetaRegionState(master.getZooKeeper()).getServerName();<a name="line.154"></a>
+<span class="sourceLineNo">155</span>            LOG.info(this + "; Retaining meta assignment to server=" + metaServer);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>            metaAssignProcedure = am.createAssignProcedure(hri, metaServer);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>          }<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>          addChildProcedure(metaAssignProcedure);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>          return Flow.NO_MORE_STATE;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>        default:<a name="line.162"></a>
+<span class="sourceLineNo">163</span>          throw new UnsupportedOperationException("unhandled state=" + state);<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    } catch (IOException|KeeperException e) {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      LOG.warn(this + "; Failed state=" + state + ", retry " + this + "; cycles=" +<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          getCycles(), e);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    return Flow.HAS_MORE_STATE;<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  }<a name="line.170"></a>
+<span class="sourceLineNo">171</span><a name="line.171"></a>
+<span class="sourceLineNo">172</span>  /**<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * Is the region stuck assigning to this failedMetaServer? If so, cancel the call<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   * just as we do over in ServerCrashProcedure#handleRIT except less to do here; less context<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * to carry.<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  // NOTE: Make sure any fix or improvement done here is also done in SCP#handleRIT; the methods<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  // have overlap.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  private void handleRIT(MasterProcedureEnv env, RegionInfo ri, ServerName crashedServerName) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    AssignmentManager am = env.getAssignmentManager();<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    RegionTransitionProcedure rtp = am.getRegionStates().getRegionTransitionProcedure(ri);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    if (rtp == null) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      return; // Nothing to do. Not in RIT.<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    // Make sure the RIT is against this crashed server. In the case where there are many<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    // processings of a crashed server -- backed up for whatever reason (slow WAL split)<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    // -- then a previous SCP may have already failed an assign, etc., and it may have a<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    // new location target; DO NOT fail these else we make for assign flux.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    ServerName rtpServerName = rtp.getServer(env);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    if (rtpServerName == null) {<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      LOG.warn("RIT with ServerName null! " + rtp);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } else if (rtpServerName.equals(crashedServerName)) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      LOG.info("pid=" + getProcId() + " found RIT " + rtp + "; " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>          rtp.getRegionState(env).toShortString());<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      rtp.remoteCallFailed(env, crashedServerName,<a name="line.195"></a>
+<span class="sourceLineNo">196</span>          new ServerCrashException(getProcId(), crashedServerName));<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    }<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  }<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  @Override<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  protected void rollbackState(MasterProcedureEnv env,<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      MasterProcedureProtos.RecoverMetaState recoverMetaState)<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      throws IOException, InterruptedException {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    // Can't rollback<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    throw new UnsupportedOperationException("unhandled state=" + recoverMetaState);<a name="line.205"></a>
 <span class="sourceLineNo">206</span>  }<a name="line.206"></a>
 <span class="sourceLineNo">207</span><a name="line.207"></a>
 <span class="sourceLineNo">208</span>  @Override<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  protected void toStringClassDetails(StringBuilder sb) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    sb.append(getClass().getSimpleName());<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    sb.append(" failedMetaServer=");<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    sb.append(failedMetaServer);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    sb.append(", splitWal=");<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    sb.append(shouldSplitWal);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  @Override<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      throws IOException {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    super.serializeStateData(serializer);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    MasterProcedureProtos.RecoverMetaStateData.Builder state =<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        MasterProcedureProtos.RecoverMetaStateData.newBuilder().setShouldSplitWal(shouldSplitWal);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    if (failedMetaServer != null) {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      state.setFailedMetaServer(ProtobufUtil.toServerName(failedMetaServer));<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    }<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    state.setReplicaId(replicaId);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    serializer.serialize(state.build());<a name="line.227"></a>
-<span class="sourceLineNo">228</span>  }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>  @Override<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      throws IOException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    super.deserializeStateData(serializer);<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    MasterProcedureProtos.RecoverMetaStateData state =<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        serializer.deserialize(MasterProcedureProtos.RecoverMetaStateData.class);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    this.shouldSplitWal = state.hasShouldSplitWal() &amp;&amp; state.getShouldSplitWal();<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    this.failedMetaServer = state.hasFailedMetaServer() ?<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        ProtobufUtil.toServerName(state.getFailedMetaServer()) : null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    this.replicaId = state.hasReplicaId() ? state.getReplicaId() : RegionInfo.DEFAULT_REPLICA_ID;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  }<a name="line.240"></a>
-<span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>  @Override<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  protected LockState acquireLock(MasterProcedureEnv env) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    if (env.getProcedureScheduler().waitTableExclusiveLock(this, TableName.META_TABLE_NAME)) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    return LockState.LOCK_ACQUIRED;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  protected void releaseLock(MasterProcedureEnv env) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    env.getProcedureScheduler().wakeTableExclusiveLock(this, TableName.META_TABLE_NAME);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  @Override<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  protected void completionCleanup(MasterProcedureEnv env) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    ProcedurePrepareLatch.releaseLatch(syncLatch, this);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public TableName getTableName() {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    return TableName.META_TABLE_NAME;<a name="line.262"></a>
+<span class="sourceLineNo">209</span>  protected MasterProcedureProtos.RecoverMetaState getState(int stateId) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    return RecoverMetaState.forNumber(stateId);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  }<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  @Override<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  protected int getStateId(MasterProcedureProtos.RecoverMetaState recoverMetaState) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    return recoverMetaState.getNumber();<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  @Override<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  protected MasterProcedureProtos.RecoverMetaState getInitialState() {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    return RecoverMetaState.RECOVER_META_PREPARE;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  }<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>  @Override<a name="line.223"></a>
+<span class="sourceLineNo">224</span>  protected void toStringClassDetails(StringBuilder sb) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    sb.append(getClass().getSimpleName());<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    sb.append(" failedMetaServer=");<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    sb.append(failedMetaServer);<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    sb.append(", splitWal=");<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    sb.append(shouldSplitWal);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      throws IOException {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    super.serializeStateData(serializer);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    MasterProcedureProtos.RecoverMetaStateData.Builder state =<a name="line.236"></a>
+<span class="sourceLineNo">237</span>        MasterProcedureProtos.RecoverMetaStateData.newBuilder().setShouldSplitWal(shouldSplitWal);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    if (failedMetaServer != null) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      state.setFailedMetaServer(ProtobufUtil.toServerName(failedMetaServer));<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    }<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    state.setReplicaId(replicaId);<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    serializer.serialize(state.build());<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  @Override<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.246"></a>
+<span class="sourceLineNo">247</span>      throws IOException {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    super.deserializeStateData(serializer);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    MasterProcedureProtos.RecoverMetaStateData state =<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        serializer.deserialize(MasterProcedureProtos.RecoverMetaStateData.class);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.shouldSplitWal = state.hasShouldSplitWal() &amp;&amp; state.getShouldSplitWal();<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    this.failedMetaServer = state.hasFailedMetaServer() ?<a name="line.252"></a>
+<span class="sourceLineNo">253</span>        ProtobufUtil.toServerName(state.getFailedMetaServer()) : null;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    this.replicaId = state.hasReplicaId() ? state.getReplicaId() : RegionInfo.DEFAULT_REPLICA_ID;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  @Override<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  protected LockState acquireLock(MasterProcedureEnv env) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    if (env.getProcedureScheduler().waitTableExclusiveLock(this, TableName.META_TABLE_NAME)) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      return LockState.LOCK_EVENT_WAIT;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    return LockState.LOCK_ACQUIRED;<a name="line.262"></a>
 <span class="sourceLineNo">263</span>  }<a name="line.263"></a>
 <span class="sourceLineNo">264</span><a name="line.264"></a>
 <span class="sourceLineNo">265</span>  @Override<a name="line.265"></a>
-<span class="sourceLineNo">266</span>  public TableOperationType getTableOperationType() {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    return TableOperationType.ENABLE;<a name="line.267"></a>
+<span class="sourceLineNo">266</span>  protected void releaseLock(MasterProcedureEnv env) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    env.getProcedureScheduler().wakeTableExclusiveLock(this, TableName.META_TABLE_NAME);<a name="line.267"></a>
 <span class="sourceLineNo">268</span>  }<a name="line.268"></a>
 <span class="sourceLineNo">269</span><a name="line.269"></a>
-<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
-<span class="sourceLineNo">271</span>   * @return true if failedMetaServer is not null (meta carrying server crashed) or meta is<a name="line.271"></a>
-<span class="sourceLineNo">272</span>   * already initialized<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  private boolean isRunRequired() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return failedMetaServer != null || !master.getAssignmentManager().isMetaInitialized();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  /**<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * Prepare for execution<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   */<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  private void prepare(MasterProcedureEnv env) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    if (master == null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      master = env.getMasterServices();<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      Preconditions.checkArgument(master != null);<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>}<a name="line.287"></a>
+<span class="sourceLineNo">270</span>  @Override<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  protected void completionCleanup(MasterProcedureEnv env) {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    ProcedurePrepareLatch.releaseLatch(syncLatch, this);<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  }<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>  @Override<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  public TableName getTableName() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    return TableName.META_TABLE_NAME;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  @Override<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  public TableOperationType getTableOperationType() {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return TableOperationType.ENABLE;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @return true if failedMetaServer is not null (meta carrying server crashed) or meta is<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * already initialized<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  private boolean isRunRequired() {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return failedMetaServer != null || !master.getAssignmentManager().isMetaInitialized();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * Prepare for execution<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private void prepare(MasterProcedureEnv env) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    if (master == null) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      master = env.getMasterServices();<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      Preconditions.checkArgument(master != null);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    }<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>}<a name="line.302"></a>
 
 
 


[16/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
index 9ee12ef..4c42811 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.FlushQueueEntry.html
@@ -51,889 +51,893 @@
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
 <span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.RegionReplicaUtil;<a name="line.44"></a>
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.regionserver.HRegion.FlushResult;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.htrace.core.TraceScope;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
-<span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>/**<a name="line.60"></a>
-<span class="sourceLineNo">061</span> * Thread that flushes cache on request<a name="line.61"></a>
-<span class="sourceLineNo">062</span> *<a name="line.62"></a>
-<span class="sourceLineNo">063</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * sleep time which is invariant.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * @see FlushRequester<a name="line.67"></a>
-<span class="sourceLineNo">068</span> */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>@InterfaceAudience.Private<a name="line.69"></a>
-<span class="sourceLineNo">070</span>class MemStoreFlusher implements FlushRequester {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>  private Configuration conf;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // These two data members go together.  Any entry in the one must have<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // a corresponding entry in the other.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private final long threadWakeFrequency;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  private final HRegionServer server;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  private final Object blockSignal = new Object();<a name="line.83"></a>
-<span class="sourceLineNo">084</span><a name="line.84"></a>
-<span class="sourceLineNo">085</span>  private long blockingWaitTime;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.86"></a>
-<span class="sourceLineNo">087</span><a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private final FlushHandler[] flushHandlers;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private FlushType flushType;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  /**<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    @Override<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    public long getDelay(TimeUnit unit) {<a name="line.98"></a>
-<span class="sourceLineNo">099</span>      return 0;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>    @Override<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    public int compareTo(Delayed o) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>      return -1;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    @Override<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    public boolean equals(Object obj) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      return obj == this;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    }<a name="line.110"></a>
-<span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>    @Override<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public int hashCode() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return 42;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    }<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  };<a name="line.116"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.htrace.core.TraceScope;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>/**<a name="line.59"></a>
+<span class="sourceLineNo">060</span> * Thread that flushes cache on request<a name="line.60"></a>
+<span class="sourceLineNo">061</span> *<a name="line.61"></a>
+<span class="sourceLineNo">062</span> * NOTE: This class extends Thread rather than Chore because the sleep time<a name="line.62"></a>
+<span class="sourceLineNo">063</span> * can be interrupted when there is something to do, rather than the Chore<a name="line.63"></a>
+<span class="sourceLineNo">064</span> * sleep time which is invariant.<a name="line.64"></a>
+<span class="sourceLineNo">065</span> *<a name="line.65"></a>
+<span class="sourceLineNo">066</span> * @see FlushRequester<a name="line.66"></a>
+<span class="sourceLineNo">067</span> */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>@InterfaceAudience.Private<a name="line.68"></a>
+<span class="sourceLineNo">069</span>class MemStoreFlusher implements FlushRequester {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  private static final Logger LOG = LoggerFactory.getLogger(MemStoreFlusher.class);<a name="line.70"></a>
+<span class="sourceLineNo">071</span><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  private Configuration conf;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // These two data members go together.  Any entry in the one must have<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // a corresponding entry in the other.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private final BlockingQueue&lt;FlushQueueEntry&gt; flushQueue = new DelayQueue&lt;&gt;();<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final Map&lt;Region, FlushRegionEntry&gt; regionsInQueue = new HashMap&lt;&gt;();<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private AtomicBoolean wakeupPending = new AtomicBoolean();<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  private final long threadWakeFrequency;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  private final HRegionServer server;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  private final Object blockSignal = new Object();<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private long blockingWaitTime;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final LongAdder updatesBlockedMsHighWater = new LongAdder();<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final FlushHandler[] flushHandlers;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private List&lt;FlushRequestListener&gt; flushRequestListeners = new ArrayList&lt;&gt;(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private FlushType flushType;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>  /**<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * Singleton instance inserted into flush queue used for signaling.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  private static final FlushQueueEntry WAKEUPFLUSH_INSTANCE = new FlushQueueEntry() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    @Override<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    public long getDelay(TimeUnit unit) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      return 0;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    }<a name="line.99"></a>
+<span class="sourceLineNo">100</span><a name="line.100"></a>
+<span class="sourceLineNo">101</span>    @Override<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    public int compareTo(Delayed o) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      return -1;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    }<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>    @Override<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    public boolean equals(Object obj) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>      return obj == this;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>    @Override<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    public int hashCode() {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      return 42;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    }<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  };<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
 <span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span><a name="line.118"></a>
-<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * @param conf<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param server<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   */<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public MemStoreFlusher(final Configuration conf,<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      final HRegionServer server) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    super();<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    this.conf = conf;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    this.server = server;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    this.threadWakeFrequency =<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      90000);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    LOG.info("globalMemStoreLimit="<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        + TraditionalBinaryPrefix<a name="line.135"></a>
-<span class="sourceLineNo">136</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        + ", globalMemStoreLimitLowMark="<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        + TraditionalBinaryPrefix.long2String(<a name="line.138"></a>
-<span class="sourceLineNo">139</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.139"></a>
-<span class="sourceLineNo">140</span>        + ", Offheap="<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  }<a name="line.142"></a>
-<span class="sourceLineNo">143</span><a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    return this.updatesBlockedMsHighWater;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  }<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public void setFlushType(FlushType flushType) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.flushType = flushType;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   * flush thread)<a name="line.155"></a>
-<span class="sourceLineNo">156</span>   * @return true if successful<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private boolean flushOneForGlobalPressure() {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    switch(flushType) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        break;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      default:<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.170"></a>
-<span class="sourceLineNo">171</span><a name="line.171"></a>
-<span class="sourceLineNo">172</span>    double secondaryMultiplier<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    boolean flushedOne = false;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    while (!flushedOne) {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      HRegion bestFlushableRegion =<a name="line.178"></a>
-<span class="sourceLineNo">179</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      // Find the biggest region that is a secondary region<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      if (bestAnyRegion == null) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.185"></a>
-<span class="sourceLineNo">186</span>        bestAnyRegion = bestRegionReplica;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      if (bestAnyRegion == null) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        return false;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      }<a name="line.191"></a>
-<span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>      HRegion regionToFlush;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>      long bestAnyRegionSize;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      long bestFlushableRegionSize;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>      switch(flushType) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.198"></a>
-<span class="sourceLineNo">199</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.199"></a>
-<span class="sourceLineNo">200</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>          break;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.204"></a>
-<span class="sourceLineNo">205</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>          break;<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>        default:<a name="line.209"></a>
-<span class="sourceLineNo">210</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.215"></a>
-<span class="sourceLineNo">216</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        // life worse!<a name="line.217"></a>
-<span class="sourceLineNo">218</span>        if (LOG.isDebugEnabled()) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.219"></a>
-<span class="sourceLineNo">220</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.220"></a>
-<span class="sourceLineNo">221</span>              + " has too many " + "store files, but is "<a name="line.221"></a>
-<span class="sourceLineNo">222</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.222"></a>
-<span class="sourceLineNo">223</span>              + " vs best flushable region's "<a name="line.223"></a>
-<span class="sourceLineNo">224</span>              + TraditionalBinaryPrefix.long2String(<a name="line.224"></a>
-<span class="sourceLineNo">225</span>              bestFlushableRegionSize, "", 1)<a name="line.225"></a>
-<span class="sourceLineNo">226</span>              + ". Choosing the bigger.");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>        regionToFlush = bestAnyRegion;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        if (bestFlushableRegion == null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>          regionToFlush = bestAnyRegion;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>          regionToFlush = bestFlushableRegion;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>      long regionToFlushSize;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      long bestRegionReplicaSize;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      switch(flushType) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.241"></a>
-<span class="sourceLineNo">242</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          break;<a name="line.244"></a>
-<span class="sourceLineNo">245</span><a name="line.245"></a>
-<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          break;<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>        default:<a name="line.252"></a>
-<span class="sourceLineNo">253</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      }<a name="line.255"></a>
-<span class="sourceLineNo">256</span><a name="line.256"></a>
-<span class="sourceLineNo">257</span>      Preconditions.checkState(<a name="line.257"></a>
-<span class="sourceLineNo">258</span>        (regionToFlush != null &amp;&amp; regionToFlushSize &gt; 0) || bestRegionReplicaSize &gt; 0);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>      if (regionToFlush == null ||<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          (bestRegionReplica != null &amp;&amp;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.264"></a>
-<span class="sourceLineNo">265</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.265"></a>
-<span class="sourceLineNo">266</span>            TraditionalBinaryPrefix.long2String(<a name="line.266"></a>
-<span class="sourceLineNo">267</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.267"></a>
-<span class="sourceLineNo">268</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.268"></a>
-<span class="sourceLineNo">269</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (!flushedOne) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.272"></a>
-<span class="sourceLineNo">273</span>              " - trying to find a different region to refresh files.");<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          excludedRegions.add(bestRegionReplica);<a name="line.274"></a>
-<span class="sourceLineNo">275</span>        }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      } else {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            "Flush type=" + flushType.toString() +<a name="line.278"></a>
-<span class="sourceLineNo">279</span>            "Total Memstore Heap size=" +<a name="line.279"></a>
-<span class="sourceLineNo">280</span>            TraditionalBinaryPrefix.long2String(<a name="line.280"></a>
-<span class="sourceLineNo">281</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.281"></a>
-<span class="sourceLineNo">282</span>            "Total Memstore Off-Heap size=" +<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            TraditionalBinaryPrefix.long2String(<a name="line.283"></a>
-<span class="sourceLineNo">284</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.284"></a>
-<span class="sourceLineNo">285</span>            ", Region memstore size=" +<a name="line.285"></a>
-<span class="sourceLineNo">286</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.286"></a>
-<span class="sourceLineNo">287</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>        if (!flushedOne) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.290"></a>
-<span class="sourceLineNo">291</span>              " - trying to find a different region to flush.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          excludedRegions.add(regionToFlush);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return true;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  /**<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
-<span class="sourceLineNo">305</span><a name="line.305"></a>
-<span class="sourceLineNo">306</span>  /**<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  private class FlushHandler extends HasThread {<a name="line.320"></a>
-<span class="sourceLineNo">321</span><a name="line.321"></a>
-<span class="sourceLineNo">322</span>    private FlushHandler(String name) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      super(name);<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
+<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * @param conf<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * @param server<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   */<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public MemStoreFlusher(final Configuration conf,<a name="line.122"></a>
+<span class="sourceLineNo">123</span>      final HRegionServer server) {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    super();<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    this.conf = conf;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    this.server = server;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    this.threadWakeFrequency =<a name="line.127"></a>
+<span class="sourceLineNo">128</span>        conf.getLong(HConstants.THREAD_WAKE_FREQUENCY, 10 * 1000);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    this.blockingWaitTime = conf.getInt("hbase.hstore.blockingWaitTime",<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      90000);<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    int handlerCount = conf.getInt("hbase.hstore.flusher.count", 2);<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    this.flushHandlers = new FlushHandler[handlerCount];<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    LOG.info("globalMemStoreLimit="<a name="line.133"></a>
+<span class="sourceLineNo">134</span>        + TraditionalBinaryPrefix<a name="line.134"></a>
+<span class="sourceLineNo">135</span>            .long2String(this.server.getRegionServerAccounting().getGlobalMemStoreLimit(), "", 1)<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        + ", globalMemStoreLimitLowMark="<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        + TraditionalBinaryPrefix.long2String(<a name="line.137"></a>
+<span class="sourceLineNo">138</span>          this.server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1)<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        + ", Offheap="<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        + (this.server.getRegionServerAccounting().isOffheap()));<a name="line.140"></a>
+<span class="sourceLineNo">141</span>  }<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public LongAdder getUpdatesBlockedMsHighWater() {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    return this.updatesBlockedMsHighWater;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  }<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>  public void setFlushType(FlushType flushType) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.flushType = flushType;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  }<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  /**<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * The memstore across all regions has exceeded the low water mark. Pick<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   * one region to flush and flush it synchronously (this is called from the<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * flush thread)<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * @return true if successful<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private boolean flushOneForGlobalPressure() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize = null;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    switch(flushType) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.161"></a>
+<span class="sourceLineNo">162</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOffHeapSize();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        break;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      case ABOVE_ONHEAP_LOWER_MARK:<a name="line.165"></a>
+<span class="sourceLineNo">166</span>      default:<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        regionsBySize = server.getCopyOfOnlineRegionsSortedByOnHeapSize();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    }<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Set&lt;HRegion&gt; excludedRegions = new HashSet&lt;&gt;();<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    double secondaryMultiplier<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      = ServerRegionReplicaUtil.getRegionReplicaStoreFileRefreshMultiplier(conf);<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>    boolean flushedOne = false;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    while (!flushedOne) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      // Find the biggest region that doesn't have too many storefiles (might be null!)<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      HRegion bestFlushableRegion =<a name="line.177"></a>
+<span class="sourceLineNo">178</span>          getBiggestMemStoreRegion(regionsBySize, excludedRegions, true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      // Find the biggest region, total, even if it might have too many flushes.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      HRegion bestAnyRegion = getBiggestMemStoreRegion(regionsBySize, excludedRegions, false);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      // Find the biggest region that is a secondary region<a name="line.181"></a>
+<span class="sourceLineNo">182</span>      HRegion bestRegionReplica = getBiggestMemStoreOfRegionReplica(regionsBySize, excludedRegions);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      if (bestAnyRegion == null) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        // If bestAnyRegion is null, assign replica. It may be null too. Next step is check for null<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        bestAnyRegion = bestRegionReplica;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      if (bestAnyRegion == null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>        LOG.error("Above memory mark but there are no flushable regions!");<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        return false;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span><a name="line.191"></a>
+<span class="sourceLineNo">192</span>      HRegion regionToFlush;<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      long bestAnyRegionSize;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      long bestFlushableRegionSize;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>      switch(flushType) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.196"></a>
+<span class="sourceLineNo">197</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.197"></a>
+<span class="sourceLineNo">198</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreOffHeapSize();<a name="line.198"></a>
+<span class="sourceLineNo">199</span>          bestFlushableRegionSize = getMemStoreOffHeapSize(bestFlushableRegion);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>          break;<a name="line.200"></a>
+<span class="sourceLineNo">201</span><a name="line.201"></a>
+<span class="sourceLineNo">202</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.202"></a>
+<span class="sourceLineNo">203</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.203"></a>
+<span class="sourceLineNo">204</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreHeapSize();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>          bestFlushableRegionSize = getMemStoreHeapSize(bestFlushableRegion);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>          break;<a name="line.206"></a>
+<span class="sourceLineNo">207</span><a name="line.207"></a>
+<span class="sourceLineNo">208</span>        default:<a name="line.208"></a>
+<span class="sourceLineNo">209</span>          bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>          bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      if (bestAnyRegionSize &gt; 2 * bestFlushableRegionSize) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        // Even if it's not supposed to be flushed, pick a region if it's more than twice<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        // as big as the best flushable one - otherwise when we're under pressure we make<a name="line.214"></a>
+<span class="sourceLineNo">215</span>        // lots of little flushes and cause lots of compactions, etc, which just makes<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        // life worse!<a name="line.216"></a>
+<span class="sourceLineNo">217</span>        if (LOG.isDebugEnabled()) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          LOG.debug("Under global heap pressure: " + "Region "<a name="line.218"></a>
+<span class="sourceLineNo">219</span>              + bestAnyRegion.getRegionInfo().getRegionNameAsString()<a name="line.219"></a>
+<span class="sourceLineNo">220</span>              + " has too many " + "store files, but is "<a name="line.220"></a>
+<span class="sourceLineNo">221</span>              + TraditionalBinaryPrefix.long2String(bestAnyRegionSize, "", 1)<a name="line.221"></a>
+<span class="sourceLineNo">222</span>              + " vs best flushable region's "<a name="line.222"></a>
+<span class="sourceLineNo">223</span>              + TraditionalBinaryPrefix.long2String(<a name="line.223"></a>
+<span class="sourceLineNo">224</span>              bestFlushableRegionSize, "", 1)<a name="line.224"></a>
+<span class="sourceLineNo">225</span>              + ". Choosing the bigger.");<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        regionToFlush = bestAnyRegion;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      } else {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        if (bestFlushableRegion == null) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>          regionToFlush = bestAnyRegion;<a name="line.230"></a>
+<span class="sourceLineNo">231</span>        } else {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>          regionToFlush = bestFlushableRegion;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        }<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>      long regionToFlushSize;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      long bestRegionReplicaSize;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      switch(flushType) {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        case ABOVE_OFFHEAP_HIGHER_MARK:<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        case ABOVE_OFFHEAP_LOWER_MARK:<a name="line.240"></a>
+<span class="sourceLineNo">241</span>          regionToFlushSize = regionToFlush.getMemStoreOffHeapSize();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          bestRegionReplicaSize = getMemStoreOffHeapSize(bestRegionReplica);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>          break;<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>        case ABOVE_ONHEAP_HIGHER_MARK:<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        case ABOVE_ONHEAP_LOWER_MARK:<a name="line.246"></a>
+<span class="sourceLineNo">247</span>          regionToFlushSize = regionToFlush.getMemStoreHeapSize();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          bestRegionReplicaSize = getMemStoreHeapSize(bestRegionReplica);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>          break;<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>        default:<a name="line.251"></a>
+<span class="sourceLineNo">252</span>          regionToFlushSize = regionToFlush.getMemStoreDataSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          bestRegionReplicaSize = getMemStoreDataSize(bestRegionReplica);<a name="line.253"></a>
+<span class="sourceLineNo">254</span>      }<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>      if ((regionToFlush == null || regionToFlushSize == 0) &amp;&amp; bestRegionReplicaSize == 0) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>        // A concurrency issue (such as splitting region) may happen such that the online region<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        // getBiggestMemStoreRegion(). This means that we can come out of the loop<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        LOG.debug("Above memory mark but there is no flushable region");<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return false;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (regionToFlush == null ||<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          (bestRegionReplica != null &amp;&amp;<a name="line.265"></a>
+<span class="sourceLineNo">266</span>           ServerRegionReplicaUtil.isRegionReplicaStoreFileRefreshEnabled(conf) &amp;&amp;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>           (bestRegionReplicaSize &gt; secondaryMultiplier * regionToFlushSize))) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        LOG.info("Refreshing storefiles of region " + bestRegionReplica +<a name="line.268"></a>
+<span class="sourceLineNo">269</span>            " due to global heap pressure. Total memstore off heap size=" +<a name="line.269"></a>
+<span class="sourceLineNo">270</span>            TraditionalBinaryPrefix.long2String(<a name="line.270"></a>
+<span class="sourceLineNo">271</span>              server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            " memstore heap size=" + TraditionalBinaryPrefix.long2String(<a name="line.272"></a>
+<span class="sourceLineNo">273</span>              server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1));<a name="line.273"></a>
+<span class="sourceLineNo">274</span>        flushedOne = refreshStoreFilesAndReclaimMemory(bestRegionReplica);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>        if (!flushedOne) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          LOG.info("Excluding secondary region " + bestRegionReplica +<a name="line.276"></a>
+<span class="sourceLineNo">277</span>              " - trying to find a different region to refresh files.");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>          excludedRegions.add(bestRegionReplica);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      } else {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        LOG.info("Flush of region " + regionToFlush + " due to global heap pressure. " +<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            "Flush type=" + flushType.toString() +<a name="line.282"></a>
+<span class="sourceLineNo">283</span>            "Total Memstore Heap size=" +<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            TraditionalBinaryPrefix.long2String(<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                server.getRegionServerAccounting().getGlobalMemStoreHeapSize(), "", 1) +<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            "Total Memstore Off-Heap size=" +<a name="line.286"></a>
+<span class="sourceLineNo">287</span>            TraditionalBinaryPrefix.long2String(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>                server.getRegionServerAccounting().getGlobalMemStoreOffHeapSize(), "", 1) +<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            ", Region memstore size=" +<a name="line.289"></a>
+<span class="sourceLineNo">290</span>            TraditionalBinaryPrefix.long2String(regionToFlushSize, "", 1));<a name="line.290"></a>
+<span class="sourceLineNo">291</span>        flushedOne = flushRegion(regionToFlush, true, false, FlushLifeCycleTracker.DUMMY);<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>        if (!flushedOne) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>          LOG.info("Excluding unflushable region " + regionToFlush +<a name="line.294"></a>
+<span class="sourceLineNo">295</span>              " - trying to find a different region to flush.");<a name="line.295"></a>
+<span class="sourceLineNo">296</span>          excludedRegions.add(regionToFlush);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>        }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    return true;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>  }<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * @return Return memstore offheap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private static long getMemStoreOffHeapSize(HRegion r) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    return r == null? 0: r.getMemStoreOffHeapSize();<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  }<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>  /**<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @return Return memstore heap size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private static long getMemStoreHeapSize(HRegion r) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    return r == null? 0: r.getMemStoreHeapSize();<a name="line.314"></a>
+<span class="sourceLineNo">315</span>  }<a name="line.315"></a>
+<span class="sourceLineNo">316</span><a name="line.316"></a>
+<span class="sourceLineNo">317</span>  /**<a name="line.317"></a>
+<span class="sourceLineNo">318</span>   * @return Return memstore data size or null if &lt;code&gt;r&lt;/code&gt; is null<a name="line.318"></a>
+<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  private static long getMemStoreDataSize(HRegion r) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    return r == null? 0: r.getMemStoreDataSize();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private class FlushHandler extends HasThread {<a name="line.324"></a>
 <span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    @Override<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    public void run() {<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      while (!server.isStopped()) {<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        FlushQueueEntry fqe = null;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>            FlushType type = isAboveLowWaterMark();<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            if (type != FlushType.NORMAL) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.337"></a>
-<span class="sourceLineNo">338</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.338"></a>
-<span class="sourceLineNo">339</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.339"></a>
-<span class="sourceLineNo">340</span>              // we still select the regions based on the region's memstore data size.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.341"></a>
-<span class="sourceLineNo">342</span>              // it per region.<a name="line.342"></a>
-<span class="sourceLineNo">343</span>              if (!flushOneForGlobalPressure()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                // This is unlikely to happen, but might happen when closing the<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                // entire server - another thread is flushing regions. We'll just<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                // we flushed one, so anyone blocked will check again<a name="line.348"></a>
-<span class="sourceLineNo">349</span>                Thread.sleep(1000);<a name="line.349"></a>
-<span class="sourceLineNo">350</span>                wakeUpIfBlocking();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.352"></a>
-<span class="sourceLineNo">353</span>              wakeupFlushThread();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>            }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            continue;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>          if (!flushRegion(fre)) {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>            break;<a name="line.359"></a>
+<span class="sourceLineNo">326</span>    private FlushHandler(String name) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      super(name);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    @Override<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    public void run() {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      while (!server.isStopped()) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        FlushQueueEntry fqe = null;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>          wakeupPending.set(false); // allow someone to wake us up again<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          fqe = flushQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          if (fqe == null || fqe == WAKEUPFLUSH_INSTANCE) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>            FlushType type = isAboveLowWaterMark();<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            if (type != FlushType.NORMAL) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>              LOG.debug("Flush thread woke up because memory above low water="<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                  + TraditionalBinaryPrefix.long2String(<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                    server.getRegionServerAccounting().getGlobalMemStoreLimitLowMark(), "", 1));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>              // For offheap memstore, even if the lower water mark was breached due to heap overhead<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              // we still select the regions based on the region's memstore data size.<a name="line.344"></a>
+<span class="sourceLineNo">345</span>              // TODO : If we want to decide based on heap over head it can be done without tracking<a name="line.345"></a>
+<span class="sourceLineNo">346</span>              // it per region.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              if (!flushOneForGlobalPressure()) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                // Wasn't able to flush any region, but we're above low water mark<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                // This is unlikely to happen, but might happen when closing the<a name="line.349"></a>
+<span class="sourceLineNo">350</span>                // entire server - another thread is flushing regions. We'll just<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                // sleep a little bit to avoid spinning, and then pretend that<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                // we flushed one, so anyone blocked will check again<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                Thread.sleep(1000);<a name="line.353"></a>
+<span class="sourceLineNo">354</span>                wakeUpIfBlocking();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>              }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>              // Enqueue another one of these tokens so we'll wake up again<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              wakeupFlushThread();<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            continue;<a name="line.359"></a>
 <span class="sourceLineNo">360</span>          }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        } catch (InterruptedException ex) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>          continue;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        } catch (ConcurrentModificationException ex) {<a name="line.363"></a>
-<span class="sourceLineNo">364</span>          continue;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        } catch (Exception ex) {<a name="line.365"></a>
-<span class="sourceLineNo">366</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>          if (!server.checkFileSystem()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>            break;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>          }<a name="line.369"></a>
-<span class="sourceLineNo">370</span>        }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      }<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      synchronized (regionsInQueue) {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>        regionsInQueue.clear();<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        flushQueue.clear();<a name="line.374"></a>
+<span class="sourceLineNo">361</span>          FlushRegionEntry fre = (FlushRegionEntry) fqe;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>          if (!flushRegion(fre)) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>            break;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>          }<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        } catch (InterruptedException ex) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>          continue;<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        } catch (ConcurrentModificationException ex) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>          continue;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        } catch (Exception ex) {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>          LOG.error("Cache flusher failed for entry " + fqe, ex);<a name="line.370"></a>
+<span class="sourceLineNo">371</span>          if (!server.checkFileSystem()) {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>            break;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>          }<a name="line.373"></a>
+<span class="sourceLineNo">374</span>        }<a name="line.374"></a>
 <span class="sourceLineNo">375</span>      }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>      // Signal anyone waiting, so they see the close flag<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      wakeUpIfBlocking();<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      LOG.info(getName() + " exiting");<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private void wakeupFlushThread() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    }<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  }<a name="line.388"></a>
-<span class="sourceLineNo">389</span><a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private HRegion getBiggestMemStoreRegion(<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      boolean checkStoreFileCount) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    synchronized (regionsInQueue) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>        for (HRegion region : entry.getValue()) {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          if (excludedRegions.contains(region)) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>            continue;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>          }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.401"></a>
+<span class="sourceLineNo">376</span>      synchronized (regionsInQueue) {<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        regionsInQueue.clear();<a name="line.377"></a>
+<span class="sourceLineNo">378</span>        flushQueue.clear();<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>      // Signal anyone waiting, so they see the close flag<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      wakeUpIfBlocking();<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      LOG.info(getName() + " exiting");<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span><a name="line.387"></a>
+<span class="sourceLineNo">388</span>  private void wakeupFlushThread() {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (wakeupPending.compareAndSet(false, true)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      flushQueue.add(WAKEUPFLUSH_INSTANCE);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>  }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>  private HRegion getBiggestMemStoreRegion(<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      Set&lt;HRegion&gt; excludedRegions,<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      boolean checkStoreFileCount) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    synchronized (regionsInQueue) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>        for (HRegion region : entry.getValue()) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>          if (excludedRegions.contains(region)) {<a name="line.401"></a>
 <span class="sourceLineNo">402</span>            continue;<a name="line.402"></a>
 <span class="sourceLineNo">403</span>          }<a name="line.403"></a>
 <span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.405"></a>
+<span class="sourceLineNo">405</span>          if (region.writestate.flushing || !region.writestate.writesEnabled) {<a name="line.405"></a>
 <span class="sourceLineNo">406</span>            continue;<a name="line.406"></a>
 <span class="sourceLineNo">407</span>          }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>          return region;<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    return null;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  }<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    synchronized (regionsInQueue) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>        for (HRegion region : entry.getValue()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          if (excludedRegions.contains(region)) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>            continue;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>          }<a name="line.423"></a>
-<span class="sourceLineNo">424</span><a name="line.424"></a>
-<span class="sourceLineNo">425</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.425"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>          if (checkStoreFileCount &amp;&amp; isTooManyStoreFiles(region)) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>            continue;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>          return region;<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return null;<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  private HRegion getBiggestMemStoreOfRegionReplica(<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      SortedMap&lt;Long, Collection&lt;HRegion&gt;&gt; regionsBySize,<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      Set&lt;HRegion&gt; excludedRegions) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    synchronized (regionsInQueue) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      for (Map.Entry&lt;Long, Collection&lt;HRegion&gt;&gt; entry : regionsBySize.entrySet()) {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        for (HRegion region : entry.getValue()) {<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          if (excludedRegions.contains(region)) {<a name="line.425"></a>
 <span class="sourceLineNo">426</span>            continue;<a name="line.426"></a>
 <span class="sourceLineNo">427</span>          }<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          return region;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    return null;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<a name="line.433"></a>
-<span class="sourceLineNo">434</span><a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    try {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      return region.refreshStoreFiles();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    } catch (IOException e) {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return false;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
-<span class="sourceLineNo">443</span><a name="line.443"></a>
-<span class="sourceLineNo">444</span>  /**<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * Return true if global memory usage is above the high watermark<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   */<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  private FlushType isAboveHighWaterMark() {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>  }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * Return true if we're above the low watermark<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private FlushType isAboveLowWaterMark() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>  @Override<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    r.incrementFlushesQueuedCount();<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    synchronized (regionsInQueue) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        // queue. It'll come out near immediately.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>        this.regionsInQueue.put(r, fqe);<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        this.flushQueue.add(fqe);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      } else {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      }<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  @Override<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    r.incrementFlushesQueuedCount();<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    synchronized (regionsInQueue) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        // This entry has some delay<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        FlushRegionEntry fqe =<a name="line.480"></a>
-<span class="sourceLineNo">481</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        fqe.requeue(delay);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        this.regionsInQueue.put(r, fqe);<a name="line.483"></a>
-<span class="sourceLineNo">484</span>        this.flushQueue.add(fqe);<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      }<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>  public int getFlushQueueSize() {<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    return flushQueue.size();<a name="line.490"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>          if (RegionReplicaUtil.isDefaultReplica(region.getRegionInfo())) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>            continue;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          return region;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>        }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    }<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return null;<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  private boolean refreshStoreFilesAndReclaimMemory(Region region) {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    try {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>      return region.refreshStoreFiles();<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    } catch (IOException e) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      LOG.warn("Refreshing store files failed with exception", e);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    return false;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>  /**<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * Return true if global memory usage is above the high watermark<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   */<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  private FlushType isAboveHighWaterMark() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    return server.getRegionServerAccounting().isAboveHighWaterMark();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
+<span class="sourceLineNo">454</span><a name="line.454"></a>
+<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
+<span class="sourceLineNo">456</span>   * Return true if we're above the low watermark<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
+<span class="sourceLineNo">458</span>  private FlushType isAboveLowWaterMark() {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    return server.getRegionServerAccounting().isAboveLowWaterMark();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  }<a name="line.460"></a>
+<span class="sourceLineNo">461</span><a name="line.461"></a>
+<span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  public void requestFlush(HRegion r, boolean forceFlushAllStores, FlushLifeCycleTracker tracker) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    r.incrementFlushesQueuedCount();<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    synchronized (regionsInQueue) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        // This entry has no delay so it will be added at the top of the flush<a name="line.467"></a>
+<span class="sourceLineNo">468</span>        // queue. It'll come out near immediately.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>        FlushRegionEntry fqe = new FlushRegionEntry(r, forceFlushAllStores, tracker);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        this.regionsInQueue.put(r, fqe);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        this.flushQueue.add(fqe);<a name="line.471"></a>
+<span class="sourceLineNo">472</span>      } else {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        tracker.notExecuted("Flush already requested on " + r);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      }<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    }<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  }<a name="line.476"></a>
+<span class="sourceLineNo">477</span><a name="line.477"></a>
+<span class="sourceLineNo">478</span>  @Override<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  public void requestDelayedFlush(HRegion r, long delay, boolean forceFlushAllStores) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    r.incrementFlushesQueuedCount();<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    synchronized (regionsInQueue) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      if (!regionsInQueue.containsKey(r)) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>        // This entry has some delay<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushRegionEntry fqe =<a name="line.484"></a>
+<span class="sourceLineNo">485</span>            new FlushRegionEntry(r, forceFlushAllStores, FlushLifeCycleTracker.DUMMY);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>        fqe.requeue(delay);<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        this.regionsInQueue.put(r, fqe);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>        this.flushQueue.add(fqe);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
 <span class="sourceLineNo">491</span>  }<a name="line.491"></a>
 <span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>  /**<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * Only interrupt once it's done with a run through the work loop.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  void interruptIfNecessary() {<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    lock.writeLock().lock();<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    try {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      for (FlushHandler flushHander : flushHandlers) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        if (flushHander != null) flushHander.interrupt();<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      }<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    } finally {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      lock.writeLock().unlock();<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  }<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>  synchronized void start(UncaughtExceptionHandler eh) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        server.getServerName().toShortString() + "-MemStoreFlusher", eh);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    for (int i = 0; i &lt; flushHandlers.length; i++) {<a name="line.510"></a>
-<span class="source

<TRUNCATED>

[25/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.PrepareFlushResult.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">

<TRUNCATED>

[03/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index f0d831a..81af282 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -3557,22 +3557,26 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestDeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestRecoverMetaProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestDeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestEnableTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestEnableTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestServerCrashProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestFastFailOnProcedureNotRegistered.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestFastFailOnProcedureNotRegistered.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestEnableTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestEnableTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestFastFailOnProcedureNotRegistered.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestFastFailOnProcedureNotRegistered.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestDeleteTableProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteTableProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>
@@ -4927,86 +4931,90 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSecureWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestSecureWALReplay.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALDurability.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestLogRollingNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSecureWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestSecureWALReplay.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestSequenceIdAccounting.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestSequenceIdAccounting.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestLogRollingNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestLogRollPeriod.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollPeriod.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestSequenceIdAccounting.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestSequenceIdAccounting.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncLogRolling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncLogRolling.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestLogRollPeriod.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollPeriod.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWALCellCodecWithCompression.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncLogRolling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncLogRolling.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWALActionsListener.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALCellCodecWithCompression.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALCellCodecWithCompression.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncWALReplay.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALActionsListener.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestFSHLog.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncWALReplay.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestProtobufLog.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestProtobufLog.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestFSHLog.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestFSHLog.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestProtobufLog.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestProtobufLog.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWALReplayBoundedLogWriterCreation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplay.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestWALReplayCompressed.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayCompressed.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALReplayBoundedLogWriterCreation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayBoundedLogWriterCreation.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncFSWAL.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncFSWAL.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALReplayCompressed.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALReplayCompressed.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCompressor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestCompressor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncFSWAL.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncFSWAL.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestAsyncLogRollPeriod.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncLogRollPeriod.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCompressor.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestCompressor.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestLogRollAbort.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollAbort.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestAsyncLogRollPeriod.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncLogRollPeriod.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestCustomWALCellCodec.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestCustomWALCellCodec.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestLogRollAbort.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollAbort.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestDurability.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestDurability.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestCustomWALCellCodec.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestCustomWALCellCodec.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestLogRolling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestDurability.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestDurability.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestLogRolling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestAsyncProtobufLog.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestAsyncProtobufLog.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
index e9edcac..53a9af9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseTestingUtility.html
@@ -2336,6 +2336,10 @@
 <td class="colLast"><span class="typeNameLabel">MasterProcedureSchedulerPerformanceEvaluation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureSchedulerPerformanceEvaluation.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestRecoverMetaProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestDeleteNamespaceProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/master/procedure/TestDeleteNamespaceProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
@@ -3119,37 +3123,41 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
-<td class="colLast"><span class="typeNameLabel">TestLogRollingNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">TestWALDurability.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALDurability.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestLogRollingNoCluster.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>(package private) static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractTestWALReplay.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestWALActionsListener.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestWALActionsListener.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractTestProtobufLog.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractTestProtobufLog.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractTestLogRolling.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractTestLogRollPeriod.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRollPeriod.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestLogRollAbort.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestLogRollAbort.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">AbstractTestFSWAL.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestDurability.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/TestDurability.html#TEST_UTIL">TEST_UTIL</a></span></code>&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.MyHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.MyHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.MyHRegion.html
index 7bf7b09..da7834c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.MyHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSideScanExcpetion.MyHRegion.html
@@ -163,7 +163,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL</code></li>
+<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_WAL_HSYNC, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL, WAL_HSYNC_CONF_KEY</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion.html
index 3719cd8..d1f659b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion.html
@@ -174,7 +174,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL</code></li>
+<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_WAL_HSYNC, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL, WAL_HSYNC_CONF_KEY</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html
index 183ec19..26e029b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/example/TestRefreshHFilesEndpoint.HRegionForRefreshHFilesEP.html
@@ -174,7 +174,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL</code></li>
+<code>conf, DEEP_OVERHEAD, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_WAL_HSYNC, FIXED_OVERHEAD, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, MAX_FLUSH_PER_CHANGES, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, stores, SYSTEM_CACHE_FLUSH_INTERVAL, WAL_HSYNC_CONF_KEY</code></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html
index 9f1950e..06ab617 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html
@@ -362,7 +362,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRITAssignmentManagerMetrics</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html#line.105">testRITAssignmentManagerMetrics</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/TestAssignmentManagerMetrics.html#line.106">testRITAssignmentManagerMetrics</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
index 918e0f4..df3349d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" target="_top">Frames</a></li>
@@ -348,7 +348,7 @@ implements org.apache.hadoop.hbase.coprocessor.RegionObserver, org.apache.hadoop
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html
new file mode 100644
index 0000000..7e4ef5a
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html
@@ -0,0 +1,406 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestRecoverMetaProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestRecoverMetaProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":10,"i2":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestRecoverMetaProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestRecoverMetaProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.master.procedure</div>
+<h2 title="Class TestRecoverMetaProcedure" class="title">Class TestRecoverMetaProcedure</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.43">TestRecoverMetaProcedure</a>
+extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Field Summary table, listing fields, and an explanation">
+<caption><span>Fields</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Field and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.slf4j.Logger</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#LOG">LOG</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static <a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#TestRecoverMetaProcedure--">TestRecoverMetaProcedure</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#testPrepare--">testPrepare</a></span>()</code>
+<div class="block">Test the new prepare step.</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#testPrepareWithMasterStopping--">testPrepareWithMasterStopping</a></span>()</code>
+<div class="block">Test the new prepare step.</div>
+</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#testPrepareWithNoCluster--">testPrepareWithNoCluster</a></span>()</code>
+<div class="block">Test the new prepare step.</div>
+</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ============ FIELD DETAIL =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.detail">
+<!--   -->
+</a>
+<h3>Field Detail</h3>
+<a name="LOG">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>LOG</h4>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.44">LOG</a></pre>
+</li>
+</ul>
+<a name="CLASS_RULE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>CLASS_RULE</h4>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.46">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="UTIL">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>UTIL</h4>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.48">UTIL</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="TestRecoverMetaProcedure--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>TestRecoverMetaProcedure</h4>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.43">TestRecoverMetaProcedure</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="testPrepare--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testPrepare</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.56">testPrepare</a>()
+                 throws org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
+                        org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
+                        <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
+                        <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Test the new prepare step.
+ Here we test that our Mock is faking out the precedure well-enough for it to progress past the
+ first prepare stage.</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</code></dd>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureYieldException</code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testPrepareWithMasterStopping--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testPrepareWithMasterStopping</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.75">testPrepareWithMasterStopping</a>()
+                                   throws org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
+                                          org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
+                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
+                                          <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Test the new prepare step.
+ If Master is stopping, procedure should skip the assign by returning NO_MORE_STATE</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</code></dd>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureYieldException</code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="testPrepareWithNoCluster--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testPrepareWithNoCluster</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html#line.95">testPrepareWithNoCluster</a>()
+                              throws org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
+                                     org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
+                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
+                                     <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<div class="block">Test the new prepare step.
+ If cluster is down, procedure should skip the assign by returning NO_MORE_STATE</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</code></dd>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureYieldException</code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></code></dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestRecoverMetaProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestRecoverMetaProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&nbsp;|&nbsp;</li>
+<li><a href="#field.summary">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.summary">Method</a></li>
+</ul>
+<ul class="subNavList">
+<li>Detail:&nbsp;</li>
+<li><a href="#field.detail">Field</a>&nbsp;|&nbsp;</li>
+<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
index e621b3c..17cf3a8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -646,7 +646,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Test
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestRecoverMetaProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestRecoverMetaProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestRecoverMetaProcedure.html
new file mode 100644
index 0000000..8ded0e2
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/class-use/TestRecoverMetaProcedure.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/class-use/TestRecoverMetaProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestRecoverMetaProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure" class="title">Uses of Class<br>org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.master.procedure.TestRecoverMetaProcedure</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/class-use/TestRecoverMetaProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestRecoverMetaProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
index d6d86cb..08bebaf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
@@ -48,6 +48,7 @@
 <li><a href="TestProcedureAdmin.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestProcedureAdmin</a></li>
 <li><a href="TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestProcedurePriority</a></li>
 <li><a href="TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestProcedurePriority.MyCP</a></li>
+<li><a href="TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestRecoverMetaProcedure</a></li>
 <li><a href="TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestRestoreSnapshotProcedure</a></li>
 <li><a href="TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestSafemodeBringsDownMaster</a></li>
 <li><a href="TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">TestServerCrashProcedure</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
index 34d992f..2e70974 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
@@ -231,33 +231,37 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></td>
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRecoverMetaProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></td>
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestRestoreSnapshotProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestServerCrashProcedure</a></td>
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure">TestSafemodeBringsDownMaster</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDDLProcedureBase.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDDLProcedureBase</a></td>
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestServerCrashProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDDLProcedureBase.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDDLProcedureBase</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDescriptorModificationFromClient.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTableDescriptorModificationFromClient</a></td>
 <td class="colLast">
 <div class="block">Verify that the HTableDescriptor is updated after
  addColumn(), deleteColumn() and modifyTable() operations.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TestTruncateTableProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestWALProcedureStoreOnHDFS.html" title="class in org.apache.hadoop.hbase.master.procedure">TestWALProcedureStoreOnHDFS</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index 5687684..da83332 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -131,6 +131,7 @@
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedureAdmin.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestProcedureAdmin</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestProcedurePriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestProcedurePriority.MyCP</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestRecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestRecoverMetaProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestSafemodeBringsDownMaster.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestSafemodeBringsDownMaster</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestServerCrashProcedure</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TestTableDDLProcedureBase.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TestTableDDLProcedureBase</span></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 32e1bbd..baaaadc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -575,15 +575,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
index 28973e0..a1c9b1d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
@@ -81,14 +81,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Object</span></a>
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;)
+<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
 </ul>
 </li>
-<li type="circle">org.apache.hadoop.hbase.procedure.Procedure (implements java.util.concurrent.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;, org.apache.hadoop.hbase.errorhandling.ForeignExceptionListener)
+<li type="circle">org.apache.hadoop.hbase.procedure2.Procedure&lt;TEnvironment&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedure.LatchedProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedure.LatchedProcedure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure.<a href="../../../../../org/apache/hadoop/hbase/procedure/TestProcedureDescriber.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">TestProcedureDescriber.TestProcedure</span></a></li>
 </ul>
 </li>
 <li type="circle">org.apache.hadoop.hbase.procedure.ProcedureManager

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index e9c1d93..b72e392 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -205,9 +205,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
index 7d1d887..cb38612 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.MockHRegion.html
@@ -174,7 +174,7 @@ extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.regionserver.HRegion</h3>
-<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_CACHE_FLUSH_INTERVAL
 , timestampSlop, writeRequestsCount, writestate</code></li>
+<code>busyWaitDuration, checkAndMutateChecksFailed, checkAndMutateChecksPassed, closed, closing, compactionNumBytesCompacted, compactionNumFilesCompacted, compactionsFailed, compactionsFinished, compactionsQueued, conf, dataInMemoryWithoutWAL, DEEP_OVERHEAD, DEFAULT_BUSY_WAIT_DURATION, DEFAULT_CACHE_FLUSH_INTERVAL, DEFAULT_FLUSH_PER_CHANGES, DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE, DEFAULT_MAX_CELL_SIZE, DEFAULT_ROW_PROCESSOR_TIMEOUT, DEFAULT_ROWLOCK_WAIT_DURATION, DEFAULT_WAL_HSYNC, filteredReadRequestsCount, FIXED_OVERHEAD, flushesQueued, HBASE_MAX_CELL_SIZE_KEY, HBASE_REGIONSERVER_MINIBATCH_SIZE, lastReplayedCompactionSeqId, lastReplayedOpenRegionSeqId, LOAD_CFS_ON_DEMAND_CONFIG_KEY, lock, MAX_FLUSH_PER_CHANGES, maxBusyWaitDuration, maxBusyWaitMultiplier, maxCellSize, maxSeqIdInStores, MEMSTORE_FLUSH_PER_CHANGES, MEMSTORE_PERIODIC_FLUSH_INTERVAL, memstoreFlushSize, numMutationsWithoutWAL, readRequestsCount, rowProcessorExecutor, rowProcessorTimeout, rsServices, stores, SYSTEM_C
 ACHE_FLUSH_INTERVAL, timestampSlop, WAL_HSYNC_CONF_KEY, writeRequestsCount, writestate</code></li>
 </ul>
 </li>
 </ul>


[11/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
index 9971079..03c8b000 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/FSHLog.RingBufferExceptionHandler.html
@@ -49,1067 +49,1082 @@
 <span class="sourceLineNo">041</span>import org.apache.hadoop.fs.Path;<a name="line.41"></a>
 <span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.HConstants;<a name="line.42"></a>
 <span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.htrace.core.TraceScope;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.slf4j.Logger;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.slf4j.LoggerFactory;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>/**<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The default implementation of FSWAL.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> */<a name="line.65"></a>
-<span class="sourceLineNo">066</span>@InterfaceAudience.Private<a name="line.66"></a>
-<span class="sourceLineNo">067</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  // IMPLEMENTATION NOTES:<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  //<a name="line.69"></a>
-<span class="sourceLineNo">070</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.70"></a>
-<span class="sourceLineNo">071</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.71"></a>
-<span class="sourceLineNo">072</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.72"></a>
-<span class="sourceLineNo">073</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  // high writes/syncs.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  //<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  // the region edit/sequence id after the append returns.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  //<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  //<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // the futures when done.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  //<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  //<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  //<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>  /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.112"></a>
-<span class="sourceLineNo">113</span><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  /**<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.116"></a>
-<span class="sourceLineNo">117</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.117"></a>
-<span class="sourceLineNo">118</span>   * flushed out before we exit.<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   */<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.120"></a>
-<span class="sourceLineNo">121</span><a name="line.121"></a>
-<span class="sourceLineNo">122</span>  /**<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   */<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  private FSDataOutputStream hdfs_out;<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  // All about log rolling if not enough replicas outstanding.<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  private final int minTolerableReplication;<a name="line.130"></a>
-<span class="sourceLineNo">131</span><a name="line.131"></a>
-<span class="sourceLineNo">132</span>  // If live datanode count is lower than the default replicas value,<a name="line.132"></a>
-<span class="sourceLineNo">133</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private final int lowReplicationRollLimit;<a name="line.138"></a>
-<span class="sourceLineNo">139</span><a name="line.139"></a>
-<span class="sourceLineNo">140</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  // then disable the rolling in checkLowReplication().<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  // Enable it if the replications recover.<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /** Number of log close errors tolerated before we abort */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private final int closeErrorsTolerated;<a name="line.146"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.util.ClassSize;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.wal.FSHLogProvider;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hdfs.DFSOutputStream;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hdfs.client.HdfsDataOutputStream;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hdfs.protocol.DatanodeInfo;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.htrace.core.TraceScope;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.slf4j.Logger;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.slf4j.LoggerFactory;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
+<span class="sourceLineNo">065</span> * The default implementation of FSWAL.<a name="line.65"></a>
+<span class="sourceLineNo">066</span> */<a name="line.66"></a>
+<span class="sourceLineNo">067</span>@InterfaceAudience.Private<a name="line.67"></a>
+<span class="sourceLineNo">068</span>public class FSHLog extends AbstractFSWAL&lt;Writer&gt; {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  // IMPLEMENTATION NOTES:<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  //<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  // At the core is a ring buffer. Our ring buffer is the LMAX Disruptor. It tries to<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  // minimize synchronizations and volatile writes when multiple contending threads as is the case<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  // here appending and syncing on a single WAL. The Disruptor is configured to handle multiple<a name="line.73"></a>
+<span class="sourceLineNo">074</span>  // producers but it has one consumer only (the producers in HBase are IPC Handlers calling append<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  // and then sync). The single consumer/writer pulls the appends and syncs off the ring buffer.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  // When a handler calls sync, it is given back a future. The producer 'blocks' on the future so<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  // it does not return until the sync completes. The future is passed over the ring buffer from<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  // the producer/handler to the consumer thread where it does its best to batch up the producer<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  // syncs so one WAL sync actually spans multiple producer sync invocations. How well the<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  // batching works depends on the write rate; i.e. we tend to batch more in times of<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  // high writes/syncs.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  //<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  // Calls to append now also wait until the append has been done on the consumer side of the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  // disruptor. We used to not wait but it makes the implementation easier to grok if we have<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  // the region edit/sequence id after the append returns.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  //<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  // TODO: Handlers need to coordinate appending AND syncing. Can we have the threads contend<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // once only? Probably hard given syncs take way longer than an append.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  //<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // The consumer threads pass the syncs off to multiple syncing threads in a round robin fashion<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  // to ensure we keep up back-to-back FS sync calls (FS sync calls are the long poll writing the<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  // WAL). The consumer thread passes the futures to the sync threads for it to complete<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  // the futures when done.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  //<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  // The 'sequence' in the below is the sequence of the append/sync on the ringbuffer. It<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  // acts as a sort-of transaction id. It is always incrementing.<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  //<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  // The RingBufferEventHandler class hosts the ring buffer consuming code. The threads that<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  // do the actual FS sync are implementations of SyncRunner. SafePointZigZagLatch is a<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  // synchronization class used to halt the consumer at a safe point -- just after all outstanding<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  // syncs and appends have completed -- so the log roller can swap the WAL out under it.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  //<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  // We use ring buffer sequence as txid of FSWALEntry and SyncFuture.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  private static final Logger LOG = LoggerFactory.getLogger(FSHLog.class);<a name="line.104"></a>
+<span class="sourceLineNo">105</span><a name="line.105"></a>
+<span class="sourceLineNo">106</span>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * The nexus at which all incoming handlers meet. Does appends and sync with an ordering. Appends<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   * and syncs are each put on the ring which means handlers need to smash up against the ring twice<a name="line.108"></a>
+<span class="sourceLineNo">109</span>   * (can we make it once only? ... maybe not since time to append is so different from time to sync<a name="line.109"></a>
+<span class="sourceLineNo">110</span>   * and sometimes we don't want to sync or we want to async the sync). The ring is where we make<a name="line.110"></a>
+<span class="sourceLineNo">111</span>   * sure of our ordering and it is also where we do batching up of handler sync calls.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   */<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  private final Disruptor&lt;RingBufferTruck&gt; disruptor;<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  /**<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   * This fellow is run by the above appendExecutor service but it is all about batching up appends<a name="line.116"></a>
+<span class="sourceLineNo">117</span>   * and syncs; it may shutdown without cleaning out the last few appends or syncs. To guard against<a name="line.117"></a>
+<span class="sourceLineNo">118</span>   * this, keep a reference to this handler and do explicit close on way out to make sure all<a name="line.118"></a>
+<span class="sourceLineNo">119</span>   * flushed out before we exit.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  private final RingBufferEventHandler ringBufferEventHandler;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * FSDataOutputStream associated with the current SequenceFile.writer<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   */<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  private FSDataOutputStream hdfs_out;<a name="line.126"></a>
+<span class="sourceLineNo">127</span><a name="line.127"></a>
+<span class="sourceLineNo">128</span>  // All about log rolling if not enough replicas outstanding.<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  // Minimum tolerable replicas, if the actual value is lower than it, rollWriter will be triggered<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private final int minTolerableReplication;<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>  private final boolean useHsync;<a name="line.133"></a>
+<span class="sourceLineNo">134</span><a name="line.134"></a>
+<span class="sourceLineNo">135</span>  // If live datanode count is lower than the default replicas value,<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  // RollWriter will be triggered in each sync(So the RollWriter will be<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  // triggered one by one in a short time). Using it as a workaround to slow<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  // down the roll frequency triggered by checkLowReplication().<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private final AtomicInteger consecutiveLogRolls = new AtomicInteger(0);<a name="line.139"></a>
+<span class="sourceLineNo">140</span><a name="line.140"></a>
+<span class="sourceLineNo">141</span>  private final int lowReplicationRollLimit;<a name="line.141"></a>
+<span class="sourceLineNo">142</span><a name="line.142"></a>
+<span class="sourceLineNo">143</span>  // If consecutiveLogRolls is larger than lowReplicationRollLimit,<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  // then disable the rolling in checkLowReplication().<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  // Enable it if the replications recover.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  private volatile boolean lowReplicationRollEnabled = true;<a name="line.146"></a>
 <span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.148"></a>
-<span class="sourceLineNo">149</span><a name="line.149"></a>
-<span class="sourceLineNo">150</span>  /**<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   * using our logger instead of java native logger.<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>    @Override<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      throw new RuntimeException(ex);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>    @Override<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public void handleOnStartException(Throwable ex) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      LOG.error(ex.toString(), ex);<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      throw new RuntimeException(ex);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    }<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      LOG.error(ex.toString(), ex);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      throw new RuntimeException(ex);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    }<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  }<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>  /**<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * Constructor.<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   * @param fs filesystem handle<a name="line.177"></a>
-<span class="sourceLineNo">178</span>   * @param root path for stored and archived wals<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * @param logDir dir where wals are stored<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * @param conf configuration to use<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      throws IOException {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  }<a name="line.185"></a>
-<span class="sourceLineNo">186</span><a name="line.186"></a>
-<span class="sourceLineNo">187</span>  /**<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * by the time the WAL object is started up.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param fs filesystem handle<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * @param rootDir path to where logs and oldlogs<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * @param logDir dir where wals are stored<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * @param archiveDir dir where wals are archived<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * @param conf configuration to use<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   *          exist.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      5);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    rollWriter();<a name="line.216"></a>
+<span class="sourceLineNo">148</span>  /** Number of log close errors tolerated before we abort */<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private final int closeErrorsTolerated;<a name="line.149"></a>
+<span class="sourceLineNo">150</span><a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private final AtomicInteger closeErrorCount = new AtomicInteger();<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  /**<a name="line.153"></a>
+<span class="sourceLineNo">154</span>   * Exception handler to pass the disruptor ringbuffer. Same as native implementation only it logs<a name="line.154"></a>
+<span class="sourceLineNo">155</span>   * using our logger instead of java native logger.<a name="line.155"></a>
+<span class="sourceLineNo">156</span>   */<a name="line.156"></a>
+<span class="sourceLineNo">157</span>  static class RingBufferExceptionHandler implements ExceptionHandler&lt;RingBufferTruck&gt; {<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>    @Override<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    public void handleEventException(Throwable ex, long sequence, RingBufferTruck event) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("Sequence=" + sequence + ", event=" + event, ex);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      throw new RuntimeException(ex);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    }<a name="line.163"></a>
+<span class="sourceLineNo">164</span><a name="line.164"></a>
+<span class="sourceLineNo">165</span>    @Override<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    public void handleOnStartException(Throwable ex) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      LOG.error(ex.toString(), ex);<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      throw new RuntimeException(ex);<a name="line.168"></a>
+<span class="sourceLineNo">169</span>    }<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    @Override<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    public void handleOnShutdownException(Throwable ex) {<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      LOG.error(ex.toString(), ex);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      throw new RuntimeException(ex);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
+<span class="sourceLineNo">177</span><a name="line.177"></a>
+<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * Constructor.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param fs filesystem handle<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * @param root path for stored and archived wals<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param logDir dir where wals are stored<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @param conf configuration to use<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public FSHLog(final FileSystem fs, final Path root, final String logDir, final Configuration conf)<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      throws IOException {<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    this(fs, root, logDir, HConstants.HREGION_OLDLOGDIR_NAME, conf, null, true, null, null);<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  }<a name="line.188"></a>
+<span class="sourceLineNo">189</span><a name="line.189"></a>
+<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * Create an edit log at the given &lt;code&gt;dir&lt;/code&gt; location. You should never have to load an<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * existing log. If there is a log at startup, it should have already been processed and deleted<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * by the time the WAL object is started up.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param fs filesystem handle<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @param rootDir path to where logs and oldlogs<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @param logDir dir where wals are stored<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * @param archiveDir dir where wals are archived<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * @param conf configuration to use<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @param listeners Listeners on WAL events. Listeners passed here will be registered before we do<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   *          anything else; e.g. the Constructor {@link #rollWriter()}.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * @param failIfWALExists If true IOException will be thrown if files related to this wal already<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   *          exist.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param prefix should always be hostname and port in distributed env and it will be URL encoded<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   *          before being used. If prefix is null, "wal" will be used<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   * @param suffix will be url encoded. null is treated as empty. non-empty must start with<a name="line.205"></a>
+<span class="sourceLineNo">206</span>   *          {@link org.apache.hadoop.hbase.wal.AbstractFSWALProvider#WAL_FILE_NAME_DELIMITER}<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
+<span class="sourceLineNo">208</span>  public FSHLog(final FileSystem fs, final Path rootDir, final String logDir,<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final String archiveDir, final Configuration conf, final List&lt;WALActionsListener&gt; listeners,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      final boolean failIfWALExists, final String prefix, final String suffix) throws IOException {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    super(fs, rootDir, logDir, archiveDir, conf, listeners, failIfWALExists, prefix, suffix);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    this.minTolerableReplication = conf.getInt("hbase.regionserver.hlog.tolerable.lowreplication",<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      FSUtils.getDefaultReplication(fs, this.walDir));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    this.lowReplicationRollLimit = conf.getInt("hbase.regionserver.hlog.lowreplication.rolllimit",<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      5);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    this.closeErrorsTolerated = conf.getInt("hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.216"></a>
 <span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    // put on the ring buffer.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // spinning as other strategies do.<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    this.disruptor.getRingBuffer().next();<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    this.disruptor.start();<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  }<a name="line.236"></a>
-<span class="sourceLineNo">237</span><a name="line.237"></a>
-<span class="sourceLineNo">238</span>  /**<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.240"></a>
-<span class="sourceLineNo">241</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.241"></a>
-<span class="sourceLineNo">242</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.242"></a>
-<span class="sourceLineNo">243</span>   * removed.<a name="line.243"></a>
-<span class="sourceLineNo">244</span>   * @return null if underlying stream is not ready.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  @VisibleForTesting<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  OutputStream getOutputStream() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * Run a sync after opening to set up the pipeline.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
-<span class="sourceLineNo">255</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    long startTimeNanos = System.nanoTime();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    try {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      nextWriter.sync();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    } catch (IOException e) {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      // optimization failed, no need to abort here.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>  /**<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * methods like rollWriter().<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   * @return Writer instance<a name="line.269"></a>
-<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  @Override<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    return writer;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
-<span class="sourceLineNo">279</span><a name="line.279"></a>
-<span class="sourceLineNo">280</span>  /**<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @see #beforeWaitOnSafePoint()<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   */<a name="line.283"></a>
-<span class="sourceLineNo">284</span>  @VisibleForTesting<a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected void afterCreatingZigZagLatch() {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  /**<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @see #afterCreatingZigZagLatch()<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @VisibleForTesting<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  protected void beforeWaitOnSafePoint() {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  }<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  @Override<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    writer.append(entry);<a name="line.297"></a>
+<span class="sourceLineNo">218</span>    this.useHsync = conf.getBoolean(HRegion.WAL_HSYNC_CONF_KEY, HRegion.DEFAULT_WAL_HSYNC);<a name="line.218"></a>
+<span class="sourceLineNo">219</span><a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // rollWriter sets this.hdfs_out if it can.<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    rollWriter();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>    // This is the 'writer' -- a single threaded executor. This single thread 'consumes' what is<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // put on the ring buffer.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    String hostingThreadName = Thread.currentThread().getName();<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    // Using BlockingWaitStrategy. Stuff that is going on here takes so long it makes no sense<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    // spinning as other strategies do.<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    this.disruptor = new Disruptor&lt;&gt;(RingBufferTruck::new,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        getPreallocatedEventCount(), Threads.getNamedThreadFactory(hostingThreadName + ".append"),<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        ProducerType.MULTI, new BlockingWaitStrategy());<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    // Advance the ring buffer sequence so that it starts from 1 instead of 0,<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    // because SyncFuture.NOT_DONE = 0.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    this.disruptor.getRingBuffer().next();<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    int maxHandlersCount = conf.getInt(HConstants.REGION_SERVER_HANDLER_COUNT, 200);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    this.ringBufferEventHandler = new RingBufferEventHandler(<a name="line.235"></a>
+<span class="sourceLineNo">236</span>        conf.getInt("hbase.regionserver.hlog.syncer.count", 5), maxHandlersCount);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this.disruptor.setDefaultExceptionHandler(new RingBufferExceptionHandler());<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    this.disruptor.handleEventsWith(new RingBufferEventHandler[] { this.ringBufferEventHandler });<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Starting up threads in constructor is a no no; Interface should have an init call.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    this.disruptor.start();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  /**<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * Currently, we need to expose the writer's OutputStream to tests so that they can manipulate the<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   * default behavior (such as setting the maxRecoveryErrorCount value for example (see<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   * {@see org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay#testReplayEditsWrittenIntoWAL()}). This is<a name="line.246"></a>
+<span class="sourceLineNo">247</span>   * done using reflection on the underlying HDFS OutputStream. NOTE: This could be removed once Hadoop1 support is<a name="line.247"></a>
+<span class="sourceLineNo">248</span>   * removed.<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * @return null if underlying stream is not ready.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   */<a name="line.250"></a>
+<span class="sourceLineNo">251</span>  @VisibleForTesting<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  OutputStream getOutputStream() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    FSDataOutputStream fsdos = this.hdfs_out;<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return fsdos != null ? fsdos.getWrappedStream() : null;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  /**<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * Run a sync after opening to set up the pipeline.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>  private void preemptiveSync(final ProtobufLogWriter nextWriter) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    long startTimeNanos = System.nanoTime();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    try {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      nextWriter.sync(useHsync);<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      postSync(System.nanoTime() - startTimeNanos, 0);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    } catch (IOException e) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      // optimization failed, no need to abort here.<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      LOG.warn("pre-sync failed but an optimization so keep going", e);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  }<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>  /**<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * This method allows subclasses to inject different writers without having to extend other<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   * methods like rollWriter().<a name="line.273"></a>
+<span class="sourceLineNo">274</span>   * @return Writer instance<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  protected Writer createWriterInstance(final Path path) throws IOException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    Writer writer = FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    if (writer instanceof ProtobufLogWriter) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      preemptiveSync((ProtobufLogWriter) writer);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    }<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return writer;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  }<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>  /**<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * Used to manufacture race condition reliably. For testing only.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   * @see #beforeWaitOnSafePoint()<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   */<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  protected void afterCreatingZigZagLatch() {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * @see #afterCreatingZigZagLatch()<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   */<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  @VisibleForTesting<a name="line.296"></a>
+<span class="sourceLineNo">297</span>  protected void beforeWaitOnSafePoint() {<a name="line.297"></a>
 <span class="sourceLineNo">298</span>  }<a name="line.298"></a>
 <span class="sourceLineNo">299</span><a name="line.299"></a>
 <span class="sourceLineNo">300</span>  @Override<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    // here; allow for that.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    SyncFuture syncFuture = null;<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    long sequence = -1L;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (this.ringBufferEventHandler != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Considering below sequence<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      // on safePointReleasedLatch<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.316"></a>
-<span class="sourceLineNo">317</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.318"></a>
-<span class="sourceLineNo">319</span>      sequence = getSequenceOnRingBuffer();<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    }<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    afterCreatingZigZagLatch();<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    try {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      try {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        if (zigzagLatch != null) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          // use assert to make sure no change breaks the logic that<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          // sequence and zigzagLatch will be set together<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.333"></a>
-<span class="sourceLineNo">334</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.334"></a>
-<span class="sourceLineNo">335</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence));<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        }<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      } catch (FailedSyncBeforeLogCloseException e) {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>        // If unflushed/unsynced entries on close, it is reason to abort.<a name="line.338"></a>
-<span class="sourceLineNo">339</span>        if (isUnflushedEntries()) {<a name="line.339"></a>
-<span class="sourceLineNo">340</span>          throw e;<a name="line.340"></a>
+<span class="sourceLineNo">301</span>  protected void doAppend(Writer writer, FSWALEntry entry) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    writer.append(entry);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  @Override<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  protected void doReplaceWriter(Path oldPath, Path newPath, Writer nextWriter) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Ask the ring buffer writer to pause at a safe point. Once we do this, the writer<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // thread will eventually pause. An error hereafter needs to release the writer thread<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // regardless -- hence the finally block below. Note, this method is called from the FSHLog<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    // constructor BEFORE the ring buffer is set running so it is null on first time through<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    // here; allow for that.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    SyncFuture syncFuture = null;<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    SafePointZigZagLatch zigzagLatch = null;<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    long sequence = -1L;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    if (this.ringBufferEventHandler != null) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      // Get sequence first to avoid dead lock when ring buffer is full<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      // Considering below sequence<a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // 1. replaceWriter is called and zigzagLatch is initialized<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // 2. ringBufferEventHandler#onEvent is called and arrives at #attainSafePoint(long) then wait<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // on safePointReleasedLatch<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // 3. Since ring buffer is full, if we get sequence when publish sync, the replaceWriter<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      // thread will wait for the ring buffer to be consumed, but the only consumer is waiting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // replaceWriter thread to release safePointReleasedLatch, which causes a deadlock<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      sequence = getSequenceOnRingBuffer();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      zigzagLatch = this.ringBufferEventHandler.attainSafePoint();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    }<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    afterCreatingZigZagLatch();<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    try {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      // Wait on the safe point to be achieved. Send in a sync in case nothing has hit the<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      // ring buffer between the above notification of writer that we want it to go to<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      // 'safe point' and then here where we are waiting on it to attain safe point. Use<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      // 'sendSync' instead of 'sync' because we do not want this thread to block waiting on it<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      // to come back. Cleanup this syncFuture down below after we are ready to run again.<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        if (zigzagLatch != null) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          // use assert to make sure no change breaks the logic that<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          // sequence and zigzagLatch will be set together<a name="line.337"></a>
+<span class="sourceLineNo">338</span>          assert sequence &gt; 0L : "Failed to get sequence from ring buffer";<a name="line.338"></a>
+<span class="sourceLineNo">339</span>          TraceUtil.addTimelineAnnotation("awaiting safepoint");<a name="line.339"></a>
+<span class="sourceLineNo">340</span>          syncFuture = zigzagLatch.waitSafePoint(publishSyncOnRingBuffer(sequence, false));<a name="line.340"></a>
 <span class="sourceLineNo">341</span>        }<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        LOG.warn(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          "Failed sync-before-close but no outstanding appends; closing WAL" + e.getMessage());<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      long oldFileLen = 0L;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      // It is at the safe point. Swap out writer from under the blocked writer thread.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      // TODO: This is close is inline with critical section. Should happen in background?<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      if (this.writer != null) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>        oldFileLen = this.writer.getLength();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        try {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          TraceUtil.addTimelineAnnotation("closing writer");<a name="line.351"></a>
-<span class="sourceLineNo">352</span>          this.writer.close();<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          TraceUtil.addTimelineAnnotation("writer closed");<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          this.closeErrorCount.set(0);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>        } catch (IOException ioe) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          int errors = closeErrorCount.incrementAndGet();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (!isUnflushedEntries() &amp;&amp; (errors &lt;= this.closeErrorsTolerated)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>            LOG.warn("Riding over failed WAL close of " + oldPath + ", cause=\"" + ioe.getMessage()<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                + "\", errors=" + errors<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                + "; THIS FILE WAS NOT CLOSED BUT ALL EDITS SYNCED SO SHOULD BE OK");<a name="line.360"></a>
-<span class="sourceLineNo">361</span>          } else {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            throw ioe;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>          }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        }<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
-<span class="sourceLineNo">366</span>      logRollAndSetupWalProps(oldPath, newPath, oldFileLen);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>      this.writer = nextWriter;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      if (nextWriter != null &amp;&amp; nextWriter instanceof ProtobufLogWriter) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>        this.hdfs_out = ((ProtobufLogWriter) nextWriter).getStream();<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        this.hdfs_out = null;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    } catch (InterruptedException ie) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>      // Perpetuate the interrupt<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      Thread.currentThread().interrupt();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    } catch (IOException e) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      long count = getUnflushedEntriesCount();<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      LOG.error("Failed close of WAL writer " + oldPath + ", unflushedEntries=" + count, e);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      throw new FailedLogCloseException(oldPath + ", unflushedEntries=" + count, e);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    } finally {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      // Let the writer thread go regardless, whether error or not.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>      if (zigzagLatch != null) {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        zigzagLatch.releaseSafePoint();<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        // syncFuture will be null if we failed our wait on safe point above. Otherwise, if<a name="line.384"></a>
-<span class="sourceLineNo">385</span>        // latch was obtained successfully, the sync we threw in either trigger the latch or it<a name="line.385"></a>
-<span class="sourceLineNo">386</span>        // got stamped with an exception because the WAL was damaged and we could not sync. Now<a name="line.386"></a>
-<span class="sourceLineNo">387</span>        // the write pipeline has been opened up again by releasing the safe point, process the<a name="line.387"></a>
-<span class="sourceLineNo">388</span>        // syncFuture we got above. This is probably a noop but it may be stale exception from<a name="line.388"></a>
-<span class="sourceLineNo">389</span>        // when old WAL was in place. Catch it if so.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        if (syncFuture != null) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>          try {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>            blockOnSync(syncFuture);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>          } catch (IOException ioe) {<a name="line.393"></a>
-<span class="sourceLineNo">394</span>            if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>              LOG.trace("Stale sync exception", ioe);<a name="line.395"></a>
-<span class="sourceLineNo">396</span>            }<a name="line.396"></a>
-<span class="sourceLineNo">397</span>          }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        }<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  }<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  @Override<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  protected void doShutdown() throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    // Shutdown the disruptor. Will stop after all entries have been processed. Make sure we<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    // have stopped incoming appends before calling this else it will not shutdown. We are<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // conservative below waiting a long time and if not elapsed, then halting.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    if (this.disruptor != null) {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      long timeoutms = conf.getLong("hbase.wal.disruptor.shutdown.timeout.ms", 60000);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        this.disruptor.shutdown(timeoutms, TimeUnit.MILLISECONDS);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      } catch (TimeoutException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>        LOG.warn("Timed out bringing down disruptor after " + timeoutms + "ms; forcing halt "<a name="line.413"></a>
-<span class="sourceLineNo">414</span>            + "(It is a problem if this is NOT an ABORT! -- DATALOSS!!!!)");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        this.disruptor.halt();<a name="line.415"></a>
-<span class="sourceLineNo">416</span>        this.disruptor.shutdown();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (LOG.isDebugEnabled()) {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      LOG.debug("Closing WAL writer in " + FSUtils.getPath(walDir));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    if (this.writer != null) {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      this.writer.close();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      this.writer = null;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    }<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>  @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "NP_NULL_ON_SOME_PATH_EXCEPTION",<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      justification = "Will never be null")<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public long append(final RegionInfo hri, final WALKeyImpl key, final WALEdit edits,<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      final boolean inMemstore) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    return stampSequenceIdAndPublishToRingBuffer(hri, key, edits, inMemstore,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      disruptor.getRingBuffer());<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  }<a name="line.436"></a>
-<span class="sourceLineNo">437</span><a name="line.437"></a>
-<span class="sourceLineNo">438</span>  /**<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * Thread to runs the hdfs sync call. This call takes a while to complete. This is the longest<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   * pole adding edits to the WAL and this must complete to be sure all edits persisted. We run<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * multiple threads sync'ng rather than one that just syncs in series so we have better latencies;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * otherwise, an edit that arrived just after a sync started, might have to wait almost the length<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * of two sync invocations before it is marked done.<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * &lt;p&gt;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * When the sync completes, it marks all the passed in futures done. On the other end of the sync<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * future is a blocked thread, usually a regionserver Handler. There may be more than one future<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   * passed in the case where a few threads arrive at about the same time and all invoke 'sync'. In<a name="line.447"></a>
-<span class="sourceLineNo">448</span>   * this case we'll batch up the invocations and run one filesystem sync only for a batch of<a name="line.448"></a>
-<span class="sourceLineNo">449</span>   * Handler sync invocations. Do not confuse these Handler SyncFutures with the futures an<a name="line.449"></a>
-<span class="sourceLineNo">450</span>   * ExecutorService returns when you call submit. We have no use for these in this model. These<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   * SyncFutures are 'artificial', something to hold the Handler until the filesystem sync<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * completes.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  private class SyncRunner extends HasThread {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    private volatile long sequence;<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    // Keep around last exception thrown. Clear on successful sync.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    private final BlockingQueue&lt;SyncFuture&gt; syncFutures;<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    private volatile SyncFuture takeSyncFuture = null;<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    SyncRunner(final String name, final int maxHandlersCount) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      super(name);<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      // LinkedBlockingQueue because of<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      // http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      // Could use other blockingqueues here or concurrent queues.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      //<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      // We could let the capacity be 'open' but bound it so we get alerted in pathological case<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      // where we cannot sync and we have a bunch of threads all backed up waiting on their syncs<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      // to come in. LinkedBlockingQueue actually shrinks when you remove elements so Q should<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      // stay neat and tidy in usual case. Let the max size be three times the maximum handlers.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      // The passed in maxHandlerCount is the user-level handlers which is what we put up most of<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      // but HBase has other handlers running too -- opening region handlers which want to write<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      // the meta table when succesful (i.e. sync), closing handlers -- etc. These are usually<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      // much fewer in number than the user-space handlers so Q-size should be user handlers plus<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      // some space for these other handlers. Lets multiply by 3 for good-measure.<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this.syncFutures = new LinkedBlockingQueue&lt;&gt;(maxHandlersCount * 3);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    }<a name="line.476"></a>
-<span class="sourceLineNo">477</span><a name="line.477"></a>
-<span class="sourceLineNo">478</span>    void offer(final long sequence, final SyncFuture[] syncFutures, final int syncFutureCount) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      // Set sequence first because the add to the queue will wake the thread if sleeping.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      this.sequence = sequence;<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      for (int i = 0; i &lt; syncFutureCount; ++i) {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        this.syncFutures.add(syncFutures[i]);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>      }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    }<a name="line.484"></a>
-<span class="sourceLineNo">485</span><a name="line.485"></a>
-<span class="sourceLineNo">486</span>    /**<a name="line.486"></a>
-<span class="sourceLineNo">487</span>     * Release the passed &lt;code&gt;syncFuture&lt;/code&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>     * @return Returns 1.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>     */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    private int releaseSyncFuture(final SyncFuture syncFuture, final long currentSequence,<a name="line.490"></a>
-<span class="sourceLineNo">491</span>        final Throwable t) {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      if (!syncFuture.done(currentSequence, t)) {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>        throw new IllegalStateException();<a name="line.493"></a>
-<span class="sourceLineNo">494</span>      }<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>      // This function releases one sync future only.<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      return 1;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
-<span class="sourceLineNo">499</span><a name="line.499"></a>
-<span class="sourceLineNo">500</span>    /**<a name="line.500"></a>
-<span class="sourceLineNo">501</span>     * Release all SyncFutures whose sequence is &lt;= &lt;code&gt;currentSequence&lt;/code&gt;.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>     * @param t May be non-null if we are processing SyncFutures because an exception was thrown.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>     * @return Count of SyncFutures we let go.<a name="line.503"></a>
-<span class="sourceLineNo">504</span>     */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    private int releaseSyncFutures(final long currentSequence, final Throwable t) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      int syncCount = 0;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      for (SyncFuture syncFuture; (syncFuture = this.syncFutures.peek()) != null;) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        if (syncFuture.getTxid() &gt; currentSequence) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>        }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        releaseSyncFuture(syncFuture, currentSequence, t);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>        if (!this.syncFutures.remove(syncFuture)) {<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          throw new IllegalStateException(syncFuture.toString());<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        }<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        syncCount++;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      return syncCount;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    }<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    /**<a name="line.520"></a>
-<span class="sourceLineNo">521</span>     * @param sequence The sequence we ran the filesystem sync against.<a name="line.521"></a>
-<span class="sourceLineNo">522</span>     * @return Current highest synced sequence.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>     */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    private long updateHighestSyncedSequence(long sequence) {<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      long currentHighestSyncedSequence;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // Set the highestSyncedSequence IFF our current sequence id is the 'highest'.<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      do {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        if (currentHighestSyncedSequence &gt;= sequence) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          // Set the sync number to current highwater mark; might be able to let go more<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          // queued sync futures<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          sequence = currentHighestSyncedSequence;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          break;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>        }<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      } while (!highestSyncedTxid.compareAndSet(currentHighestSyncedSequence, sequence));<a name="line.535"></a>
-<span class="sourceLineNo">536</span>      return sequence;<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    }<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    boolean areSyncFuturesReleased() {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>      // check whether there is no sync futures offered, and no in-flight sync futures that is being<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // processed.<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      return syncFutures.size() &lt;= 0<a name="line.542"></a>
-<span class="sourceLineNo">543</span>          &amp;&amp; takeSyncFuture == null;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>    @Override<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    public void run() {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>      long currentSequence;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>      while (!isInterrupted()) {<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        int syncCount = 0;<a name="line.550"></a>
-<span class="sourceLineNo">551</span><a name="line.551"></a>
-<span class="sourceLineNo">552</span>        try {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>          while (true) {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>            takeSyncFuture = null;<a name="line.554"></a>
-<span class="sourceLineNo">555</span>            // We have to process what we 'take' from the queue<a name="line.555"></a>
-<span class="sourceLineNo">556</span>            takeSyncFuture = this.syncFutures.take();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            currentSequence = this.sequence;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>            long syncFutureSequence = takeSyncFuture.getTxid();<a name="line.558"></a>
-<span class="sourceLineNo">559</span>            if (syncFutureSequence &gt; currentSequence) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>              throw new IllegalStateException("currentSequence=" + currentSequence<a name="line.560"></a>
-<span class="sourceLineNo">561</span>                  + ", syncFutureSequence=" + syncFutureSequence);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>            // See if we can process any syncfutures BEFORE we go sync.<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            long currentHighestSyncedSequence = highestSyncedTxid.get();<a name="line.564"></a>
-<span class="sourceLineNo">565</span>            if

<TRUNCATED>

[24/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.RegionScannerImpl.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</

<TRUNCATED>

[27/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.MutationBatchOperation.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span c

<TRUNCATED>

[19/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
index ecf500c..0cd5a4e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -238,8355 +238,8368 @@
 <span class="sourceLineNo">230</span>  public static final String HBASE_MAX_CELL_SIZE_KEY = "hbase.server.keyvalue.maxsize";<a name="line.230"></a>
 <span class="sourceLineNo">231</span>  public static final int DEFAULT_MAX_CELL_SIZE = 10485760;<a name="line.231"></a>
 <span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      "hbase.regionserver.minibatch.size";<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * This is the global default value for durability. All tables/mutations not<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.241"></a>
+<span class="sourceLineNo">233</span>  /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * This is the global default value for durability. All tables/mutations not<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * defining a durability or using USE_DEFAULT will default to this value.<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private static final Durability DEFAULT_DURABILITY = Durability.SYNC_WAL;<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public static final String HBASE_REGIONSERVER_MINIBATCH_SIZE =<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      "hbase.regionserver.minibatch.size";<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public static final int DEFAULT_HBASE_REGIONSERVER_MINIBATCH_SIZE = 20000;<a name="line.241"></a>
 <span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.246"></a>
-<span class="sourceLineNo">247</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>   * Once set, it is never cleared.<a name="line.248"></a>
-<span class="sourceLineNo">249</span>   */<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  /**<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * less that this sequence id.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   */<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>  /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   * replication.<a name="line.268"></a>
-<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
-<span class="sourceLineNo">270</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  // Members<a name="line.274"></a>
-<span class="sourceLineNo">275</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.275"></a>
-<span class="sourceLineNo">276</span><a name="line.276"></a>
-<span class="sourceLineNo">277</span>  // map from a locked row to the context for that lock including:<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  // - CountDownLatch for threads waiting on that row<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  // - reference count of (reentrant) locks held by the thread<a name="line.280"></a>
-<span class="sourceLineNo">281</span>  // - the row itself<a name="line.281"></a>
-<span class="sourceLineNo">282</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.283"></a>
-<span class="sourceLineNo">284</span><a name="line.284"></a>
-<span class="sourceLineNo">285</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.286"></a>
+<span class="sourceLineNo">243</span>  public static final String WAL_HSYNC_CONF_KEY = "hbase.wal.hsync";<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public static final boolean DEFAULT_WAL_HSYNC = false;<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  final AtomicBoolean closed = new AtomicBoolean(false);<a name="line.246"></a>
+<span class="sourceLineNo">247</span><a name="line.247"></a>
+<span class="sourceLineNo">248</span>  /* Closing can take some time; use the closing flag if there is stuff we don't<a name="line.248"></a>
+<span class="sourceLineNo">249</span>   * want to do while in closing state; e.g. like offer this region up to the<a name="line.249"></a>
+<span class="sourceLineNo">250</span>   * master as a region to close if the carrying regionserver is overloaded.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Once set, it is never cleared.<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  final AtomicBoolean closing = new AtomicBoolean(false);<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * The max sequence id of flushed data on this region. There is no edit in memory that is<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * less that this sequence id.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   */<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  private volatile long maxFlushedSeqId = HConstants.NO_SEQNUM;<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  /**<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   * Record the sequence id of last flush operation. Can be in advance of<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * {@link #maxFlushedSeqId} when flushing a single column family. In this case,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * {@link #maxFlushedSeqId} will be older than the oldest edit in memory.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  private volatile long lastFlushOpSeqId = HConstants.NO_SEQNUM;<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>  /**<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * The sequence id of the last replayed open region event from the primary region. This is used<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   * to skip entries before this due to the possibility of replay edits coming out of order from<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * replication.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  protected volatile long lastReplayedOpenRegionSeqId = -1L;<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  protected volatile long lastReplayedCompactionSeqId = -1L;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  // Members<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  //////////////////////////////////////////////////////////////////////////////<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  // map from a locked row to the context for that lock including:<a name="line.280"></a>
+<span class="sourceLineNo">281</span>  // - CountDownLatch for threads waiting on that row<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  // - the thread that owns the lock (allow reentrancy)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  // - reference count of (reentrant) locks held by the thread<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  // - the row itself<a name="line.284"></a>
+<span class="sourceLineNo">285</span>  private final ConcurrentHashMap&lt;HashedBytes, RowLockContext&gt; lockedRows =<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      new ConcurrentHashMap&lt;&gt;();<a name="line.286"></a>
 <span class="sourceLineNo">287</span><a name="line.287"></a>
-<span class="sourceLineNo">288</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.289"></a>
+<span class="sourceLineNo">288</span>  protected final Map&lt;byte[], HStore&gt; stores =<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      new ConcurrentSkipListMap&lt;&gt;(Bytes.BYTES_RAWCOMPARATOR);<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // Track data size in all memstores<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.293"></a>
-<span class="sourceLineNo">294</span><a name="line.294"></a>
-<span class="sourceLineNo">295</span>  // Debug possible data loss due to WAL off<a name="line.295"></a>
-<span class="sourceLineNo">296</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  // Debug why CAS operations are taking a while.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.300"></a>
-<span class="sourceLineNo">301</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  // Number of requests<a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // Count rows for scan<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  // Count rows for multi row mutations<a name="line.307"></a>
-<span class="sourceLineNo">308</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>  // Number of requests blocked by memstore size.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.311"></a>
+<span class="sourceLineNo">291</span>  // TODO: account for each registered handler in HeapSize computation<a name="line.291"></a>
+<span class="sourceLineNo">292</span>  private Map&lt;String, com.google.protobuf.Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  // Track data size in all memstores<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  private final MemStoreSizing memStoreSize = new MemStoreSizing();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  private final RegionServicesForStores regionServicesForStores = new RegionServicesForStores(this);<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  // Debug possible data loss due to WAL off<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  final LongAdder numMutationsWithoutWAL = new LongAdder();<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  final LongAdder dataInMemoryWithoutWAL = new LongAdder();<a name="line.300"></a>
+<span class="sourceLineNo">301</span><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  // Debug why CAS operations are taking a while.<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  final LongAdder checkAndMutateChecksPassed = new LongAdder();<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  final LongAdder checkAndMutateChecksFailed = new LongAdder();<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  // Number of requests<a name="line.306"></a>
+<span class="sourceLineNo">307</span>  // Count rows for scan<a name="line.307"></a>
+<span class="sourceLineNo">308</span>  final LongAdder readRequestsCount = new LongAdder();<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  final LongAdder filteredReadRequestsCount = new LongAdder();<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  // Count rows for multi row mutations<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  final LongAdder writeRequestsCount = new LongAdder();<a name="line.311"></a>
 <span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  // Compaction LongAdders<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>  private final WAL wal;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private final HRegionFileSystem fs;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  protected final Configuration conf;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  private final Configuration baseConf;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  private final int rowLockWaitDuration;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // The internal wait duration to acquire a lock before read/update<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  // we can release the IPC handler soon enough to improve the<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  // availability of the region server. It can be adjusted by<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  final long busyWaitDuration;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  // If updating multiple rows in one call, wait longer,<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  // we can limit the max multiplier.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>  final int maxBusyWaitMultiplier;<a name="line.340"></a>
-<span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  final long maxBusyWaitDuration;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  // in bytes<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  final long maxCellSize;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  // Number of mutations for minibatch processing.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final int miniBatchSize;<a name="line.351"></a>
+<span class="sourceLineNo">313</span>  // Number of requests blocked by memstore size.<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  private final LongAdder blockedRequestsCount = new LongAdder();<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>  // Compaction LongAdders<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  final LongAdder compactionsFinished = new LongAdder();<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  final LongAdder compactionsFailed = new LongAdder();<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  final LongAdder compactionNumFilesCompacted = new LongAdder();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>  final LongAdder compactionNumBytesCompacted = new LongAdder();<a name="line.320"></a>
+<span class="sourceLineNo">321</span>  final LongAdder compactionsQueued = new LongAdder();<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  final LongAdder flushesQueued = new LongAdder();<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>  private final WAL wal;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  private final HRegionFileSystem fs;<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  protected final Configuration conf;<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  private final Configuration baseConf;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  private final int rowLockWaitDuration;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>  static final int DEFAULT_ROWLOCK_WAIT_DURATION = 30000;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>  // The internal wait duration to acquire a lock before read/update<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  // from the region. It is not per row. The purpose of this wait time<a name="line.332"></a>
+<span class="sourceLineNo">333</span>  // is to avoid waiting a long time while the region is busy, so that<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  // we can release the IPC handler soon enough to improve the<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  // availability of the region server. It can be adjusted by<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  // tuning configuration "hbase.busy.wait.duration".<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  final long busyWaitDuration;<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  static final long DEFAULT_BUSY_WAIT_DURATION = HConstants.DEFAULT_HBASE_RPC_TIMEOUT;<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>  // If updating multiple rows in one call, wait longer,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>  // i.e. waiting for busyWaitDuration * # of rows. However,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  // we can limit the max multiplier.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  final int maxBusyWaitMultiplier;<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>  // Max busy wait duration. There is no point to wait longer than the RPC<a name="line.345"></a>
+<span class="sourceLineNo">346</span>  // purge timeout, when a RPC call will be terminated by the RPC engine.<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  final long maxBusyWaitDuration;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  // Max cell size. If nonzero, the maximum allowed size for any given cell<a name="line.349"></a>
+<span class="sourceLineNo">350</span>  // in bytes<a name="line.350"></a>
+<span class="sourceLineNo">351</span>  final long maxCellSize;<a name="line.351"></a>
 <span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  // negative number indicates infinite timeout<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  /**<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>  /**<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   * scan requests to this region. Requests can override it.<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   */<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.371"></a>
+<span class="sourceLineNo">353</span>  // Number of mutations for minibatch processing.<a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final int miniBatchSize;<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>  // negative number indicates infinite timeout<a name="line.356"></a>
+<span class="sourceLineNo">357</span>  static final long DEFAULT_ROW_PROCESSOR_TIMEOUT = 60 * 1000L;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  final ExecutorService rowProcessorExecutor = Executors.newCachedThreadPool();<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final ConcurrentHashMap&lt;RegionScanner, Long&gt; scannerReadPoints;<a name="line.360"></a>
+<span class="sourceLineNo">361</span><a name="line.361"></a>
+<span class="sourceLineNo">362</span>  /**<a name="line.362"></a>
+<span class="sourceLineNo">363</span>   * The sequence ID that was enLongAddered when this region was opened.<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   */<a name="line.364"></a>
+<span class="sourceLineNo">365</span>  private long openSeqNum = HConstants.NO_SEQNUM;<a name="line.365"></a>
+<span class="sourceLineNo">366</span><a name="line.366"></a>
+<span class="sourceLineNo">367</span>  /**<a name="line.367"></a>
+<span class="sourceLineNo">368</span>   * The default setting for whether to enable on-demand CF loading for<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * scan requests to this region. Requests can override it.<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  private boolean isLoadingCfsOnDemandDefault = false;<a name="line.371"></a>
 <span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>  //<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.375"></a>
-<span class="sourceLineNo">376</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  // are equal to or lower than maxSeqId for each store.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  // The following map is populated when opening the region<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  /** Saved state from replaying prepare flush cache */<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.382"></a>
+<span class="sourceLineNo">373</span>  private final AtomicInteger majorInProgress = new AtomicInteger(0);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>  private final AtomicInteger minorInProgress = new AtomicInteger(0);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>  //<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  // Context: During replay we want to ensure that we do not lose any data. So, we<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  // have to be conservative in how we replay wals. For each store, we calculate<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  // the maxSeqId up to which the store was flushed. And, skip the edits which<a name="line.379"></a>
+<span class="sourceLineNo">380</span>  // are equal to or lower than maxSeqId for each store.<a name="line.380"></a>
+<span class="sourceLineNo">381</span>  // The following map is populated when opening the region<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.382"></a>
 <span class="sourceLineNo">383</span><a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  // Used for testing.<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private volatile Long timeoutForWriteLock = null;<a name="line.387"></a>
+<span class="sourceLineNo">384</span>  /** Saved state from replaying prepare flush cache */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  private PrepareFlushResult prepareFlushResult = null;<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private volatile Optional&lt;ConfigurationManager&gt; configurationManager;<a name="line.387"></a>
 <span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  /**<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * region. Writes older than this readPoint, are included in every<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * read operation.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public long getSmallestReadPoint() {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    long minimumReadPoint;<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    synchronized (scannerReadPoints) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>          minimumReadPoint = readPoint;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>      }<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    }<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return minimumReadPoint;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  /*<a name="line.410"></a>
-<span class="sourceLineNo">411</span>   * Data structure of write state flags used coordinating flushes,<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   * compactions and closes.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   */<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  static class WriteState {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    // Set while a memstore flush is happening.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    volatile boolean flushing = false;<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    // Set when a flush has been requested.<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    volatile boolean flushRequested = false;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    // Number of compactions running.<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    volatile boolean writesEnabled = true;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    // Set if region is read-only<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    volatile boolean readOnly = false;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    volatile boolean readsEnabled = true;<a name="line.427"></a>
-<span class="sourceLineNo">428</span><a name="line.428"></a>
-<span class="sourceLineNo">429</span>    /**<a name="line.429"></a>
-<span class="sourceLineNo">430</span>     * Set flags that make this region read-only.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>     *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>     * @param onOff flip value for region r/o setting<a name="line.432"></a>
-<span class="sourceLineNo">433</span>     */<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      this.writesEnabled = !onOff;<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      this.readOnly = onOff;<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    boolean isReadOnly() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      return this.readOnly;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>    boolean isFlushRequested() {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      return this.flushRequested;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    }<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      this.readsEnabled = readsEnabled;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    }<a name="line.449"></a>
-<span class="sourceLineNo">450</span><a name="line.450"></a>
-<span class="sourceLineNo">451</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  }<a name="line.453"></a>
-<span class="sourceLineNo">454</span><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  /**<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.457"></a>
-<span class="sourceLineNo">458</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.458"></a>
-<span class="sourceLineNo">459</span>   * if it didn't flush.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   */<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  public static class FlushResultImpl implements FlushResult {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    final Result result;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    final String failureReason;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    final long flushSequenceId;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    final boolean wroteFlushWalMarker;<a name="line.465"></a>
-<span class="sourceLineNo">466</span><a name="line.466"></a>
-<span class="sourceLineNo">467</span>    /**<a name="line.467"></a>
-<span class="sourceLineNo">468</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.468"></a>
-<span class="sourceLineNo">469</span>     * null.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.471"></a>
-<span class="sourceLineNo">472</span>     *                        memstores.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>     */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      this(result, flushSequenceId, null, false);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
-<span class="sourceLineNo">479</span><a name="line.479"></a>
-<span class="sourceLineNo">480</span>    /**<a name="line.480"></a>
-<span class="sourceLineNo">481</span>     * Convenience constructor to use when we cannot flush.<a name="line.481"></a>
-<span class="sourceLineNo">482</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.482"></a>
-<span class="sourceLineNo">483</span>     * @param failureReason Reason why we couldn't flush.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>     */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
-<span class="sourceLineNo">491</span>     * Constructor with all the parameters.<a name="line.491"></a>
-<span class="sourceLineNo">492</span>     * @param result Any of the Result.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.493"></a>
-<span class="sourceLineNo">494</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>     */<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      boolean wroteFlushMarker) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      this.result = result;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      this.flushSequenceId = flushSequenceId;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      this.failureReason = failureReason;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
-<span class="sourceLineNo">503</span><a name="line.503"></a>
-<span class="sourceLineNo">504</span>    /**<a name="line.504"></a>
-<span class="sourceLineNo">505</span>     * Convenience method, the equivalent of checking if result is<a name="line.505"></a>
-<span class="sourceLineNo">506</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.506"></a>
-<span class="sourceLineNo">507</span>     * @return true if the memstores were flushed, else false.<a name="line.507"></a>
-<span class="sourceLineNo">508</span>     */<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    @Override<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    public boolean isFlushSucceeded() {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    }<a name="line.513"></a>
-<span class="sourceLineNo">514</span><a name="line.514"></a>
-<span class="sourceLineNo">515</span>    /**<a name="line.515"></a>
-<span class="sourceLineNo">516</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.517"></a>
-<span class="sourceLineNo">518</span>     */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    @Override<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    public boolean isCompactionNeeded() {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>    @Override<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    public String toString() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      return new StringBuilder()<a name="line.526"></a>
-<span class="sourceLineNo">527</span>        .append("flush result:").append(result).append(", ")<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.528"></a>
-<span class="sourceLineNo">529</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>    @Override<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    public Result getResult() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      return result;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    }<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /** A result object from prepare flush cache stage */<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  @VisibleForTesting<a name="line.539"></a>
-<span class="sourceLineNo">540</span>  static class PrepareFlushResult {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    final long startTime;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    final long flushOpSeqId;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    final long flushedSeqId;<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    final MemStoreSizing totalFlushableSize;<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>    /** Constructs an early exit case */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>    /** Constructs a successful prepare flush result */<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    PrepareFlushResult(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    }<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    private PrepareFlushResult(<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FlushResultImpl result,<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      this.result = result;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.committedFiles = committedFiles;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      this.startTime = startTime;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      this.flushOpSeqId = flushSeqId;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      this.flushedSeqId = flushedSeqId;<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>    public FlushResult getResult() {<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      return this.result;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    }<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  static class ObservedExceptionsInBatch {<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    private boolean wrongRegion = false;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    private boolean failedSanityCheck = false;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    private boolean wrongFamily = false;<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    /**<a name="line.594"></a>
-<span class="sourceLineNo">595</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>     */<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    boolean hasSeenWrongRegion() {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      return wrongRegion;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    }<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>    /**<a name="line.601"></a>
-<span class="sourceLineNo">602</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.602"></a>
-<span class="sourceLineNo">603</span>     */<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    void sawWrongRegion() {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      wrongRegion = true;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>    }<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>    /**<a name="line.608"></a>
-<span class="sourceLineNo">609</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.609"></a>
-<span class="sourceLineNo">610</span>     */<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    boolean hasSeenFailedSanityCheck() {<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return failedSanityCheck;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>    /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>     */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    void sawFailedSanityCheck() {<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      failedSanityCheck = true;<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    }<a name="line.620"></a>
-<span class="sourceLineNo">621</span><a name="line.621"></a>
-<span class="sourceLineNo">622</span>    /**<a name="line.622"></a>
-<span class="sourceLineNo">623</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>     */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    boolean hasSeenNoSuchFamily() {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      return wrongFamily;<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    }<a name="line.627"></a>
-<span class="sourceLineNo">628</span><a name="line.628"></a>
-<span class="sourceLineNo">629</span>    /**<a name="line.629"></a>
-<span class="sourceLineNo">630</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>     */<a name="line.631"></a>
-<span class="sourceLineNo">632</span>    void sawNoSuchFamily() {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      wrongFamily = true;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>  }<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>  final WriteState writestate = new WriteState();<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>  long memstoreFlushSize;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  final long timestampSlop;<a name="line.640"></a>
-<span class="sourceLineNo">641</span>  final long rowProcessorTimeout;<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.644"></a>
+<span class="sourceLineNo">389</span>  // Used for testing.<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  private volatile Long timeoutForWriteLock = null;<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
+<span class="sourceLineNo">393</span>   * @return The smallest mvcc readPoint across all the scanners in this<a name="line.393"></a>
+<span class="sourceLineNo">394</span>   * region. Writes older than this readPoint, are included in every<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * read operation.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   */<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  public long getSmallestReadPoint() {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    long minimumReadPoint;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    // We need to ensure that while we are calculating the smallestReadPoint<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // no new RegionScanners can grab a readPoint that we are unaware of.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    // We achieve this by synchronizing on the scannerReadPoints object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    synchronized (scannerReadPoints) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      minimumReadPoint = mvcc.getReadPoint();<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      for (Long readPoint : this.scannerReadPoints.values()) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (readPoint &lt; minimumReadPoint) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          minimumReadPoint = readPoint;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      }<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return minimumReadPoint;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>  }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>  /*<a name="line.413"></a>
+<span class="sourceLineNo">414</span>   * Data structure of write state flags used coordinating flushes,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * compactions and closes.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  static class WriteState {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    // Set while a memstore flush is happening.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    volatile boolean flushing = false;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    // Set when a flush has been requested.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    volatile boolean flushRequested = false;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    // Number of compactions running.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    AtomicInteger compacting = new AtomicInteger(0);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    // Gets set in close. If set, cannot compact or flush again.<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    volatile boolean writesEnabled = true;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    // Set if region is read-only<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    volatile boolean readOnly = false;<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    // whether the reads are enabled. This is different than readOnly, because readOnly is<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    // static in the lifetime of the region, while readsEnabled is dynamic<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    volatile boolean readsEnabled = true;<a name="line.430"></a>
+<span class="sourceLineNo">431</span><a name="line.431"></a>
+<span class="sourceLineNo">432</span>    /**<a name="line.432"></a>
+<span class="sourceLineNo">433</span>     * Set flags that make this region read-only.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>     *<a name="line.434"></a>
+<span class="sourceLineNo">435</span>     * @param onOff flip value for region r/o setting<a name="line.435"></a>
+<span class="sourceLineNo">436</span>     */<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    synchronized void setReadOnly(final boolean onOff) {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      this.writesEnabled = !onOff;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      this.readOnly = onOff;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    boolean isReadOnly() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      return this.readOnly;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    boolean isFlushRequested() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      return this.flushRequested;<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>    void setReadsEnabled(boolean readsEnabled) {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.readsEnabled = readsEnabled;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    }<a name="line.452"></a>
+<span class="sourceLineNo">453</span><a name="line.453"></a>
+<span class="sourceLineNo">454</span>    static final long HEAP_SIZE = ClassSize.align(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        ClassSize.OBJECT + 5 * Bytes.SIZEOF_BOOLEAN);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>  }<a name="line.456"></a>
+<span class="sourceLineNo">457</span><a name="line.457"></a>
+<span class="sourceLineNo">458</span>  /**<a name="line.458"></a>
+<span class="sourceLineNo">459</span>   * Objects from this class are created when flushing to describe all the different states that<a name="line.459"></a>
+<span class="sourceLineNo">460</span>   * that method ends up in. The Result enum describes those states. The sequence id should only<a name="line.460"></a>
+<span class="sourceLineNo">461</span>   * be specified if the flush was successful, and the failure message should only be specified<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * if it didn't flush.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   */<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  public static class FlushResultImpl implements FlushResult {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    final Result result;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    final String failureReason;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    final long flushSequenceId;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    final boolean wroteFlushWalMarker;<a name="line.468"></a>
+<span class="sourceLineNo">469</span><a name="line.469"></a>
+<span class="sourceLineNo">470</span>    /**<a name="line.470"></a>
+<span class="sourceLineNo">471</span>     * Convenience constructor to use when the flush is successful, the failure message is set to<a name="line.471"></a>
+<span class="sourceLineNo">472</span>     * null.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>     * @param result Expecting FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_COMPACTION_NEEDED.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>     * @param flushSequenceId Generated sequence id that comes right after the edits in the<a name="line.474"></a>
+<span class="sourceLineNo">475</span>     *                        memstores.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>     */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    FlushResultImpl(Result result, long flushSequenceId) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      this(result, flushSequenceId, null, false);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      assert result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.479"></a>
+<span class="sourceLineNo">480</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span><a name="line.482"></a>
+<span class="sourceLineNo">483</span>    /**<a name="line.483"></a>
+<span class="sourceLineNo">484</span>     * Convenience constructor to use when we cannot flush.<a name="line.484"></a>
+<span class="sourceLineNo">485</span>     * @param result Expecting CANNOT_FLUSH_MEMSTORE_EMPTY or CANNOT_FLUSH.<a name="line.485"></a>
+<span class="sourceLineNo">486</span>     * @param failureReason Reason why we couldn't flush.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>     */<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    FlushResultImpl(Result result, String failureReason, boolean wroteFlushMarker) {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>      this(result, -1, failureReason, wroteFlushMarker);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      assert result == Result.CANNOT_FLUSH_MEMSTORE_EMPTY || result == Result.CANNOT_FLUSH;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    }<a name="line.491"></a>
+<span class="sourceLineNo">492</span><a name="line.492"></a>
+<span class="sourceLineNo">493</span>    /**<a name="line.493"></a>
+<span class="sourceLineNo">494</span>     * Constructor with all the parameters.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>     * @param result Any of the Result.<a name="line.495"></a>
+<span class="sourceLineNo">496</span>     * @param flushSequenceId Generated sequence id if the memstores were flushed else -1.<a name="line.496"></a>
+<span class="sourceLineNo">497</span>     * @param failureReason Reason why we couldn't flush, or null.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>     */<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    FlushResultImpl(Result result, long flushSequenceId, String failureReason,<a name="line.499"></a>
+<span class="sourceLineNo">500</span>      boolean wroteFlushMarker) {<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      this.result = result;<a name="line.501"></a>
+<span class="sourceLineNo">502</span>      this.flushSequenceId = flushSequenceId;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      this.failureReason = failureReason;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      this.wroteFlushWalMarker = wroteFlushMarker;<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    }<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    /**<a name="line.507"></a>
+<span class="sourceLineNo">508</span>     * Convenience method, the equivalent of checking if result is<a name="line.508"></a>
+<span class="sourceLineNo">509</span>     * FLUSHED_NO_COMPACTION_NEEDED or FLUSHED_NO_COMPACTION_NEEDED.<a name="line.509"></a>
+<span class="sourceLineNo">510</span>     * @return true if the memstores were flushed, else false.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>     */<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    @Override<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    public boolean isFlushSucceeded() {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      return result == Result.FLUSHED_NO_COMPACTION_NEEDED || result == Result<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          .FLUSHED_COMPACTION_NEEDED;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    }<a name="line.516"></a>
+<span class="sourceLineNo">517</span><a name="line.517"></a>
+<span class="sourceLineNo">518</span>    /**<a name="line.518"></a>
+<span class="sourceLineNo">519</span>     * Convenience method, the equivalent of checking if result is FLUSHED_COMPACTION_NEEDED.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>     * @return True if the flush requested a compaction, else false (doesn't even mean it flushed).<a name="line.520"></a>
+<span class="sourceLineNo">521</span>     */<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    public boolean isCompactionNeeded() {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      return result == Result.FLUSHED_COMPACTION_NEEDED;<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    @Override<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    public String toString() {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      return new StringBuilder()<a name="line.529"></a>
+<span class="sourceLineNo">530</span>        .append("flush result:").append(result).append(", ")<a name="line.530"></a>
+<span class="sourceLineNo">531</span>        .append("failureReason:").append(failureReason).append(",")<a name="line.531"></a>
+<span class="sourceLineNo">532</span>        .append("flush seq id").append(flushSequenceId).toString();<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    }<a name="line.533"></a>
+<span class="sourceLineNo">534</span><a name="line.534"></a>
+<span class="sourceLineNo">535</span>    @Override<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    public Result getResult() {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      return result;<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    }<a name="line.538"></a>
+<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>  /** A result object from prepare flush cache stage */<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @VisibleForTesting<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  static class PrepareFlushResult {<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    final FlushResultImpl result; // indicating a failure result from prepare<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    final TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs;<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    final TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles;<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    final TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    final long startTime;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    final long flushOpSeqId;<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    final long flushedSeqId;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    final MemStoreSizing totalFlushableSize;<a name="line.551"></a>
+<span class="sourceLineNo">552</span><a name="line.552"></a>
+<span class="sourceLineNo">553</span>    /** Constructs an early exit case */<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    PrepareFlushResult(FlushResultImpl result, long flushSeqId) {<a name="line.554"></a>
+<span class="sourceLineNo">555</span>      this(result, null, null, null, Math.max(0, flushSeqId), 0, 0, MemStoreSizing.DUD);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    }<a name="line.556"></a>
+<span class="sourceLineNo">557</span><a name="line.557"></a>
+<span class="sourceLineNo">558</span>    /** Constructs a successful prepare flush result */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    PrepareFlushResult(<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.560"></a>
+<span class="sourceLineNo">561</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      this(null, storeFlushCtxs, committedFiles, storeFlushableSize, startTime,<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        flushSeqId, flushedSeqId, totalFlushableSize);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    }<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>    private PrepareFlushResult(<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        FlushResultImpl result,<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      TreeMap&lt;byte[], StoreFlushContext&gt; storeFlushCtxs,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>      TreeMap&lt;byte[], List&lt;Path&gt;&gt; committedFiles,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>      TreeMap&lt;byte[], MemStoreSize&gt; storeFlushableSize, long startTime, long flushSeqId,<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      long flushedSeqId, MemStoreSizing totalFlushableSize) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      this.result = result;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      this.storeFlushCtxs = storeFlushCtxs;<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      this.committedFiles = committedFiles;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>      this.storeFlushableSize = storeFlushableSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.startTime = startTime;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>      this.flushOpSeqId = flushSeqId;<a name="line.579"></a>
+<span class="sourceLineNo">580</span>      this.flushedSeqId = flushedSeqId;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      this.totalFlushableSize = totalFlushableSize;<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    }<a name="line.582"></a>
+<span class="sourceLineNo">583</span><a name="line.583"></a>
+<span class="sourceLineNo">584</span>    public FlushResult getResult() {<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      return this.result;<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    }<a name="line.586"></a>
+<span class="sourceLineNo">587</span>  }<a name="line.587"></a>
+<span class="sourceLineNo">588</span><a name="line.588"></a>
+<span class="sourceLineNo">589</span>  /**<a name="line.589"></a>
+<span class="sourceLineNo">590</span>   * A class that tracks exceptions that have been observed in one batch. Not thread safe.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>   */<a name="line.591"></a>
+<span class="sourceLineNo">592</span>  static class ObservedExceptionsInBatch {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    private boolean wrongRegion = false;<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    private boolean failedSanityCheck = false;<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    private boolean wrongFamily = false;<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>    /**<a name="line.597"></a>
+<span class="sourceLineNo">598</span>     * @return If a {@link WrongRegionException} has been observed.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>     */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    boolean hasSeenWrongRegion() {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      return wrongRegion;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    }<a name="line.602"></a>
+<span class="sourceLineNo">603</span><a name="line.603"></a>
+<span class="sourceLineNo">604</span>    /**<a name="line.604"></a>
+<span class="sourceLineNo">605</span>     * Records that a {@link WrongRegionException} has been observed.<a name="line.605"></a>
+<span class="sourceLineNo">606</span>     */<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    void sawWrongRegion() {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>      wrongRegion = true;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>    /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>     * @return If a {@link FailedSanityCheckException} has been observed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>     */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    boolean hasSeenFailedSanityCheck() {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      return failedSanityCheck;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
+<span class="sourceLineNo">617</span><a name="line.617"></a>
+<span class="sourceLineNo">618</span>    /**<a name="line.618"></a>
+<span class="sourceLineNo">619</span>     * Records that a {@link FailedSanityCheckException} has been observed.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>     */<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    void sawFailedSanityCheck() {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>      failedSanityCheck = true;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>    /**<a name="line.625"></a>
+<span class="sourceLineNo">626</span>     * @return If a {@link NoSuchColumnFamilyException} has been observed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>     */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    boolean hasSeenNoSuchFamily() {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      return wrongFamily;<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>    /**<a name="line.632"></a>
+<span class="sourceLineNo">633</span>     * Records that a {@link NoSuchColumnFamilyException} has been observed.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>     */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    void sawNoSuchFamily() {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      wrongFamily = true;<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  final WriteState writestate = new WriteState();<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  long memstoreFlushSize;<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  final long timestampSlop;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  final long rowProcessorTimeout;<a name="line.644"></a>
 <span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  final RegionServerServices rsServices;<a name="line.646"></a>
-<span class="sourceLineNo">647</span>  private RegionServerAccounting rsAccounting;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  private long flushCheckInterval;<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.649"></a>
-<span class="sourceLineNo">650</span>  private long flushPerChanges;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  private long blockingMemStoreSize;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  // Used to guard closes<a name="line.652"></a>
-<span class="sourceLineNo">653</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.653"></a>
-<span class="sourceLineNo">654</span><a name="line.654"></a>
-<span class="sourceLineNo">655</span>  // Stop updates lock<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>  private boolean splitRequest;<a name="line.657"></a>
-<span class="sourceLineNo">658</span>  private byte[] explicitSplitPoint = null;<a name="line.658"></a>
-<span class="sourceLineNo">659</span><a name="line.659"></a>
-<span class="sourceLineNo">660</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  // Coprocessor host<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  private RegionCoprocessorHost coprocessorHost;<a name="line.663"></a>
+<span class="sourceLineNo">646</span>  // Last flush time for each Store. Useful when we are flushing for each column<a name="line.646"></a>
+<span class="sourceLineNo">647</span>  private final ConcurrentMap&lt;HStore, Long&gt; lastStoreFlushTimeMap = new ConcurrentHashMap&lt;&gt;();<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>  final RegionServerServices rsServices;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  private RegionServerAccounting rsAccounting;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>  private long flushCheckInterval;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>  // flushPerChanges is to prevent too many changes in memstore<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  private long flushPerChanges;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  private long blockingMemStoreSize;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>  // Used to guard closes<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>  // Stop updates lock<a name="line.658"></a>
+<span class="sourceLineNo">659</span>  private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock();<a name="line.659"></a>
+<span class="sourceLineNo">660</span>  private boolean splitRequest;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>  private byte[] explicitSplitPoint = null;<a name="line.661"></a>
+<span class="sourceLineNo">662</span><a name="line.662"></a>
+<span class="sourceLineNo">663</span>  private final MultiVersionConcurrencyControl mvcc = new MultiVersionConcurrencyControl();<a name="line.663"></a>
 <span class="sourceLineNo">664</span><a name="line.664"></a>
-<span class="sourceLineNo">665</span>  private TableDescriptor htableDescriptor = null;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  private RegionSplitPolicy splitPolicy;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private FlushPolicy flushPolicy;<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>  private final MetricsRegion metricsRegion;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  private final MetricsRegionWrapperImpl metricsRegionWrapper;<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  private final Durability regionDurability;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  private final boolean regionStatsEnabled;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>  // Stores the replication scope of the various column families of the table<a name="line.673"></a>
-<span class="sourceLineNo">674</span>  // that has non-default scope<a name="line.674"></a>
-<span class="sourceLineNo">675</span>  private final NavigableMap&lt;byte[], Integer&gt; replicationScope = new TreeMap&lt;&gt;(<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      Bytes.BYTES_COMPARATOR);<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  private final StoreHotnessProtector storeHotnessProtector;<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>  /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * HRegion constructor. This constructor should only be used for testing and<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * extensions.  Instances of HRegion should be instantiated with the<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   * {@link HRegion#createHRegion} or {@link HRegion#openHRegion} method.<a name="line.683"></a>
-<span class="sourceLineNo">684</span>   *<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   * @param tableDir qualified path of directory where region should be located,<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   * usually the table directory.<a name="line.686"></a>
-<span class="sourceLineNo">687</span>   * @param wal The WAL is the outbound log for any updates to the HRegion<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   * The wal file is a logfile from the previous execution that's<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * custom-computed for this HRegion. The HRegionServer computes and sorts the<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * appropriate wal info for this HRegion. If there is a previous wal file<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * (implying that the HRegion has been written-to before), then read it from<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * the supplied path.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * @param fs is the filesystem.<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * @param confParam is global configuration settings.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * @param regionInfo - RegionInfo that describes the region<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * is new), then read them from the supplied path.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * @param htd the table descriptor<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * @param rsServices reference to {@link RegionServerServices} or null<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * @deprecated Use other constructors.<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   */<a name="line.700"></a>
-<span class="sourceLineNo">701</span>  @Deprecated<a na

<TRUNCATED>

[36/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
index 807ed6b..3dbdec3 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
@@ -206,392 +206,389 @@
 <span class="sourceLineNo">198</span>      LOG.warn("Snapshot called again without clearing previous. " +<a name="line.198"></a>
 <span class="sourceLineNo">199</span>          "Doing nothing. Another ongoing flush or did we fail last attempt?");<a name="line.199"></a>
 <span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      if (LOG.isDebugEnabled()) {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>        LOG.debug("FLUSHING TO DISK: region "<a name="line.202"></a>
-<span class="sourceLineNo">203</span>            + getRegionServices().getRegionInfo().getRegionNameAsString() + "store: "<a name="line.203"></a>
-<span class="sourceLineNo">204</span>            + getFamilyName());<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      stopCompaction();<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      pushActiveToPipeline(this.active);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      if (compositeSnapshot) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>        pushPipelineToSnapshot();<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      } else {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        pushTailToSnapshot();<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      }<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      compactor.resetStats();<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>  }<a name="line.218"></a>
-<span class="sourceLineNo">219</span><a name="line.219"></a>
-<span class="sourceLineNo">220</span>  /**<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   * On flush, how much memory we will clear.<a name="line.221"></a>
-<span class="sourceLineNo">222</span>   * @return size of data that is going to be flushed<a name="line.222"></a>
-<span class="sourceLineNo">223</span>   */<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  @Override<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  public MemStoreSize getFlushableSize() {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      if (compositeSnapshot) {<a name="line.229"></a>
-<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      } else {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      }<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  }<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>  @Override<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  protected long keySize() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    long k = this.active.keySize();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      k += segment.keySize();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    return k;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  @Override<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  protected long heapSize() {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    long h = this.active.heapSize();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>      h += segment.heapSize();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    return h;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>  @Override<a name="line.260"></a>
-<span class="sourceLineNo">261</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      WAL WAL = getRegionServices().getWAL();<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      if (WAL != null) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    }<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  /**<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * This message intends to inform the MemStore that next coming updates<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   * are going to be part of the replaying edits from WAL<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  @Override<a name="line.277"></a>
-<span class="sourceLineNo">278</span>  public void startReplayingFromWAL() {<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    inWalReplay = true;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
-<span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * are done<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  @Override<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  public void stopReplayingFromWAL() {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    inWalReplay = false;<a name="line.288"></a>
-<span class="sourceLineNo">289</span>  }<a name="line.289"></a>
-<span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>  // the getSegments() method is used for tests only<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  @VisibleForTesting<a name="line.292"></a>
-<span class="sourceLineNo">293</span>  @Override<a name="line.293"></a>
-<span class="sourceLineNo">294</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    list.add(this.active);<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    list.addAll(pipelineList);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.299"></a>
+<span class="sourceLineNo">201</span>      LOG.debug("FLUSHING TO DISK {}, store={}",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName());<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      stopCompaction();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      pushActiveToPipeline(this.active);<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      snapshotId = EnvironmentEdgeManager.currentTime();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      // in both cases whatever is pushed to snapshot is cleared from the pipeline<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      if (compositeSnapshot) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        pushPipelineToSnapshot();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      } else {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>        pushTailToSnapshot();<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      compactor.resetStats();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    return new MemStoreSnapshot(snapshotId, this.snapshot);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>  /**<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   * On flush, how much memory we will clear.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>   * @return size of data that is going to be flushed<a name="line.219"></a>
+<span class="sourceLineNo">220</span>   */<a name="line.220"></a>
+<span class="sourceLineNo">221</span>  @Override<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public MemStoreSize getFlushableSize() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    MemStoreSizing snapshotSizing = getSnapshotSizing();<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    if (snapshotSizing.getDataSize() == 0) {<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // if snapshot is empty the tail of the pipeline (or everything in the memstore) is flushed<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      if (compositeSnapshot) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        snapshotSizing = pipeline.getPipelineSizing();<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        snapshotSizing.incMemStoreSize(active.getMemStoreSize());<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      } else {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>        snapshotSizing = pipeline.getTailSizing();<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    return snapshotSizing.getDataSize() &gt; 0 ? snapshotSizing<a name="line.233"></a>
+<span class="sourceLineNo">234</span>        : new MemStoreSize(active.getMemStoreSize());<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  @Override<a name="line.237"></a>
+<span class="sourceLineNo">238</span>  protected long keySize() {<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    // Need to consider keySize of all segments in pipeline and active<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    long k = this.active.keySize();<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      k += segment.keySize();<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return k;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  @Override<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  protected long heapSize() {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    // Need to consider heapOverhead of all segments in pipeline and active<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    long h = this.active.heapSize();<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    for (Segment segment : this.pipeline.getSegments()) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      h += segment.heapSize();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    }<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return h;<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  @Override<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  public void updateLowestUnflushedSequenceIdInWAL(boolean onlyIfGreater) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    long minSequenceId = pipeline.getMinSequenceId();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    if(minSequenceId != Long.MAX_VALUE) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      byte[] encodedRegionName = getRegionServices().getRegionInfo().getEncodedNameAsBytes();<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      byte[] familyName = getFamilyNameInBytes();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      WAL WAL = getRegionServices().getWAL();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      if (WAL != null) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>        WAL.updateStore(encodedRegionName, familyName, minSequenceId, onlyIfGreater);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    }<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  }<a name="line.268"></a>
+<span class="sourceLineNo">269</span><a name="line.269"></a>
+<span class="sourceLineNo">270</span>  /**<a name="line.270"></a>
+<span class="sourceLineNo">271</span>   * This message intends to inform the MemStore that next coming updates<a name="line.271"></a>
+<span class="sourceLineNo">272</span>   * are going to be part of the replaying edits from WAL<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   */<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void startReplayingFromWAL() {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    inWalReplay = true;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  /**<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   * are done<a name="line.281"></a>
+<span class="sourceLineNo">282</span>   */<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  @Override<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  public void stopReplayingFromWAL() {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    inWalReplay = false;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>  }<a name="line.286"></a>
+<span class="sourceLineNo">287</span><a name="line.287"></a>
+<span class="sourceLineNo">288</span>  // the getSegments() method is used for tests only<a name="line.288"></a>
+<span class="sourceLineNo">289</span>  @VisibleForTesting<a name="line.289"></a>
+<span class="sourceLineNo">290</span>  @Override<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  protected List&lt;Segment&gt; getSegments() {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    List&lt;Segment&gt; list = new ArrayList&lt;&gt;(pipelineList.size() + 2);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    list.add(this.active);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    list.addAll(pipelineList);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    list.addAll(this.snapshot.getAllSegments());<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>    return list;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
 <span class="sourceLineNo">300</span><a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return list;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.304"></a>
-<span class="sourceLineNo">305</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  }<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      boolean merge) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    // last true stands for updating the region size<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  }<a name="line.313"></a>
-<span class="sourceLineNo">314</span><a name="line.314"></a>
-<span class="sourceLineNo">315</span>  /**<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.316"></a>
-<span class="sourceLineNo">317</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   *           The flattening happens only if versions match.<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   */<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  }<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  // setter is used only for testability<a name="line.324"></a>
-<span class="sourceLineNo">325</span>  @VisibleForTesting<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  void setIndexType(IndexType type) {<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    indexType = type;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    // If it is needed, please change in-memory flush size explicitly<a name="line.330"></a>
-<span class="sourceLineNo">331</span>  }<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public IndexType getIndexType() {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    return indexType;<a name="line.334"></a>
-<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>  public boolean hasImmutableSegments() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    return !pipeline.isEmpty();<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    return pipeline.getVersionedList();<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  public long getSmallestReadPoint() {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    return store.getSmallestReadPoint();<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  public HStore getStore() {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    return store;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  }<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>  public String getFamilyName() {<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  }<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  @Override<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  /*<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   */<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    MutableSegment activeTmp = active;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    // The order is the Segment ordinal<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    return list;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span>   @VisibleForTesting<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   }<a name="line.378"></a>
-<span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  /**<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * Check whether anything need to be done based on the current active set size.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   * The method is invoked upon every addition to the active set.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   * size is above threshold<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>  @Override<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  protected void checkActiveSize() {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (shouldFlushInMemory()) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.391"></a>
-<span class="sourceLineNo">392</span>      * in the shared mode. */<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      if (LOG.isTraceEnabled()) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>        LOG.trace(<a name="line.395"></a>
-<span class="sourceLineNo">396</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      }<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      getPool().execute(runnable);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    }<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  // internally used method, externally visible only for tests<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  // otherwise there is a deadlock<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @VisibleForTesting<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  void flushInMemory() throws IOException {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    inMemoryFlushInProgress.set(true);<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      // Phase I: Update the pipeline<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      getRegionServices().blockUpdates();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>      try {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        pushActiveToPipeline(this.active);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>      } finally {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>        getRegionServices().unblockUpdates();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      }<a name="line.418"></a>
-<span class="sourceLineNo">419</span><a name="line.419"></a>
-<span class="sourceLineNo">420</span>      // Used by tests<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (!allowCompaction.get()) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        return;<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      }<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      // Phase II: Compact the pipeline<a name="line.424"></a>
-<span class="sourceLineNo">425</span>      try {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.426"></a>
-<span class="sourceLineNo">427</span>        // compaction is in progress<a name="line.427"></a>
-<span class="sourceLineNo">428</span>        compactor.start();<a name="line.428"></a>
-<span class="sourceLineNo">429</span>      } catch (IOException e) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.430"></a>
-<span class="sourceLineNo">431</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    } finally {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      inMemoryFlushInProgress.set(false);<a name="line.434"></a>
-<span class="sourceLineNo">435</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>  private Segment getLastSegment() {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    Segment localActive = getActive();<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Segment tail = pipeline.getTail();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    return tail == null ? localActive : tail;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  }<a name="line.443"></a>
-<span class="sourceLineNo">444</span><a name="line.444"></a>
-<span class="sourceLineNo">445</span>  private byte[] getFamilyNameInBytes() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>  private ThreadPoolExecutor getPool() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return getRegionServices().getInMemoryCompactionPool();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  @VisibleForTesting<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  protected boolean shouldFlushInMemory() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.456"></a>
-<span class="sourceLineNo">457</span>        return false;     // regardless the size<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      // the insert of the active into the compaction pipeline<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    }<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    return false;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>  /**<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   * The compaction may still happen if the request was sent too late<a name="line.468"></a>
-<span class="sourceLineNo">469</span>   * Non-blocking request<a name="line.469"></a>
-<span class="sourceLineNo">470</span>   */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>  private void stopCompaction() {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    if (inMemoryFlushInProgress.get()) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      compactor.stop();<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    if (!active.isEmpty()) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>      pipeline.pushHead(active);<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      resetActive();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  }<a name="line.482"></a>
-<span class="sourceLineNo">483</span><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  private void pushTailToSnapshot() {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    pipeline.swap(segments,null,false, false);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>  }<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  private void pushPipelineToSnapshot() {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    int iterationsCnt = 0;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    boolean done = false;<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    while (!done) {<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      iterationsCnt++;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      // and the version increase, the chance of it happenning is very low<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      done = pipeline.swap(segments, null, false, false);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      if (iterationsCnt&gt;2) {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        // practically it is impossible that this loop iterates more than two times<a name="line.503"></a>
-<span class="sourceLineNo">504</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.504"></a>
-<span class="sourceLineNo">505</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.505"></a>
-<span class="sourceLineNo">506</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.506"></a>
-<span class="sourceLineNo">507</span>            " while flushing to disk.");<a name="line.507"></a>
-<span class="sourceLineNo">508</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        break;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    }<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    if(segments.isEmpty()) return;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      this.snapshot = segments.get(0);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      return;<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    } else { // create composite snapshot<a name="line.519"></a>
-<span class="sourceLineNo">520</span>      this.snapshot =<a name="line.520"></a>
-<span class="sourceLineNo">521</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>  private RegionServicesForStores getRegionServices() {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    return regionServices;<a name="line.526"></a>
-<span class="sourceLineNo">527</span>  }<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>  /**<a name="line.529"></a>
-<span class="sourceLineNo">530</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  * There is at most one thread per memstore instance.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  * and compacts the pipeline.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  */<a name="line.534"></a>
-<span class="sourceLineNo">535</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    @Override<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    public void run() {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      try {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        flushInMemory();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      } catch (IOException e) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.542"></a>
-<span class="sourceLineNo">543</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.543"></a>
-<span class="sourceLineNo">544</span>            + "store: "+ getFamilyName(), e);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    }<a name="line.546"></a>
-<span class="sourceLineNo">547</span>  }<a name="line.547"></a>
-<span class="sourceLineNo">548</span><a name="line.548"></a>
-<span class="sourceLineNo">549</span>  @VisibleForTesting<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  boolean isMemStoreFlushingInMemory() {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    return inMemoryFlushInProgress.get();<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  }<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>  /**<a name="line.554"></a>
-<span class="sourceLineNo">555</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.555"></a>
-<span class="sourceLineNo">556</span>   *             first.<a name="line.556"></a>
-<span class="sourceLineNo">557</span>   * @return Next row or null if none found.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  Cell getNextRow(final Cell cell) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Cell lowest = null;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    for (Segment segment : segments) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      if (lowest == null) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      } else {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      }<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return lowest;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  @VisibleForTesting<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  long getInmemoryFlushSize() {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    return inmemoryFlushSize;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  }<a name="line.575"></a>
-<span class="sourceLineNo">576</span><a name="line.576"></a>
-<span class="sourceLineNo">577</span>  // debug method<a name="line.577"></a>
-<span class="sourceLineNo">578</span>  public void debug() {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>    String msg = "active size=" + this.active.keySize();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    LOG.debug(msg);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>}<a name="line.586"></a>
+<span class="sourceLineNo">301</span>  // the following three methods allow to manipulate the settings of composite snapshot<a name="line.301"></a>
+<span class="sourceLineNo">302</span>  public void setCompositeSnapshot(boolean useCompositeSnapshot) {<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    this.compositeSnapshot = useCompositeSnapshot;<a name="line.303"></a>
+<span class="sourceLineNo">304</span>  }<a name="line.304"></a>
+<span class="sourceLineNo">305</span><a name="line.305"></a>
+<span class="sourceLineNo">306</span>  public boolean swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result,<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      boolean merge) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // last true stands for updating the region size<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    return pipeline.swap(versionedList, result, !merge, true);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  }<a name="line.310"></a>
+<span class="sourceLineNo">311</span><a name="line.311"></a>
+<span class="sourceLineNo">312</span>  /**<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * @param requesterVersion The caller must hold the VersionedList of the pipeline<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   *           with version taken earlier. This version must be passed as a parameter here.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   *           The flattening happens only if versions match.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public void flattenOneSegment(long requesterVersion,  MemStoreCompactionStrategy.Action action) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    pipeline.flattenOneSegment(requesterVersion, indexType, action);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>  // setter is used only for testability<a name="line.321"></a>
+<span class="sourceLineNo">322</span>  @VisibleForTesting<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  void setIndexType(IndexType type) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    indexType = type;<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    // Because this functionality is for testing only and tests are setting in-memory flush size<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    // according to their need, there is no setting of in-memory flush size, here.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    // If it is needed, please change in-memory flush size explicitly<a name="line.327"></a>
+<span class="sourceLineNo">328</span>  }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public IndexType getIndexType() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    return indexType;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>  public boolean hasImmutableSegments() {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    return !pipeline.isEmpty();<a name="line.335"></a>
+<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public VersionedSegmentsList getImmutableSegments() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return pipeline.getVersionedList();<a name="line.339"></a>
+<span class="sourceLineNo">340</span>  }<a name="line.340"></a>
+<span class="sourceLineNo">341</span><a name="line.341"></a>
+<span class="sourceLineNo">342</span>  public long getSmallestReadPoint() {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    return store.getSmallestReadPoint();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  }<a name="line.344"></a>
+<span class="sourceLineNo">345</span><a name="line.345"></a>
+<span class="sourceLineNo">346</span>  public HStore getStore() {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    return store;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>  public String getFamilyName() {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    return Bytes.toString(getFamilyNameInBytes());<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  @Override<a name="line.354"></a>
+<span class="sourceLineNo">355</span>  /*<a name="line.355"></a>
+<span class="sourceLineNo">356</span>   * Scanners are ordered from 0 (oldest) to newest in increasing order.<a name="line.356"></a>
+<span class="sourceLineNo">357</span>   */<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  public List&lt;KeyValueScanner&gt; getScanners(long readPt) throws IOException {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    MutableSegment activeTmp = active;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    List&lt;? extends Segment&gt; pipelineList = pipeline.getSegments();<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    List&lt;? extends Segment&gt; snapshotList = snapshot.getAllSegments();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    long order = 1L + pipelineList.size() + snapshotList.size();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    // The list of elements in pipeline + the active element + the snapshot segment<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    // The order is the Segment ordinal<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    List&lt;KeyValueScanner&gt; list = createList((int) order);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    order = addToScanners(activeTmp, readPt, order, list);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    order = addToScanners(pipelineList, readPt, order, list);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    addToScanners(snapshotList, readPt, order, list);<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    return list;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>   @VisibleForTesting<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   protected List&lt;KeyValueScanner&gt; createList(int capacity) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>     return new ArrayList&lt;&gt;(capacity);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   }<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   * Check whether anything need to be done based on the current active set size.<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   * The method is invoked upon every addition to the active set.<a name="line.379"></a>
+<span class="sourceLineNo">380</span>   * For CompactingMemStore, flush the active set to the read-only memory if it's<a name="line.380"></a>
+<span class="sourceLineNo">381</span>   * size is above threshold<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
+<span class="sourceLineNo">383</span>  @Override<a name="line.383"></a>
+<span class="sourceLineNo">384</span>  protected void checkActiveSize() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    if (shouldFlushInMemory()) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      /* The thread is dispatched to flush-in-memory. This cannot be done<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      * on the same thread, because for flush-in-memory we require updatesLock<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      * in exclusive mode while this method (checkActiveSize) is invoked holding updatesLock<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      * in the shared mode. */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      InMemoryFlushRunnable runnable = new InMemoryFlushRunnable();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      if (LOG.isTraceEnabled()) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>        LOG.trace(<a name="line.392"></a>
+<span class="sourceLineNo">393</span>          "Dispatching the MemStore in-memory flush for store " + store.getColumnFamilyName());<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      getPool().execute(runnable);<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    }<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  }<a name="line.397"></a>
+<span class="sourceLineNo">398</span><a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // internally used method, externally visible only for tests<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  // when invoked directly from tests it must be verified that the caller doesn't hold updatesLock,<a name="line.400"></a>
+<span class="sourceLineNo">401</span>  // otherwise there is a deadlock<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  @VisibleForTesting<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  void flushInMemory() throws IOException {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    // setting the inMemoryFlushInProgress flag again for the case this method is invoked<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    // directly (only in tests) in the common path setting from true to true is idempotent<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    inMemoryFlushInProgress.set(true);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    try {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      // Phase I: Update the pipeline<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      getRegionServices().blockUpdates();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      try {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        LOG.trace("IN-MEMORY FLUSH: Pushing active segment into compaction pipeline");<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        pushActiveToPipeline(this.active);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>      } finally {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        getRegionServices().unblockUpdates();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      }<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>      // Used by tests<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      if (!allowCompaction.get()) {<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        return;<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      }<a name="line.420"></a>
+<span class="sourceLineNo">421</span>      // Phase II: Compact the pipeline<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      try {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>        // Speculative compaction execution, may be interrupted if flush is forced while<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        // compaction is in progress<a name="line.424"></a>
+<span class="sourceLineNo">425</span>        compactor.start();<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      } catch (IOException e) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>        LOG.warn("Unable to run in-memory compaction on {}/{}; exception={}",<a name="line.427"></a>
+<span class="sourceLineNo">428</span>            getRegionServices().getRegionInfo().getEncodedName(), getFamilyName(), e);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      }<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } finally {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>      inMemoryFlushInProgress.set(false);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      LOG.trace("IN-MEMORY FLUSH: end");<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    }<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  }<a name="line.434"></a>
+<span class="sourceLineNo">435</span><a name="line.435"></a>
+<span class="sourceLineNo">436</span>  private Segment getLastSegment() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    Segment localActive = getActive();<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    Segment tail = pipeline.getTail();<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    return tail == null ? localActive : tail;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>  }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>  private byte[] getFamilyNameInBytes() {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return store.getColumnFamilyDescriptor().getName();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  private ThreadPoolExecutor getPool() {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getRegionServices().getInMemoryCompactionPool();<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>  @VisibleForTesting<a name="line.450"></a>
+<span class="sourceLineNo">451</span>  protected boolean shouldFlushInMemory() {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    if (this.active.keySize() &gt; inmemoryFlushSize) { // size above flush threshold<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (inWalReplay) {  // when replaying edits from WAL there is no need in in-memory flush<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        return false;     // regardless the size<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      // the inMemoryFlushInProgress is CASed to be true here in order to mutual exclude<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // the insert of the active into the compaction pipeline<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      return (inMemoryFlushInProgress.compareAndSet(false,true));<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    return false;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * The request to cancel the compaction asynchronous task (caused by in-memory flush)<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   * The compaction may still happen if the request was sent too late<a name="line.465"></a>
+<span class="sourceLineNo">466</span>   * Non-blocking request<a name="line.466"></a>
+<span class="sourceLineNo">467</span>   */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>  private void stopCompaction() {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    if (inMemoryFlushInProgress.get()) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      compactor.stop();<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
+<span class="sourceLineNo">473</span><a name="line.473"></a>
+<span class="sourceLineNo">474</span>  protected void pushActiveToPipeline(MutableSegment active) {<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    if (!active.isEmpty()) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      pipeline.pushHead(active);<a name="line.476"></a>
+<span class="sourceLineNo">477</span>      resetActive();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    }<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>  private void pushTailToSnapshot() {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    VersionedSegmentsList segments = pipeline.getVersionedTail();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    pushToSnapshot(segments.getStoreSegments());<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    pipeline.swap(segments,null,false, false);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  private void pushPipelineToSnapshot() {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    int iterationsCnt = 0;<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    boolean done = false;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    while (!done) {<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      iterationsCnt++;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      VersionedSegmentsList segments = pipeline.getVersionedList();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>      pushToSnapshot(segments.getStoreSegments());<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      // swap can return false in case the pipeline was updated by ongoing compaction<a name="line.495"></a>
+<span class="sourceLineNo">496</span>      // and the version increase, the chance of it happenning is very low<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      // In Swap: don't close segments (they are in snapshot now) and don't update the region size<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      done = pipeline.swap(segments, null, false, false);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      if (iterationsCnt&gt;2) {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        // practically it is impossible that this loop iterates more than two times<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        // (because the compaction is stopped and none restarts it while in snapshot request),<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        // however stopping here for the case of the infinite loop causing by any error<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        LOG.warn("Multiple unsuccessful attempts to push the compaction pipeline to snapshot," +<a name="line.503"></a>
+<span class="sourceLineNo">504</span>            " while flushing to disk.");<a name="line.504"></a>
+<span class="sourceLineNo">505</span>        this.snapshot = SegmentFactory.instance().createImmutableSegment(getComparator());<a name="line.505"></a>
+<span class="sourceLineNo">506</span>        break;<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      }<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    }<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  }<a name="line.509"></a>
+<span class="sourceLineNo">510</span><a name="line.510"></a>
+<span class="sourceLineNo">511</span>  private void pushToSnapshot(List&lt;ImmutableSegment&gt; segments) {<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    if(segments.isEmpty()) return;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    if(segments.size() == 1 &amp;&amp; !segments.get(0).isEmpty()) {<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      this.snapshot = segments.get(0);<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      return;<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    } else { // create composite snapshot<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      this.snapshot =<a name="line.517"></a>
+<span class="sourceLineNo">518</span>          SegmentFactory.instance().createCompositeImmutableSegment(getComparator(), segments);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
+<span class="sourceLineNo">520</span>  }<a name="line.520"></a>
+<span class="sourceLineNo">521</span><a name="line.521"></a>
+<span class="sourceLineNo">522</span>  private RegionServicesForStores getRegionServices() {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    return regionServices;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>  * The in-memory-flusher thread performs the flush asynchronously.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>  * There is at most one thread per memstore instance.<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  * It takes the updatesLock exclusively, pushes active into the pipeline, releases updatesLock<a name="line.529"></a>
+<span class="sourceLineNo">530</span>  * and compacts the pipeline.<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  */<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  private class InMemoryFlushRunnable implements Runnable {<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    @Override<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    public void run() {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      try {<a name="line.536"></a>
+<span class="sourceLineNo">537</span>        flushInMemory();<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      } catch (IOException e) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        LOG.warn("Unable to run memstore compaction. region "<a name="line.539"></a>
+<span class="sourceLineNo">540</span>            + getRegionServices().getRegionInfo().getRegionNameAsString()<a name="line.540"></a>
+<span class="sourceLineNo">541</span>            + "store: "+ getFamilyName(), e);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>      }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    }<a name="line.543"></a>
+<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>  @VisibleForTesting<a name="line.546"></a>
+<span class="sourceLineNo">547</span>  boolean isMemStoreFlushingInMemory() {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    return inMemoryFlushInProgress.get();<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  }<a name="line.549"></a>
+<span class="sourceLineNo">550</span><a name="line.550"></a>
+<span class="sourceLineNo">551</span>  /**<a name="line.551"></a>
+<span class="sourceLineNo">552</span>   * @param cell Find the row that comes after this one.  If null, we return the<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   *             first.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * @return Next row or null if none found.<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  Cell getNextRow(final Cell cell) {<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    Cell lowest = null;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    List&lt;Segment&gt; segments = getSegments();<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    for (Segment segment : segments) {<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      if (lowest == null) {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>        lowest = getNextRow(cell, segment.getCellSet());<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      } else {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        lowest = getLowest(lowest, getNextRow(cell, segment.getCellSet()));<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    return lowest;<a name="line.566"></a>
+<span class="sourceLineNo">567</span>  }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>  @VisibleForTesting<a name="line.569"></a>
+<span class="sourceLineNo">570</span>  long getInmemoryFlushSize() {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    return inmemoryFlushSize;<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  }<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>  // debug method<a name="line.574"></a>
+<span class="sourceLineNo">575</span>  public void debug() {<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    String msg = "active size=" + this.active.keySize();<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    msg += " in-memory flush size is "+ inmemoryFlushSize;<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    msg += " allow compaction is "+ (allowCompaction.get() ? "true" : "false");<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    msg += " inMemoryFlushInProgress is "+ (inMemoryFlushInProgress.get() ? "true" : "false");<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    LOG.debug(msg);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>}<a name="line.583"></a>
 
 
 


[48/51] [partial] hbase-site git commit: Published site at 8ab7b20f48951d77945181024f5e15842bc253c4.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index f7e51ee..5021e96 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -441,18 +441,18 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html b/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
index 6afe61d..14dfaed 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.77">StateMachineProcedure.Flow</a>
+<pre>public static enum <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.78">StateMachineProcedure.Flow</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&gt;</pre>
 </li>
 </ul>
@@ -210,7 +210,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>HAS_MORE_STATE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.78">HAS_MORE_STATE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.79">HAS_MORE_STATE</a></pre>
 </li>
 </ul>
 <a name="NO_MORE_STATE">
@@ -219,7 +219,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>NO_MORE_STATE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.79">NO_MORE_STATE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.80">NO_MORE_STATE</a></pre>
 </li>
 </ul>
 </li>
@@ -236,7 +236,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.132">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.133">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -256,7 +256,7 @@ for (StateMachineProcedure.Flow c : StateMachineProcedure.Flow.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.132">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html#line.133">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html b/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
index 2ff7230..211b01b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html
@@ -154,7 +154,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <th class="colLast" scope="col">Class and Description</th>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>protected static class&nbsp;</code></td>
+<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a></span></code>&nbsp;</td>
 </tr>
 </table>
@@ -555,7 +555,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>executeFromState</h4>
-<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.88">executeFromState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env,
+<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2">StateMachineProcedure.Flow</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.89">executeFromState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env,
                                                                <a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)
                                                         throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                                                                <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
@@ -582,7 +582,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackState</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.96">rollbackState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env,
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.97">rollbackState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env,
                                       <a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -602,7 +602,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getState</h4>
-<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.104">getState</a>(int&nbsp;stateId)</pre>
+<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.105">getState</a>(int&nbsp;stateId)</pre>
 <div class="block">Convert an ordinal (or state id) to an Enum (or more descriptive) state object.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -620,7 +620,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getStateId</h4>
-<pre>protected abstract&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.111">getStateId</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
+<pre>protected abstract&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.112">getStateId</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
 <div class="block">Convert the Enum (or more descriptive) state object to an ordinal (or state id).</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -636,7 +636,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitialState</h4>
-<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.117">getInitialState</a>()</pre>
+<pre>protected abstract&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.118">getInitialState</a>()</pre>
 <div class="block">Return the initial state object that will be used for the first call to executeFromState().</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -652,7 +652,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>setNextState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.123">setNextState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.124">setNextState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
 <div class="block">Set the next state for the procedure.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -668,7 +668,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>isYieldBeforeExecuteFromState</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.136">isYieldBeforeExecuteFromState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.137">isYieldBeforeExecuteFromState</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env,
                                                 <a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
 <div class="block">By default, the executor will try ro run all the steps of the procedure start to finish.
  Return true to make the executor yield between execution steps to
@@ -688,7 +688,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>addChildProcedure</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.144">addChildProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&gt;...&nbsp;subProcedure)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.145">addChildProcedure</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&gt;...&nbsp;subProcedure)</pre>
 <div class="block">Add a child procedure to execute</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -704,7 +704,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>execute</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.159">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.160">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)
                        throws <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureSuspendedException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureSuspendedException</a>,
                               <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureYieldException.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureYieldException</a>,
                               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -736,7 +736,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>rollback</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.197">rollback</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.198">rollback</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#rollback-TEnvironment-">Procedure</a></code></span></div>
@@ -763,7 +763,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>isEofState</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.209">isEofState</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.210">isEofState</a>()</pre>
 </li>
 </ul>
 <a name="abort-java.lang.Object-">
@@ -774,7 +774,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.214">abort</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.215">abort</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#abort-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">The abort() call is asynchronous and each procedure must decide how to deal
  with it, if they want to be abortable. The simplest implementation
@@ -797,7 +797,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>failIfAborted</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.228">failIfAborted</a>()</pre>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.229">failIfAborted</a>()</pre>
 <div class="block">If procedure has more states then abort it otherwise procedure is finished and abort can be
  ignored.</div>
 </li>
@@ -810,7 +810,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>isRollbackSupported</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.242">isRollbackSupported</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.243">isRollbackSupported</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;state)</pre>
 <div class="block">Used by the default implementation of abort() to know if the current state can be aborted
  and rollback can be triggered.</div>
 </li>
@@ -823,7 +823,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>isYieldAfterExecutionStep</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.247">isYieldAfterExecutionStep</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.248">isYieldAfterExecutionStep</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TEnvironment</a>&nbsp;env)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#isYieldAfterExecutionStep-TEnvironment-">Procedure</a></code></span></div>
 <div class="block">By default, the procedure framework/executor will try to run procedures start to finish.
  Return true to make the executor yield between each execution step to
@@ -845,7 +845,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>hasMoreState</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.251">hasMoreState</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.252">hasMoreState</a>()</pre>
 </li>
 </ul>
 <a name="getCurrentState--">
@@ -854,7 +854,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentState</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.255">getCurrentState</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html" title="type parameter in StateMachineProcedure">TState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.256">getCurrentState</a>()</pre>
 </li>
 </ul>
 <a name="getCurrentStateId--">
@@ -863,7 +863,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentStateId</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.265">getCurrentStateId</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.266">getCurrentStateId</a>()</pre>
 <div class="block">This method is used from test code as it cannot be assumed that state transition will happen
  sequentially. Some procedures may skip steps/ states, some may add intermediate steps in
  future.</div>
@@ -875,7 +875,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>setNextState</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.273">setNextState</a>(int&nbsp;stateId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.274">setNextState</a>(int&nbsp;stateId)</pre>
 <div class="block">Set the next state for the procedure.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -889,7 +889,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>toStringState</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.286">toStringState</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;builder)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.287">toStringState</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/StringBuilder.html?is-external=true" title="class or interface in java.lang">StringBuilder</a>&nbsp;builder)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toStringState-java.lang.StringBuilder-">Procedure</a></code></span></div>
 <div class="block">Called from <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#toString--"><code>Procedure.toString()</code></a> when interpolating <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2"><code>Procedure</code></a> State.
  Allows decorating generic Procedure State with Procedure particulars.</div>
@@ -907,7 +907,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.294">serializeStateData</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.295">serializeStateData</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">The user-level code of the procedure may have some state to
@@ -929,7 +929,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.304">deserializeStateData</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.html#line.305">deserializeStateData</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureStateSerializer.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureStateSerializer</a>&nbsp;serializer)
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">Procedure</a></code></span></div>
 <div class="block">Called on store load to allow the user to decode the previously serialized

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 8807f56..acf32ef 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -212,11 +212,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index bda8bbd..3d89cf0 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -228,12 +228,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
index 31b1c0f..44afa02 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.535">CompactingMemStore.InMemoryFlushRunnable</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.532">CompactingMemStore.InMemoryFlushRunnable</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></pre>
 <div class="block">The in-memory-flusher thread performs the flush asynchronously.
@@ -193,7 +193,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>InMemoryFlushRunnable</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.535">InMemoryFlushRunnable</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.532">InMemoryFlushRunnable</a>()</pre>
 </li>
 </ul>
 </li>
@@ -210,7 +210,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.538">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.InMemoryFlushRunnable.html#line.535">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
index 5d8d3de..2a7cd58 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html
@@ -777,7 +777,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushableSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.225">getFlushableSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.222">getFlushableSize</a>()</pre>
 <div class="block">On flush, how much memory we will clear.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -791,7 +791,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>keySize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.241">keySize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.238">keySize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#keySize--">keySize</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></code></dd>
@@ -806,7 +806,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.251">heapSize</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.248">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#heapSize--">heapSize</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></code></dd>
@@ -822,7 +822,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>updateLowestUnflushedSequenceIdInWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.261">updateLowestUnflushedSequenceIdInWAL</a>(boolean&nbsp;onlyIfGreater)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.258">updateLowestUnflushedSequenceIdInWAL</a>(boolean&nbsp;onlyIfGreater)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#updateLowestUnflushedSequenceIdInWAL-boolean-">AbstractMemStore</a></code></span></div>
 <div class="block">Updates the wal with the lowest sequence id (oldest entry) that is still in memory</div>
 <dl>
@@ -840,7 +840,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>startReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.278">startReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.275">startReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that next coming updates
  are going to be part of the replaying edits from WAL</div>
 </li>
@@ -851,7 +851,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>stopReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.287">stopReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.284">stopReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that the replaying edits from WAL
  are done</div>
 </li>
@@ -862,7 +862,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getSegments</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.294">getSegments</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.291">getSegments</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html#getSegments--">getSegments</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMemStore.html" title="class in org.apache.hadoop.hbase.regionserver">AbstractMemStore</a></code></dd>
@@ -877,7 +877,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompositeSnapshot</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.305">setCompositeSnapshot</a>(boolean&nbsp;useCompositeSnapshot)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.302">setCompositeSnapshot</a>(boolean&nbsp;useCompositeSnapshot)</pre>
 </li>
 </ul>
 <a name="swapCompactedSegments-org.apache.hadoop.hbase.regionserver.VersionedSegmentsList-org.apache.hadoop.hbase.regionserver.ImmutableSegment-boolean-">
@@ -886,7 +886,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>swapCompactedSegments</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.309">swapCompactedSegments</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.306">swapCompactedSegments</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;versionedList,
                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&nbsp;result,
                                      boolean&nbsp;merge)</pre>
 </li>
@@ -897,7 +897,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>flattenOneSegment</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.320">flattenOneSegment</a>(long&nbsp;requesterVersion,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.317">flattenOneSegment</a>(long&nbsp;requesterVersion,
                               <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver">MemStoreCompactionStrategy.Action</a>&nbsp;action)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -913,7 +913,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>setIndexType</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.326">setIndexType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;type)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.323">setIndexType</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;type)</pre>
 </li>
 </ul>
 <a name="getIndexType--">
@@ -922,7 +922,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getIndexType</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.333">getIndexType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver">CompactingMemStore.IndexType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.330">getIndexType</a>()</pre>
 </li>
 </ul>
 <a name="hasImmutableSegments--">
@@ -931,7 +931,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>hasImmutableSegments</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.337">hasImmutableSegments</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.334">hasImmutableSegments</a>()</pre>
 </li>
 </ul>
 <a name="getImmutableSegments--">
@@ -940,7 +940,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getImmutableSegments</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.341">getImmutableSegments</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/VersionedSegmentsList.html" title="class in org.apache.hadoop.hbase.regionserver">VersionedSegmentsList</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.338">getImmutableSegments</a>()</pre>
 </li>
 </ul>
 <a name="getSmallestReadPoint--">
@@ -949,7 +949,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getSmallestReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.345">getSmallestReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.342">getSmallestReadPoint</a>()</pre>
 </li>
 </ul>
 <a name="getStore--">
@@ -958,7 +958,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.349">getStore</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.346">getStore</a>()</pre>
 </li>
 </ul>
 <a name="getFamilyName--">
@@ -967,7 +967,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.353">getFamilyName</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.350">getFamilyName</a>()</pre>
 </li>
 </ul>
 <a name="getScanners-long-">
@@ -976,7 +976,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getScanners</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.361">getScanners</a>(long&nbsp;readPt)
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.358">getScanners</a>(long&nbsp;readPt)
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -993,7 +993,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>createList</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.376">createList</a>(int&nbsp;capacity)</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.373">createList</a>(int&nbsp;capacity)</pre>
 </li>
 </ul>
 <a name="checkActiveSize--">
@@ -1002,7 +1002,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>checkActiveSize</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.387">checkActiveSize</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.384">checkActiveSize</a>()</pre>
 <div class="block">Check whether anything need to be done based on the current active set size.
  The method is invoked upon every addition to the active set.
  For CompactingMemStore, flush the active set to the read-only memory if it's
@@ -1019,7 +1019,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>flushInMemory</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.406">flushInMemory</a>()
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.403">flushInMemory</a>()
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1033,7 +1033,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastSegment</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.439">getLastSegment</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/Segment.html" title="class in org.apache.hadoop.hbase.regionserver">Segment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.436">getLastSegment</a>()</pre>
 </li>
 </ul>
 <a name="getFamilyNameInBytes--">
@@ -1042,7 +1042,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getFamilyNameInBytes</h4>
-<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.445">getFamilyNameInBytes</a>()</pre>
+<pre>private&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.442">getFamilyNameInBytes</a>()</pre>
 </li>
 </ul>
 <a name="getPool--">
@@ -1051,7 +1051,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getPool</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.449">getPool</a>()</pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html?is-external=true" title="class or interface in java.util.concurrent">ThreadPoolExecutor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.446">getPool</a>()</pre>
 </li>
 </ul>
 <a name="shouldFlushInMemory--">
@@ -1060,7 +1060,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldFlushInMemory</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.454">shouldFlushInMemory</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.451">shouldFlushInMemory</a>()</pre>
 </li>
 </ul>
 <a name="stopCompaction--">
@@ -1069,7 +1069,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>stopCompaction</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.471">stopCompaction</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.468">stopCompaction</a>()</pre>
 <div class="block">The request to cancel the compaction asynchronous task (caused by in-memory flush)
  The compaction may still happen if the request was sent too late
  Non-blocking request</div>
@@ -1081,7 +1081,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushActiveToPipeline</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.477">pushActiveToPipeline</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">MutableSegment</a>&nbsp;active)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.474">pushActiveToPipeline</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">MutableSegment</a>&nbsp;active)</pre>
 </li>
 </ul>
 <a name="pushTailToSnapshot--">
@@ -1090,7 +1090,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushTailToSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.484">pushTailToSnapshot</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.481">pushTailToSnapshot</a>()</pre>
 </li>
 </ul>
 <a name="pushPipelineToSnapshot--">
@@ -1099,7 +1099,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushPipelineToSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.491">pushPipelineToSnapshot</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.488">pushPipelineToSnapshot</a>()</pre>
 </li>
 </ul>
 <a name="pushToSnapshot-java.util.List-">
@@ -1108,7 +1108,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>pushToSnapshot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.514">pushToSnapshot</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&gt;&nbsp;segments)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.511">pushToSnapshot</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/ImmutableSegment.html" title="class in org.apache.hadoop.hbase.regionserver">ImmutableSegment</a>&gt;&nbsp;segments)</pre>
 </li>
 </ul>
 <a name="getRegionServices--">
@@ -1117,7 +1117,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServices</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.525">getRegionServices</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionServicesForStores.html" title="class in org.apache.hadoop.hbase.regionserver">RegionServicesForStores</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.522">getRegionServices</a>()</pre>
 </li>
 </ul>
 <a name="isMemStoreFlushingInMemory--">
@@ -1126,7 +1126,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>isMemStoreFlushingInMemory</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.550">isMemStoreFlushingInMemory</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.547">isMemStoreFlushingInMemory</a>()</pre>
 </li>
 </ul>
 <a name="getNextRow-org.apache.hadoop.hbase.Cell-">
@@ -1135,7 +1135,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getNextRow</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.559">getNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.556">getNextRow</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>cell</code> - Find the row that comes after this one.  If null, we return the
@@ -1151,7 +1151,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockList">
 <li class="blockList">
 <h4>getInmemoryFlushSize</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.573">getInmemoryFlushSize</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.570">getInmemoryFlushSize</a>()</pre>
 </li>
 </ul>
 <a name="debug--">
@@ -1160,7 +1160,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/AbstractMem
 <ul class="blockListLast">
 <li class="blockList">
 <h4>debug</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.578">debug</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/CompactingMemStore.html#line.575">debug</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6eb695c8/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
index 670d8ef..1e4deca 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html?is-external=true" title="class or interface in java.lang">@FunctionalInterface</a>
-public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.2992">HRegion.BatchOperation.Visitor</a></pre>
+public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.html#line.3004">HRegion.BatchOperation.Visitor</a></pre>
 <div class="block">Visitor interface for batch operations</div>
 </li>
 </ul>
@@ -155,7 +155,7 @@ public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase
 <ul class="blockListLast">
 <li class="blockList">
 <h4>visit</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html#line.2997">visit</a>(int&nbsp;index)
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.BatchOperation.Visitor.html#line.3009">visit</a>(int&nbsp;index)
        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>